首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >recv()链接消息

recv()链接消息
EN

Stack Overflow用户
提问于 2012-06-12 03:53:47
回答 2查看 100关注 0票数 2

我有一段代码:

代码语言:javascript
复制
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类型的套接字。有人知道如何避免连接消息吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-06-12 04:13:39

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

相关问题- Receiving data in TCP

票数 2
EN

Stack Overflow用户

发布于 2012-06-12 04:12:28

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10986652

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档