我有一段代码:
while(1) {
if(recvfrom(*val, buffer, 1024, MSG_PEEK, NULL, NULL)==-1) {
perror("recv");
exit(1);
} else printf("recv msgpeek\n");
if(*(int*)buffer>5) {
if(recvfrom(*val, buffer, 1024, 0, NULL, NULL)==-1) {
perror("recv");
exit(1);
} else printf("recv\n");
if(*(int*)buffer==6) {
printf("%d\n", *(int*)(buffer+sizeof(int)+30));
printf("%s\n", (char*)buffer+sizeof(int));
}
}
这是客户端程序的一部分。我正在从服务器向此客户端发送消息,我注意到当客户端收到此消息时,它们已连接。我正在使用SOCK_STREAM类型的套接字。有人知道如何避免连接消息吗?
答案 0 :(得分:2)
如果我理解正确,那么您正在从TCP套接字读取数据,并希望获得与从另一端“发送”完全相同的字节数。在这里你的假设是错误的。 TCP套接字是双向流,即它不保留通过它发送的应用程序消息的边界。连接一侧的“写入”可能导致另一侧的多个“读取”,反之,可以一起接收多个“写入”。最后一种情况就是你所看到的。您有责任跟踪消息边界。
相关问题 - Receiving data in TCP。
答案 1 :(得分:0)
如果我理解你的问题就是你发送2个例如消息但你收到一个消息,其中包含发送的两个消息的内容。这是由于TCP用于提高效率的Nagle算法。如果要禁用此算法,请使用TCP_NODELAY
选项。