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

问题描述 投票:0回答:1

我正在使用Winsock在c ++中编写一个服务器-客户端应用程序,用于逐行发送文件,并且在发送大字符串时遇到问题。行大小非常​​大。

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

int result;
char message[200];

while (true)
{
    recv(newSd, (char*)&message, sizeof(message), 0);

    cout << "The Message from client: " << message << ";";
}

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

如何发送未知的大型邮件[[string而不是char message [200];

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

  • 发送实际数据前发送数据长度。接收器首先读取长度,然后读取长度指示的字节数。
  • 发送数据后发送唯一的终止符。确保终止符永远不会出现在数据中。然后,接收者可以读取直到接收到终止符。

您没有在recv()代码中处理任何一个,因此我怀疑您也没有在send()代码中处理任何一个(您未显示)。

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

  • 发送文件大小,例如uint32_tuint64_t(取决于文件的大小),然后发送原始文件字节。
  • 原样发送每个文本行,在每行之后以CRLFbare-LF换行符终止,然后在最后一行之后发送最终终止符。

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

© www.soinside.com 2019 - 2024. All rights reserved.