2016-09-15 57 views
1

我写一个简单的TCP回显客户机服务器的代码我的两个客户端和服务器端的代码是我没有绑定到客户端和服务器,但客户端IP地址的两个不同的地址在同一台机器上运行是不是在客户端IP打印时连接到服务器我改变了地址,但我仍然无法打印地址我没有看到code.Is这是我的os问题或我犯了一些错误。打印时服务器是同一台机器

我的服务器代码:

#include<stdio.h> 
    #include<stdlib.h> 
    #include<sys/socket.h> 
    #include<sys/types.h> 
    #include<string.h> 
    #include<netinet/in.h> 

    #define ERROR -1 
    #define MAX_CLIENTS 10 
    #define MAX_DATA 1024 

    int main(int argc, char *argv[]){ 

     struct sockaddr_in server; 
     struct sockaddr_in client; 

     int sock; 
     int new; 
     int sockaddr_len = sizeof(struct sockaddr_in); 
     int data_len; 
     char data[MAX_DATA+1]; 

     if((sock = socket(AF_INET,SOCK_STREAM,0)) == ERROR){ 

      perror("server socket"); 
      exit(-1); 

     } 

     server.sin_family = AF_INET; 
     server.sin_port = htons(atoi(argv[1])); 
     inet_aton(argv[2],&server.sin_addr.s_addr); 
     bzero(&server.sin_zero,0); 

     if(bind(sock, (struct sockaddr *)&server,sockaddr_len) == ERROR){ 

      perror("bind"); 
      exit(-1); 
     } 

     if(listen(sock, MAX_CLIENTS) == ERROR){ 

      perror("listen"); 
      exit(-1); 
     } 

     while(1){ 

      if((new = accept(sock,(struct sockaddr *)&client,&sockaddr_len)) == ERROR){ 

       perror("accept"); 
       exit(-1); 

      } 

    //ip not getting printed 
      printf("New client connected from port no %d IP %s\n",ntohs(client.sin_port),inet_ntoa(client.sin_addr.s_addr)); 

    data_len = 1; 

    while(data_len){ 

     data_len = recv(new,data,MAX_DATA,0); 

     if(data_len){ 

      send(new, data, data_len,0); 
      data[data_len] = '\0'; 
      printf("Sent message: %s", data); 


     } 

    } 

    printf("Client disconnected\n"); 
    close(new); 

} 
    } 

我的客户端代码:

#include<stdio.h> 
    #include<stdlib.h> 
    #include<sys/socket.h> 
    #include<sys/types.h> 
    #include<string.h> 
    #include<netinet/in.h> 

    #define ERROR -1 
    #define BUFFER 1024 

    int main(int argc, char *argv[]){ 

     struct sockaddr_in remote_server,client; 
     int sock,len; 

     char input[BUFFER]; 
     char output[BUFFER+1]; 


     client.sin_family = AF_INET; 
     client.sin_port = htons(3000); 
     inet_aton("127.0.2.8",&client.sin_addr.s_addr); 
     bzero(&client.sin_zero,0); 

     if((sock = socket(AF_INET,SOCK_STREAM,0)) == ERROR){ 
      perror("socket"); 
      exit(-1); 
     } 

     int size = sizeof(struct sockaddr_in); 

     if(bind(sock, (struct sockaddr *)&client,size) == ERROR){ 

      perror("bind"); 
      exit(-1); 
     } 

     remote_server.sin_family = AF_INET; 
     remote_server.sin_port = htons(atoi(argv[2])); 
     remote_server.sin_addr.s_addr = inet_addr(argv[1]); 
     bzero(&remote_server.sin_zero , 0); 

     if((connect(sock ,(struct sockaddr *)&remote_server , sizeof(struct sockaddr_in))) == ERROR){ 

      perror("connect"); 
      exit(-1); 

     } 

while(1){ 

    fgets(input, BUFFER, stdin); 
    send(sock, input, strlen(input) , 0); 

    len = recv(sock,output,BUFFER,0); 

    output[len] = '\0'; 

    printf("%s\n",output); 

} 

close(sock); 

} 

这是输出: 新的客户端从端口未连接3000和IP

+0

你可以用'getpeername()'在接受套接字作为替代。 – rveerd

+0

端口打印是否正确? – Raman

+1

也许你应该使用_client.sin_addr_而不是_client.sin_addr.s_addr_里面inet_ntoa() – Raman

回答

0

所有你需要首先两个包括客户以及服务器

#include<arpa/inet.h> // for inet_aton(), inet_addr() and inet_ntoa() 
#include<unistd.h> //for close() 

其次,

函数声明为INET_ATON()和INET_NTOA()分别是:

int inet_aton(const char *cp, struct in_addr *inp); 

char *inet_ntoa(struct in_addr in); 

所以,你必须通过整个结构,即xyzaddr.sin_addr代替xyzaddr.sin_addr.s_addr(这是一个int)

因此进行这些变更以及

在服务器:

inet_aton(argv[2],&server.sin_addr.s_addr); - >inet_aton(argv[2],&server.sin_addr);

inet_ntoa(client.sin_addr.s_addr) - >inet_ntoa(client.sin_addr)

在客户端:

inet_aton("127.0.2.8",&client.sin_addr.s_addr); - >inet_aton("127.0.2.8",&client.sin_addr);

相关问题