Linux TCP流中继

Linux TCP流中继,linux,tcp,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的) charbuf[BUFSIZE]; 而(1){ //接收数据包段 如果(m

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

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

但是当我在a和B之间放置继电器时 只要传递字节流,就会出现问题

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

程序C用以下代码将TCP strem从B中继到A。 (这是基于linux的)

charbuf[BUFSIZE];
而(1){
//接收数据包段

如果(my_recv(socket1,buf,BUFSIZE)假设每次读取都会填满缓冲区,则必须使用recv()调用返回的计数作为send()调用的长度参数


my_recv是recv的一个包装器,可以保证它会记录请求大小。但这也意味着它会阻塞直到缓冲区填满,数据中继会停止,直到发生这种情况-这是混乱的,但TCP是无损协议。我认为数据传递可能会延迟,但我不知道为什么会发送损坏的内容。解决了。这是一些愚蠢的错误从其他东西中获得利益。程序没有问题……为了解决这个问题,我编写了我的_recv,它保证recv请求缓冲区的大小。@daehee,但它不能保证。如果传输不是BUFSIZE的倍数呢?这种技术还增加了不必要的延迟。使用上面的两行代码。谢谢……但我有tr我已经这么做了,但结果是一样的…@dahee我恐怕我就是不相信。它为我工作了20多年。问题已经解决了!!我真的很抱歉,这是来自其他地方的一个愚蠢的错误。TCP和中继服务器没有问题。无论如何,谢谢你!
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;
        }
}
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;
}
while ((count = recv(fd, buffer, sizeof buffer, 0)) > 0)
  send(fd, buffer, count, 0);