我使用底部代码在2个客户端之间通过套接字传输文件。
当客户端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 documentation for send中涉及:
如果未发生错误,则send返回已发送的字节总数,该总数可以小于len参数中请求发送的字节数。
关于c++ - recv()/send()(在Socket中)或read()/write()(在CFile中)错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18145255/