-1

TCP/IP と通信する 2 つのプログラムがあります。これはうまくいきます。

プログラム A が TCP ソケットを開きます。プログラム B はこのソケットに接続します。プログラム B はプログラム A にデータを渡します。すべて正常に動作します。

しかし、A と B の間にリレーを配置し、バイト ストリームを渡すだけで問題が発生します。

プログラム C は、2 つの TCP ソケット (socket1、socket2) を開きます。プログラム B は、このソケット (socket1) に接続します。プログラム A は、このソケット (socket2) に接続します。

プログラム C は、次のコードで TCP ストリームを B から 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 をデバッグしました。問題はありません。彼らは正しい順序で送受信しますが、リレーが誤ったデータを与えるようです...

いくつかのアドバイスをいただければ幸いです。

前もって感謝します。

4

1 に答える 1

1

各読み取りでバッファーがいっぱいになると想定しています。send() 呼び出しの長さ引数として、recv() 呼び出しによって返されたカウントを使用する必要があります。

while ((count = recv(fd, buffer, sizeof buffer, 0)) > 0)
  send(fd, buffer, count, 0);
于 2012-11-25T06:00:07.160 に答える