2012-11-25 113 views
-1

我有兩個程序與TCP/IP通信。 這工作正常。TCP流繼電器

程序A打開一個TCP套接字。程序B連接到此套接字。 程序B給程序A提供數據。 一切正常。

但是當我把A和B之間的中繼 ,只是傳遞字節流,出了點問題。

程序C打開兩個TCP套接字(socket1,socket2)。程序B連接到這個套接字(套接字1)。程序A連接到這個套接字(套接字2)。

程序C使用以下代碼從B傳遞TCP到A到A. (這是基於Linux)

char buf[BUFSIZE]; 
while(1){ 
     // recv a packet segment 
     if(my_recv(socket1, buf, BUFSIZE) <= 0){ 
       return 0; 
     } 

     if(send(socket2, buf, BUFSIZE, MSG_NOSIGNAL) != BUFSIZE){ 
      return 0; 
     } 
} 

my_recv爲recv的,以保證它會RECV 請求大小的包裝。

int my_recv(int sd, char* p, unsigned int len){ 
    // recv a packet segment 
    unsigned int ssize=0; 
    int d; 
    while(ssize < len){   
     if((d=recv(sd, p+ssize, len - ssize, 0))<=0){ 
      return -1; 
     } 
     ssize += d;   
    } 
    return ssize; 
} 

這工作正常,第一次。 但幾秒鐘後,一切都搞砸了。

我已經調試程序A和B. 他們沒有錯。 他們發送和recv正確的順序,但它似乎 繼電器提供虛假數據...

一些意見,將不勝感激。

謝謝你提前。

+0

my_recv是recv的包裝,以保證recv請求的大小。 – daehee

+0

但這也意味着它會阻塞,直到緩衝區被填滿,數據中繼將停止,直到發生這種情況 - 這是搞砸 – mvp

+0

但TCP是無損協議。我認爲數據傳遞可能會延遲,但我不知道爲什麼會傳送損壞的內容。 – daehee

回答

1

你假設每個讀取填充緩衝區。您必須使用recv()調用返回的計數作爲send()調用的長度參數。

while ((count = recv(fd, buffer, sizeof buffer, 0)) > 0) 
    send(fd, buffer, count, 0); 
+0

來解決這個問題我編寫了my_recv,它保證recv請求的大小緩衝。 – daehee

+0

@daehee但它不能保證。如果傳輸不是BUFSIZE的倍數,該怎麼辦?該技術也增加了不必要的延遲。使用上面的兩行代碼。 – EJP

+0

謝謝......但我已經試過,但結果是一樣的...... – daehee