2

我有一段代码:

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 类型的套接字。有人知道如何避免连接消息吗?

4

2 回答 2

2

如果我理解正确,您正在从 TCP 套接字读取,并期望获得与从另一端“发送”完全相同的字节数。在这里,您的假设是错误的。TCP 套接字是一个双向流,即它不保留您通过它发送的应用程序消息的边界。连接一侧的“写入”可能导致另一侧的多个“读取”,反之,可以一起接收多个“写入”。最后一种情况就是您所看到的。跟踪消息边界是您的责任。

相关问题 -在 TCP 中接收数据

于 2012-06-11T20:13:38.687 回答
0

如果我理解得很好,您的问题是您发送了 2 条示例消息,但您收到了一条,其中包含发送的两条消息的内容。这是由于 TCP 用于提高效率的 Nagle 算法。如果要禁用此算法,请使用该TCP_NODELAY选项。

于 2012-06-11T20:12:27.693 回答