【发布时间】:2012-04-20 17:18:01
【问题描述】:
我有一个正在接收流式股票报价数据的套接字。但是,我似乎收到了很多被截断的消息,或者似乎是被截断的消息。以下是我接收数据的方式:
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() 循环(可验证有效)?
【问题讨论】:
-
不完全相关,但为什么要通过 TCP 发送刻度数据?这些东西通常是通过 UDP 多播的。
-
我正在接收,而不是发送。他们只是通过电子邮件向我发送了主机名和端口号,我没有收到任何其他技术说明。我刚刚发送了一封电子邮件,询问我是否应该使用 UDP。但是如果我使用 TCP 并且它可以工作(除了我打开主题的部分消息问题)它是否也可以与 UDP 一起工作?即 - 他们发送 UDP,我可以使用 UDP 或 TCP 来接收()?此外,他们确实发送
标头,所以我认为我需要使用它们来检测部分消息,然后当我下一次 recv() 时,偏移到部分消息中以尝试和完成它..谢谢。 -
我没有得到的 UDP 评论 - 如果您使用 UDP,您可能会丢失数据,对吧?
-
是的,UDP 可能会丢失数据。这就是为什么它被用于蜱虫;如果您错过了报价更新,交易所不会等待并重新发送。交换只是多播给每个人,希望你能得到大部分。我很困惑为什么你的市场数据系统会有不同的设置。通常主机和端口是指您拥有 join 的多播 group。