0

我使用底部代码在 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 字节或小于文件的实际大小。有人可以告诉我原因吗?(我英语不好,谢谢你试图理解我在说什么)

4

1 回答 1

1

send不保证发送所有提供的数据,也不recv承诺接收所有可用数据。您必须循环调用它们,随时调整剩余数量,每次检查错误,以确保发送或接收所有内容。

从记忆中 - 这些天我总是把循环放在里面!- 循环并不总是必要的(我相信它取决于各种因素,主要是你无法控制的),所以即使你没有它,你的代码也经常看起来相当可靠地工作。

这在MSDN 文档中涉及到 send

如果没有发生错误,send 返回发送的总字节数,可以小于 len 参数中请求发送的字节数。

于 2013-08-09T21:59:09.553 回答