我使用底部代码在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字节或小于文件的实际大小。 有人可以告诉我原因吗? (我不擅长英语,感谢你试着理解我在说什么)
答案 0 :(得分:1)
send
不保证发送所有提供的数据,recv
也不保证接收所有可用数据。您必须在循环中调用它们,随时调整剩余数量,每次都检查错误,以确保发送或接收所有内容。
从记忆中 - 我总是把这个循环放在这些日子里! - 循环并不总是必要的(我相信它取决于各种因素,主要是你无法控制的),所以你的代码通常看起来工作得相当可靠,即使你没有它。
中提到了这一点如果没有错误发生,send返回发送的总字节数,可以小于len参数中请求发送的数字。