c++ - socket接收到大数据后recv()返回0

标签 c++ sockets send recv

我的服务器需要发送两张大小为500kb的图片给客户端。客户端在没有丢失任何数据的情况下很好地接收到第一张图像,但是当服务器将另一张图像发送给客户端时,recv() 在数据从服务器发送之前返回 0,紧接着服务器 send() 返回 -1 .

这是我的 send() 和 recv() 代码:

服务器:

    fp2 = fopen(totaldir2,"rb");
if(fp1==NULL)
{
    cout<<"ERROR while openning: "<<totaldir2<<endl;
    getchar();
    exit(1);
}

fseek (fp2, 0 , SEEK_END);
IFileSize2 = ftell (fp2);
rewind (fp2);
picture2 = new char[sizeof(char)*IFileSize2+1];
if (picture2 == NULL) {exit (2);}
itoa (IFileSize2,CFileSize2,10);
countData = 0;
do{
sentData = send(sConnect,CFileSize2,strlen(CFileSize2)+1,NULL);
countData+=sentData;
}while(countData<strlen(CFileSize2)+1);
read = fread_s(picture2, IFileSize2, sizeof(char),IFileSize2, fp2);
countData = 0;
do{
sentData = send(sConnect, picture2, read, 0);
countData += sentData ;
}while(countData<read);

此代码运行两次以发送两张图片。

客户:

recv(sConnect, len2, sizeof(len2) ,NULL); \\recv returns 0 here before server sends the data.
FileSize2 = atoi(len2);
picture2 = new char[sizeof(char)*FileSize2+1];
fp2 = fopen("temp\\image2.bin","wb");
if(fp2==NULL)
{
     closesocket(sConnect);
     WSACleanup();
     exit(1);
    }

recv(sConnect, picture2, FileSize2, 0); \\same here
fwrite(picture2, sizeof(char), Received2, fp2);

此代码运行两次以接收两张图片。

当我在服务器中将 Sleep() 放在 send() 之后时,客户端会收到所有数据和所有图像,但 Sleep 取决于客户端网络。服务器获得了很多客户。 该连接与 TCP 一起使用。

最佳答案

recv() 当对方正常断开时返回 0。请记住,TCP 是一个字节流。它没有像 UDP 那样的消息概念。最有可能的是,您的第二张图片存储在您第一次调用 recv() 时使用的同一缓冲区中。您需要将数据框起来,例如在发送文件数据之前发送文件的长度。这样,接收方可以先读取长度,然后只读取与长度相同的字节数。你正在尝试这样做,但你没有很好地管理它。对于初学者,您使用可变长度的字符串来发送文件长度。这不是一个好主意,因为您没有发送字符串长度,并且接收方也没有寻找空终止符,因此接收方不知道字符串有多长并且可能读取了太多字节。您应该将文件长度作为固定长度的 4 字节 int 或 8 字节 __int64 发送。这对于接收者来说会更容易阅读。

关于c++ - socket接收到大数据后recv()返回0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12762491/

相关文章:

c - 用recv()确定数据包大小的最佳方法是什么?

c - 在c中发送外来字符

java - 使用 Spring Boot 2.0 上传文件期间在套接字上读取意外的 EOF

c# - 在 C# 中通过 TcpClient 套接字发送 SSL HTTP 请求

c++ - Tbb 库 : error: no match for call to function when writing custom class function instead of lambda expression

c++ - 在 Mac OS X 上使用 gperftools 的问题

c - 在 TCP 套接字连接期间,连接被对等方重置?

Android - 发送 DatagramSocket 最大缓冲区大小

c++ - 检测图像中矩形的最简单*正确*方法是什么?

c++ - 多维数组迭代效率