2012-04-20 87 views
1

我有一个接收流股票价格数据的套接字。但是,我似乎收到了很多被截断的消息,或者看起来被截断的消息。这里是我正在接收数据:套接字编程问题与recv()接收部分消息

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()环路(即核查的工作)?

+0

不完全相关,但为什么你通过TCP发送刻度数据?这些东西通常是通过UDP进行组播的。 – chrisaycock 2012-04-20 17:26:51

+0

我正在接收,不发送。他们只是给我发了一个主机名和一个端口号,我没有得到任何其他的技术指导。我刚刚发了一封电子邮件询问我是否应该使用UDP。但如果我使用TCP和它的工作原理(除了部分消息问题,我打开主题),它也可以使用UDP?即 - 他们发送UDP,我可以recv()与UDP或TCP?此外,他们发送标题,所以我想我需要使用这些来检测部分消息,然后当我recv()下一次通过,偏移到部分消息,以尝试并完成它.. thx。 – 2012-04-20 18:08:32

+0

UDP的评论我没有得到 - 如果你使用UDP,你可能会丢失数据,对吧? – 2012-04-23 22:21:40

回答

3

你说得对,你需要一个循环。 recv只检索当前可用的数据;一旦读取了任何数据,在返回之前它不会等待更多的数据出现。

manual page“接收的电话通常会返回任何可用的数据,达到请求的数量,而不是等待收到请求的全部金额。”

1

can recv()只能收到发送内容的部分消息?

是的的,如果你使用TCP。我认为这可以帮助你。 Handling partial return from recv() TCP in C

+0

thx链接。从阅读,实际上我收到的消息有标题。例如,。我的recv通常会返回100,最后会被截断。所以,我应该“处理我得到的东西”,并设置下一个recv()以使用偏移量,以便完成最后一个部分消息。不要以为我能一一得到这些,太多的数据。这是BATS的RT feed。 – 2012-04-20 17:42:43

1

TCP不尊重消息边界。这意味着recv()无法保证完全按照您的假设获取完整消息。这就是为什么你需要围绕你的recv()循环。 (这也是为什么像HTTP这样的上层协议要么关闭套接字,要么预先设置一个长度指示器,所以接收者知道何时停止从套接字读取。)

5

我们也可以将标志传递给recv以等待所有的消息已经到达。它在你知道要接收的字节数时起作用。你可以像这样传递命令。

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