如何使用c++在winsock中从客户端向服务器发送大字符串
How send big string in winsock using c++ from client to server
我正在用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_t
或uint64_t
中(取决于文件的大小(,然后发送原始文件字节。 -
按原样单独发送每一行文本,每行后以
CRLF
或bare-LF
换行符终止,然后在最后一行后发送最后一个终止符。
您还忽略了recv()
的返回值,它告诉您实际收到了多少字节。它可以而且通常会返回比请求更少的字节,因此您必须准备好多次调用recv()
(通常是循环调用(才能完全接收数据。与send()
相同。
相关文章:
- 使用 ESP8266/8285 将字符串从 Web 服务器转换为字节数组
- 如何使用c++在winsock中从客户端向服务器发送大字符串
- C++ TCP 服务器比较字符串失败
- 如何在C 服务器中解码卷曲URL编码的字符串
- C 将NTP服务器返回的时间转换为字符串
- 服务器仅从客户端接收null字符串
- 为什么我的android客户端无法接收到来自winsock c++服务器的字符串消息
- 为什么BOOST创建的JSON字符串与我的服务器所需的不同
- 服务器在实现 POST 请求时响应字符串不完整
- 正在比较服务器端收到的字符串-C++
- 将带有 json 字符串的帖子发送到服务器
- Win2003 服务器中多字符串注册表字段中的垃圾字符
- 从服务器响应中解析 UTF8 字符串
- 将字符串发布到 Web 服务器,获取响应
- 如何将可变长度字符串从 RPC 服务器传递到客户端
- C 服务器和 Java 客户端.如何读取完整字符串
- 由于PROTOBUF服务器中的字符串数据类型变量和客户端通过cpp中recv端的套接字进行通信,因此正在获取segfau
- 客户端到服务器发送字符串消息c++
- gsoapweb服务服务器-接受字符串值的方法
- 接收到的CSocket客户端-服务器字符串是中文字符