我有两个程序与TCP/IP通信。这工作正常。
程序 A 打开一个 TCP 套接字。程序 B 连接到此套接字。程序 B 向程序 A 提供数据。一切都很好。
但是当我在 A 和 B 之间放置中继时只是传递字节流,就会出错。
程序C打开两个TCP套接字(套接字1,套接字2)。程序 B 连接到此套接字(套接字 1)。程序 A 连接到此套接字(套接字 2)。
程序 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的包装器,以保证它会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() 调用返回的计数作为 send() 调用的长度参数。
while ((count = recv(fd, buffer, sizeof buffer, 0)) > 0)
send(fd, buffer, count, 0);