作为TCP客户端转发数据

作为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

我有一个客户端从服务器a请求数据(DA),然后我需要将DA发送到第二个服务器B。当数据不大于缓冲区时,我得到了它。但是,以下内容不适用于将所有数据从A传递到B。我注意到,当我在关闭第一个sockfd后创建socket_fwd并连接时,它可以工作。但由于我需要转发所有数据,所以我需要在数据到达后立即处理所有输入

    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'消息问题得到解决,我希望它能够工作。