-1

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

程序 A 打开一个 TCP 套接字。程序 B 连接到这个套接字。程序 B 向程序 A 提供数据。一切正常。

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

程序 C 打开两个 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 的包装器,以保证它会接收请求大小。

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

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

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