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

Don*_*ool 4 c linux

我有一个接收流式股票刻度数据的套接字.但是,我似乎得到了很多截断的消息,或者似乎是截断的消息.以下是我接收数据的方式:

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

可以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;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

Ric*_*dle 6

你是对的,你需要一个循环. recv仅检索当前可用的数据; 一旦读取了任何数据,它就不会等到它返回之前出现更多数据.

手册页说:"在接听电话正常返回的任何数据可用,直到请求的数量,而不是等待接收请求全额的."


Ans*_*man 6

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

numbytes =  recv(sockfd, buf, MAXDATASIZE-1, MSG_WAITALL);
Run Code Online (Sandbox Code Playgroud)