2012-04-20 107 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);