2016-11-16 97 views
0

当我尝试获取客户端IP时,我总是在CentOS中运行程序时获得0.0.0.0,但是当在Ubuntu中运行一些代码时,它将获得正确的IP :127.0.0.1 我不明白这就是为什么。Linux C编程获取客户端IP始终得到0.0.0.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; 
} 

而且两个代码:

#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不是你的局域网IP地址或你的广域网IP地址吗?它是计算机上的环回地址,每台计算机都有该IP地址嵌入在其中,并且保留其用途,因此不能用作向其邻居通告的IP地址。 – ojs

+0

这两个程序运行在同一台PC上,因此请使用环回地址!当他们在CentOS中运行时,会得到0.0.0.0;当他们在Ubnutu中运行时,他们程序可以得到程序两个IP:127.0.0.1这是我的问题:为什么以及如何解决它? –

回答

2

服务器错过了呼叫accept()之前设置addr_lenclient_addr大小。

为了解决这个问题致电accept()前加

addr_len = sizeof client_addr;