高手来帮我看看为什么我的文件发送系统只写前1024个字符?(解决问题后另有200分相送)

ydk8326 2005-05-19 11:13:57
server端(发送端):

typedef struct TUser{
int type; //1 聊天消息 2:屏幕截图 3:单机消息 4:远程注消 5:远程重启
// 6:远程关机 7:登录信息 8:正确登录 9:错误登录,10: 发送文件名 11:通知接收文件
int note; //1:发送文件名和文件大小 2:发送数据 //根据发送的文件大小来判断发送是否完成
char filename[40];
int totalbytes;
char buffer[1024];
}UUser;

void __fastcall TForm1::ServerSocket1ClientRead(TObject *Sender,
TCustomWinSocket *Socket)
{
UUser user;
Socket->ReceiveBuf(&user,sizeof(user));
switch(user.type){

case 11: { //当服务器接收到type=11,note=2时开始发送数据 //文件名和文件大小的数据已////经////////////// Form7里发送出去了
if(user.note==2)
{ //发送文件
int m=suiStringGrid1->Row;
AnsiString addr;
addr=suiStringGrid1->Cells[0][m];
int clientcount=ServerSocket1->Socket->ActiveConnections;
for(int i=0;i<clientcount;i++)
{
if(ServerSocket1->Socket->Connections[i]->RemoteAddress==addr)
{
filestream=new TFileStream(Form7->OpenDialog1->FileName,fmOpenRead);
int totalsize=filestream->Size;
int realsize;
do{
UUser file;
file.type=10;
file.note=2;
realsize=filestream->Read(file.buffer,1024);
ServerSocket1->Socket->Connections[i]->SendBuf(&file,sizeof(file));
Sleep(1);
totalsize-=realsize;
}while(totalsize>0);
delete filestream;
}
}

}
}

}

///////////////////////////////////////////////////////////////////
client(接收端):

void __fastcall TForm1::ClientSocket1Read(TObject *Sender,
TCustomWinSocket *Socket)
{
UUser cmd;
Socket->ReceiveBuf(&cmd,sizeof(cmd));
switch(cmd.type){
case 10:{///当收到type=10,note=1时说明服务器发送过来的是文件名和文件的大小的数据包,这时创建文件,同时发送type=11,note=2通知服务器可以发送数据了
////////当收到tpye=10,note=2时说明服务器发送过来的是数据,开始接收数据
if(cmd.note==1)
{
filestream=new TFileStream(cmd.filename,fmOpenWrite|fmCreate|fmShareExclusive);
filetotalsize=cmd.totalbytes;
UUser file;
file.type=11;
file.note=2;
ClientSocket1->Socket->SendBuf(&file,sizeof(file));
}
if(cmd.note==2)
{
while(receivesize<filetotalsize)
{
filestream->Write(cmd.buffer,sizeof(cmd.buffer));
if(sizeof(cmd.buffer>0))receivesize+=sizeof(cmd.buffer);
if(receivesize>=filetotalsize)break;
Sleep(1);
}
delete filestream;

}

}
}

////////////////////////////////////////////////////

server和client用同样的结构体

现在的问题是:我发送一个一个文件,数据大小正确,我用progressbar来显示进度发现在文件结束的时候都会出现很长的警告:Access violation at address 000000 ,Read of address 00000000

而且要按回车很多次才可以消除
当我发送一个txt文件时,我打开文件发现虽然文件的大小正确了,可内容却是前1024个字符的重复复制


高手帮我解决这个问题,另有200分相送
...全文
135 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
「已注销」 2005-07-18
  • 打赏
  • 举报
回复
学习
JedyWoody 2005-05-20
  • 打赏
  • 举报
回复
sizeof(cmd)是接收缓冲的大小
JedyWoody 2005-05-20
  • 打赏
  • 举报
回复
就是说Socket->ReceiveBuf(&cmd,sizeof(cmd));
接受到的不是sizeof(cmd)的长度,只有函数的返回值才能确定接收到的数据长度
ydk8326 2005-05-20
  • 打赏
  • 举报
回复
返回值是怎么回事?
happyct 2005-05-20
  • 打赏
  • 举报
回复
嗯,同意,现在人气太差了,唉
constantine 2005-05-19
  • 打赏
  • 举报
回复
对,返回值才是真正收到的
铖邑 2005-05-19
  • 打赏
  • 举报
回复
for(int i = 0, j = 0; i < sizeof(cmd); i += j)
{
j = Socket->ReceiveBuf(&cmd + i,sizeof(cmd) - i);
if(j > 0)i += j;
}
copico 2005-05-19
  • 打赏
  • 举报
回复
具体点
铖邑 2005-05-19
  • 打赏
  • 举报
回复
Socket->ReceiveBuf(&cmd,sizeof(cmd));不一定就能将数据收全了,TCP是面向流的,所以要判断这个函数的返回值

1,317

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder 网络及通讯开发
社区管理员
  • 网络及通讯开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧