TCP流中继

时间:2012-11-25 05:57:09

标签: linux tcp

我有两个与TCP / IP通信的程序。 这很好用。

程序A打开TCP套接字。 程序B连接到此套接字。 程序B向程序A提供数据。 一切都很好。

但是当我在A和B之间放置一个继电器时 并且只是传递字节流,出了点问题。

程序C打开两个TCP套接字(socket1,socket2)。 程序B连接到此套接字(socket1)。 程序A连接到此套接字(socket2)。

程序C使用以下代码将TCP strem从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的包装器,以保证它将被恢复 请求大小。

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. 他们没有错。 他们以正确的顺序发送和接收,但似乎 那个中继提供了错误的数据...

一些建议将不胜感激。

提前谢谢。

1 个答案:

答案 0 :(得分:1)

您假设每次读取都填充缓冲区。您必须使用recv()调用返回的计数作为send()调用的长度参数。

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