如何处理Perl TCP套接字中的消息碎片
How to deal with message fragmentation in Perl TCP socket?
我有一个Perl客户端和c++服务器之间的套接字通信。
Perl代码: if (!socket(SERVER, AF_INET, SOCK_STREAM, getprotobyname('tcp'))) {
die "Can't allocate socketn";
} elsif (!connect(SERVER,sockaddr_in($PORT, $tcp_addr))) {
die "Can't connect to server at $tcp_addr port $PORT...n";
}
SERVER -> autoflush(1);
print SERVER "$line";
如果$line
太长,它将被分割,并且在c++服务器端,我必须多次调用recv
(甚至不知道实际预期的长度!)。
最好的处理方法是什么?
我想到了一些方法:
- 也许有一些Perl模块处理它?
- 也许我可以关闭分片,但这不会导致更多的传输失败吗?
- 我可以在发送的消息中添加消息长度,然后调用
recv
,直到我收到整个消息,但这不是很难看吗? - 还有吗?
最好的解决方案是什么?
将消息长度以4字节的头添加到消息中。这并不难看,但就像"专业人士"那样做。TCP/IP是一个面向流的协议。你很幸运能在一次回传中收到你的信息。可以获得任意数量的字节,只有半个消息,一个半消息等,因为tcp/ip正在传输连续的字节流,而在该级别没有任何数据包的概念。
这样做的好处是,您可以在用户空间中缓冲消息,并且可以在该缓冲区中读取尽可能多的字节,并且从该缓冲区中处理多个消息,而不是重复调用recv()
最好的解决方案是一直调用'recv',直到获得完整的消息。如果需要确定何时拥有完整的消息,可以在消息前加上其长度,或者在消息后加上终止符。我不知道你为什么认为这很丑。
相关文章:
- 非更新套接字消息
- 如何在C++中创建特定大小的消息以通过UDP套接字发送?
- 发送和十六进制消息时套接字代码C++问题
- 如何使用阻止套接字 API 添加消息发送操作 (smtp) 的进度?
- 当我使用套接字代码发送第二条消息时,我有一个"sendto() Invalid argument"
- 多线程套接字编程服务器仅从 1 个客户端线程获取消息
- C# UDP 套接字无法接收消息
- 套接字记录未读取任何消息
- 通过套接字C++从设备接收消息
- Datagram套接字服务器未从客户端接收消息
- C/C++ 中的套接字编程 - 接收由 typedef 结构定义的消息
- 如何正确读取套接字消息(C++)
- 套接字消息头构建
- 套接字Java到C++-消息的长度总是8192个字符
- 如何使用套接字实现服务器客户端编程,在套接字中服务器向客户端发送消息而不从客户端获取请求
- C++中的多线程,从套接字接收消息
- C++套接字接收混合消息
- C++套接字客户端/服务器简单消息发送器
- 如何在套接字编程中发送长度大于缓冲区的消息
- 如何读取套接字消息