c - recv() 接收部分消息的套接字编程问题

标签 c linux

我有一个正在接收流式股票报价数据的套接字。但是,我似乎收到了很多截断的消息,或者看起来像是截断的消息。这是我接收数据的方式:

if((numbytes = recv(sockfd, buf, MAXDATASIZE-1, 0)) == -1) {
    perror("recv()");
    exit(1);
}
else {
    buf[numbytes] = '\0';
    // Process data
}

recv() 能否仅接收已发送内容的部分消息?

我的感觉是我可能需要围绕接收的 recv() 调用进行另一个循环,直到发送完整的消息。我知道我有一个 libcurl 实现(我认为不可能在这里使用 libcurl)有一个外循环:

// Read the response (sum total bytes read in tot_bytes)
for(tot_bytes=0; ; tot_bytes += iolen)
{  
    wait_on_socket(sockfd, 1, 60000L);
    res = curl_easy_recv(curl, buf + tot_bytes, sizeof_buf - tot_bytes, &iolen);

    if(CURLE_OK != res) {
        // printf( "## %d", res );
        break;
    }
}

我是否需要类似于 libcurl 示例的 recv() 循环(可验证有效)?

最佳答案

我们还可以将标志传递给recv 以等待所有消息到达。当您知道要接收的字节数时,它会起作用。您可以像这样传递命令。

numbytes =  recv(sockfd, buf, MAXDATASIZE-1, MSG_WAITALL);

关于c - recv() 接收部分消息的套接字编程问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10250666/

相关文章:

c++ - float 减法问题

c - 在 main 中获取 __attribute__ ((constructor)) 函数的值

c++ - FreeTDS 的替代品?

linux - TCP:已连接的套接字已被内核重置?

linux - 组合 SED 命令

c++ - Google Filament渲染引擎分割错误

c - 需要帮助从 ltp 测试套件文件 tst_res.c 理解这个宏

c++ - 在 C 中模拟 std::bind

linux - 为什么程序头段虚拟地址是0x40004000?

php 在一台机器上解析失败,但在另一台机器上解析失败