我使用底部代码在两个客户端之间通过套接字传输文件。当客户端A想要向客户端B发送文件时,它将该文件发送到服务器,在服务器接收到该文件后,它将文件发送到客户端B。
我的代码用于读取然后发送文件:
CFile f;
BOOL p=f.Open(fname,CFile::modeRead);
char buff[1024];
int y;
int x;
if(!p)
//print error msg
while(true)
{
y=f.Read(buff,1024);
x=send(s,buff,y,0);
if(y<1024)
{
f.Close();
break;
}
}
send(s, "SENT|",6,0);
我的代码用于接收然后写入文件:
f.Open(fname,CFile::modeCreate | CFile::modeWrite);
while(true)
{
z=recv(sRecSocket,buff,512,0);
if(z==SOCKET_ERROR)
{
break;
}
if(strncmp(buff,"SENT|",5)==0)
break;
f.Write(buff,z);
}
f.Close();
send(sRecSocket,"RECV|",6,0);
但当我运行我的项目时,有时它运行得很好,文件被完全发送到客户端B,但有时没有,文件被发送到客户端B,但大小是0字节或小于文件的实际大小。有人能告诉我原因吗?(我英语不好,谢谢你试着理解我在说什么)
send
不保证发送所有提供的数据,recv
也不承诺接收所有可用的数据。你必须循环调用它们,边走边调整剩余的数量,每次都检查错误,以确保所有内容都被发送或接收。
从记忆中——这些天我总是把循环放进去!-循环并不总是必要的(我相信这取决于各种因素,大多超出了你的控制范围),所以即使你没有它,你的代码也经常看起来相当可靠
这一点在MSDN文档中有所提及,用于发送:
如果没有发生错误,send将返回发送的字节总数,该总数可以小于len参数中请求发送的字节数。