如何使用c++在winsock中从客户端向服务器发送大字符串



我正在用c++中的Winsock编写一个服务器客户端应用程序,用于逐行发送文件,但我在发送巨大字符串时遇到了问题。线路尺寸非常大。

为了通过服务器从客户端获取消息,我使用以下代码。

int result;
char message[200];
while (true)
{
recv(newSd, (char*)&message, sizeof(message), 0);
cout << "The Message from client: " << message << ";";
}

如果我发送的消息长度很短,上面的代码就可以正常工作。但是,我想要的是在一个文件中发送一个未知大小的行。

如何发送一个大的未知字符串而不是字符消息[200]

TCP是一个字节流,它对消息或行之类的东西一无所知。当您通过TCP发送数据时,它所知道的只是原始字节,而不是字节所代表的内容。您有责任在TCP之上实现一个消息传递协议,以某种有意义的方式对数据进行定界,这样接收方就可以知道数据何时完成。有两种方法可以做到这一点:

  • 在发送实际数据之前先发送数据长度。接收器先读取长度,然后读取长度所说的字节数。

  • 在发送数据后发送一个唯一的终止符。确保终止符永远不会出现在数据中。接收器然后可以进行读取,直到接收到终止符为止。

您在recv()代码中没有处理其中任何一个,所以我怀疑您在send()代码中也没有处理其中任意一个(您没有显示(。

由于您正在发送文本文件,您可以:

  • 发送文件大小,例如在uint32_tuint64_t中(取决于文件的大小(,然后发送原始文件字节。

  • 按原样单独发送每一行文本,每行后以CRLFbare-LF换行符终止,然后在最后一行后发送最后一个终止符。

您还忽略了recv()的返回值,它告诉您实际收到了多少字节。它可以而且通常会返回比请求更少的字节,因此您必须准备好多次调用recv()(通常是循环调用(才能完全接收数据。与send()相同。

最新更新