2016-09-15 56 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);

相關問題