我使用底部代码在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/

10-13 08:34