C++ recv()/send()(在套接字中)或read()/write()(在CFile中)中出错

C++ recv()/send()(在套接字中)或read()/write()(在CFile中)中出错,c++,sockets,winapi,cfile,C++,Sockets,Winapi,Cfile,我使用底部代码在两个客户端之间通过套接字传输文件。 当客户机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

我使用底部代码在两个客户端之间通过套接字传输文件。 当客户机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);
但是当我运行我的项目时,有时它工作得很好,文件被完全发送到客户机B,但有时不发送,文件被发送到客户机B,但大小为0字节或小于文件的实际大小。 谁能告诉我原因吗?
(我英语不好,谢谢你试着理解我说的话)

发送
并不保证发送所有提供的数据,也不保证接收所有可用的数据。你必须在一个循环中调用它们,调整剩余的数量,每次都检查错误,以确保发送或接收所有内容

从记忆中——这些天我一直在循环循环并不总是必要的(我相信它取决于各种因素,大部分是您无法控制的),因此您的代码通常可以相当可靠地工作,即使您没有使用它

这在以下章节中有所涉及:

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


在尝试发送任何内容之前,您可能需要确保
y
大于零。此外,我建议使用包含数据值长度的数据包前导。如前所述,发送1024字节块,接收512字节块,但一旦发送文件数据(大小任意),发送的
可以位于任意位置。因此,在512字节的边界上查找它可能不起作用。这是正确的!非常感谢你!
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);