c++ - recv()/send()(在 Socket 中)或 read()/write()(在 CFile 中)错误

标签 c++ sockets winapi cfile

我使用底部代码在 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 中有所涉及:

If no error occurs, send returns the total number of bytes sent, which can be less than the number requested to be sent in the len parameter.

关于c++ - recv()/send()(在 Socket 中)或 read()/write()(在 CFile 中)错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18145255/

相关文章:

c++ - 填充色和背景色的区别

java - 我将哪种类型的数组发送给构造函数?

winapi - 使用winapi从scancode获取char的问题

c++ - 具有多个客户端的服务器 - 使用 select() 编写

c++ - 为什么这种类型的删除实现(简化提升 :any) gives segmentation fault?

node.js - 通过多进程将套接字存储在Node.js中

node.js - 如何使用 node.js net.Socket 启动 PostgreSQL 消息流协议(protocol)

c++ - 通过注入(inject)绘制到桌面

c++ - 是否需要在noexcept运算符中进行std::decay?

c++ - 为什么我的 if 语句会出现段错误?