2016-11-16 5 views
0

私はクライアントIPを取得しようとすると、CentOSで動作しているときに常に0.0.0.0を取得しますが、Ubuntuで実行中のコードでは、 :127.0.0.1 その理由はわかりません。クライアントIPを取得するためのLinuxプログラミングは常に0.03.0を取得

私の英語を赦免してください。ここで

コードです:

#include <stdio.h> 
#include <sys/types.h>   /* See NOTES */ 
#include <sys/socket.h> 
#include <netinet/in.h> 
#include <arpa/inet.h> 
//#include <netinet/ip.h> /* superset of previous */ 
#define BUF_LEN 1024 


int main(int argc, char const *argv[]) 
{ 
    int sockfd=0; 
    int bind_ret=0; 
    int listen_ret=0; 
    int accept_ret=0; 
    int read_ret=0; 
    int write_ret=0; 
    socklen_t addr_len=0; 

    char buf[BUF_LEN+1]={0}; 

    struct sockaddr_in client_addr; 
    struct sockaddr_in ser_addr ={ 
         .sin_family= AF_INET,/* address family: AF_INET */ 
         .sin_port=htons(8888), /* port in network byte order */ 
         .sin_addr.s_addr=inet_addr("127.0.0.1"), /* internet address */ 
         }; 
//////////////////socket////////////////////////////////// 
    sockfd=socket(AF_INET ,SOCK_STREAM,0); 
    if (0>sockfd){ 
     perror("socket"); 
     return -1; 
    } 
////////////////////bind///////////////////////////////// 
    bind_ret=bind(sockfd, (const struct sockaddr *)&ser_addr,sizeof(ser_addr)); 
    if(0>bind_ret){ 
     perror("bind"); 
     return -1; 
    } 
//////////////////listen////////////////////////////////// 
    listen_ret=listen(sockfd,10); 
    if(0>listen_ret){ 
     perror("listen"); 
     return -1; 
    } 
//////////////////accept////////////////////////////////// 
    accept_ret=accept(sockfd,(struct sockaddr *)&client_addr,&addr_len); 
    if(0>accept_ret){ 
     perror("accept"); 
     return -1; 
    } 
//////////////////operation_data/////////////////////////////// 
    while(read_ret=read(accept_ret,buf,1024)){  //read data,until no data or error 
     if(read_ret<0) { 
      perror("Socket read failed"); 
      return -5; 
     } 

     printf("receive:%s\n", buf); 
     write_ret=write(accept_ret,buf,read_ret); 
     if(write_ret!=read_ret){ 
      perror("write"); 
      return -1; 
     } 
    } 
    //char *inet_ntoa(client_addr.sin_addr); 
    char * ip_add =inet_ntoa(client_addr.sin_addr); 
    int port=client_addr.sin_port; 

    printf("IP:%s PORT:%d\n", ip_add,port); 
    close(client_addr); 
    close(sockfd); 
    return 0; 
} 

とコード2:

#include <stdio.h> 
#include <sys/types.h>   /* See NOTES */ 
#include <sys/socket.h> 
#include <netinet/in.h> 
#include <arpa/inet.h> 
#define BUF_LEN 1024 

int main(int argc,char const **argv){ 
    int sockfd=0; 
    int all_ret=0; 
    socklen_t addr_len=0; 

    char buf[BUF_LEN+1]={0}; 


    struct sockaddr_in addr={ 
         .sin_family=AF_INET,/* address family: AF_INET */ 
         .sin_port=htons(8888), /* port in network byte order */ 
         .sin_addr.s_addr=inet_addr("127.0.0.1"), /* internet address */ 
         }; 
    char * ip_add =inet_ntoa(addr.sin_addr); 
    printf("IP:%s \n", ip_add); 
//////////////////socket////////////////////////////////// 
    sockfd=socket(AF_INET ,SOCK_STREAM,0); 
    if (0>sockfd){ 
     perror("socket"); 
     return -1; 
    } 
//////////////////connection////////////////////////////////// 
    // int connect(int sockfd, const struct sockaddr *addr,socklen_t addrlen); 
    addr_len=sizeof(addr); 
    all_ret=connect(sockfd, (const struct sockaddr *)&addr,addr_len); 
    if (0>all_ret){ 
     perror("connect"); 
     return -1; 
    } 
//////////////////data send////////////////////////////////// 
    all_ret=write(sockfd,"test_by_kevin",14); 
    if (0>all_ret){ 
     perror("write"); 
     return -1; 
    } 
    printf("write:%d\n",all_ret); 
//////////////////data receive////////////////////////////////// 
    all_ret=read(sockfd,buf,1024); 
    if(all_ret<0){ 
     perror("Socket read failed"); 
     return -1; 
    } 
    printf("%s\n",buf); 

    close(sockfd); 


} 
+0

127.0.0.1があなたのLAN IPアドレスまたはWAN IPアドレスではないことに気が付きましたか?それはあなたのコンピュータ上のループバックアドレスであり、すべての単一のコンピュータはそれらに埋め込まれたそのIPアドレスを持っていて、その使用のために予約されているので、そのIPアドレスとして近隣に広告することはできません。 – ojs

+0

この2つのプログラムは同じPCで動作しているので、ループバックアドレスを使用してください!彼らはCentOSで動作しているとき0.0.0.0を取得します;彼らはUbnutuで動作するとき、彼らはプログラムが2つのIPを取得することができます:127.0.0.1それは私の質問です:それを修正する理由と方法? –

答えて

2

サーバはaccept()への呼び出しの前にclient_addrの大きさにaddr_lenを設定するミスが。これはaccept()を呼び出す前に

addr_len = sizeof client_addr; 

を追加する修正するには

関連する問題