作为TCP客户端转发数据
我有一个客户端从服务器a请求数据(DA),然后我需要将DA发送到第二个服务器B。当数据不大于缓冲区时,我得到了它。但是,以下内容不适用于将所有数据从A传递到B。我注意到,当我在关闭第一个sockfd后创建socket_fwd并连接时,它可以工作。但由于我需要转发所有数据,所以我需要在数据到达后立即处理所有输入作为TCP客户端转发数据,c,sockets,tcp,tcpclient,C,Sockets,Tcp,Tcpclient,我有一个客户端从服务器a请求数据(DA),然后我需要将DA发送到第二个服务器B。当数据不大于缓冲区时,我得到了它。但是,以下内容不适用于将所有数据从A传递到B。我注意到,当我在关闭第一个sockfd后创建socket_fwd并连接时,它可以工作。但由于我需要转发所有数据,所以我需要在数据到达后立即处理所有输入 int sockfd, sockfd_fwd, n, n_fwd; gint BUFFER=900; char buf[BUFFER]; char* add
int sockfd, sockfd_fwd, n, n_fwd;
gint BUFFER=900;
char buf[BUFFER];
char* addr = "11.0.0.20"; //Server A listening on port 80
struct sockaddr_in server_addr = {0};
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(80);
char chunk[BUFFER];
gint nfw;
gint total_recv = 0;
gint total_fwd = 0;
struct sockaddr_in server_addr2 = {0};
server_addr2.sin_port = htons(5555);
server_addr2.sin_family = AF_INET;
char *addr2 = "127.0.0.1"; //Server B listening on port 555
//#################Request data from A:80 ###########################
if(inet_pton(AF_INET, addr, &server_addr.sin_addr) != 1){
perror("inet_pton");
return -1;
}
sockfd = socket(AF_INET, (SOCK_STREAM), 0); //socket with server A
if (connect(sockfd, (struct sockaddr*)&server_addr, sizeof(server_addr)) < 0)
mylog(G_LOG_LEVEL_MESSAGE, __FUNCTION__,"Error on connect");
send(sockfd, buffer, strlen(buffer), 0); //Buffer contains something like get xx Kib to the server
bzero(buffer, BUFFER);
if(inet_pton(AF_INET, addr2, &server_addr2.sin_addr) != 1){
mylog(G_LOG_LEVEL_MESSAGE, __FUNCTION__,"Error inet pton");
return -1;
}
if(inet_pton(AF_INET, addr2, &server_addr2.sin_addr) != 1){
perror("inet_pton");
return -1;
}
sockfd_fwd = socket(AF_INET, (SOCK_STREAM), 0); //socket with server B
if (connect(sockfd_fwd, (struct sockaddr*)&server_addr2, sizeof(server_addr2)) < 0)
mylog(G_LOG_LEVEL_MESSAGE, __FUNCTION__,"Error on connect");
while ((n = recv(sockfd, chunk, BUFFER, 0)) > 0) {
total_recv += n;
mylog(G_LOG_LEVEL_MESSAGE, __FUNCTION__,"Recv chunk %s num-bytes:%i",chunk,total_recv);
nfw = send(sockfd_fwd, chunk ,n, 0);
memset(chunk,0,BUFFER);
}
close(sockfd);
close(sockfd_fwd);
int sockfd,sockfd_-fwd,n,n_-fwd;
gint缓冲区=900;
字符buf[缓冲区];
char*addr=“11.0.0.20”//服务器A正在侦听端口80
服务器中的结构sockaddr\u\u addr={0};
服务器地址sin家庭=AF网络;
服务器地址sin端口=htons(80);
字符块[缓冲区];
gint nfw;
gint total_recv=0;
总基特值=0;
服务器中的结构sockaddr\u\u addr2={0};
服务器地址2.sin\u端口=htons(5555);
服务器地址2.sin\u family=AF\u INET;
char*addr2=“127.0.0.1”//服务器B在端口555上侦听
//#################从A:80请求数据###########################
if(inet\u pton(AF\u inet、addr和server\u addr.sin\u addr)!=1){
perror(“inet_pton”);
返回-1;
}
sockfd=socket(AF_INET,(SOCK_流),0)//带服务器A的套接字
if(connect(sockfd,(struct sockaddr*)和server_addr,sizeof(server_addr))<0)
mylog(G_日志_级别_消息,_函数_uuu,“连接错误”);
发送(sockfd,buffer,strlen(buffer),0)//缓冲区包含类似于get xx Kib到服务器的内容
bzero(缓冲器,缓冲器);
if(inet\u pton(AF\u inet、addr2和server\u addr2.sin\u addr)!=1){
mylog(G_日志_级别_消息,_函数,_uu,“错误inet pton”);
返回-1;
}
if(inet\u pton(AF\u inet、addr2和server\u addr2.sin\u addr)!=1){
perror(“inet_pton”);
返回-1;
}
sockfd_fwd=套接字(AF_INET,(SOCK_流),0)//带服务器B的套接字
if(connect(sockfd_-fwd,(struct sockaddr*)和server_-addr2,sizeof(server_-addr2))<0)
mylog(G_日志_级别_消息,_函数_uuu,“连接错误”);
而((n=recv(sockfd,chunk,BUFFER,0))>0){
总_recv+=n;
mylog(G_日志_级别_消息,_函数,,“Recv chunk%s num bytes:%i”,chunk,total_Recv);
nfw=发送(sockfd_-fwd,块,n,0);
memset(块,0,缓冲区);
}
关闭(sockfd);
关闭(左前);
如果您接收[BUFFER]字节,则“chunk”不保证以NUL终止,myLog(…%s.)可能会失败。请清除“%s”缓冲区转储(即使您读取缓冲区的大小不足或过大,以确保最后有NUL,对于嵌入NUL的常规二进制数据,该转储仍无法正常工作。),然后您就可以删除几乎无用的memset调用了。@MartinJames是的,我的“%s”只是为了了解发生了什么,但我将删除它。问题更倾向于知道套接字是否被很好地使用了“send(sockfd,buffer,strlen(buffer),0);”假设您将“buffer”加载到某个地方,或者它是一个常量字符串。对等方如何知道它已收到所有消息?您不发送终止NUL,并且您的注释也不建议任何其他行终止字符,“知道套接字是否使用良好”在我看来没问题-在recv()返回指示错误或对等关闭之前,您在循环中接收'n'字节并发送'n'字节:假设您的'command'消息问题得到解决,我希望它能够工作。