Igo*_*Oks 2 c++ sockets perl tcp communication
我在Perl客户端和C++服务器之间有套接字通信.
Perl代码:
if (!socket(SERVER, AF_INET, SOCK_STREAM, getprotobyname('tcp'))) {
die "Can't allocate socket\n";
} 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";
Run Code Online (Sandbox Code Playgroud)
如果$line太长了,它就会碎片化,而在C++服务器端我必须recv多次调用(甚至不知道实际的预期长度!).
处理它的最佳方法是什么?
我想到了一些方法:
recv直到收到整条消息,但这不是很难看吗?最好的解决方案是什么?
将消息长度添加为消息的4字节标头.这并不难看,但正如"专业人士"所做的那样.TCP/IP是面向流的协议.你很幸运,你在一次电话会议中得到了你的消息.有可能获得任意数量的字节,只有一半的消息,一个半的消息等,因为tcp/ip正在传输连续的字节流,而没有该级别的任何数据包概念.
好的一面是你可以在用户空间中缓冲你的消息,并且可以将所需的字节读取到该缓冲区中,并且该缓冲区中的多个消息的进程不再重复调用recv()
| 归档时间: |
|
| 查看次数: |
739 次 |
| 最近记录: |