【问题标题】:Linux C programming to get Client IP always get 0.0.0.0获取客户端 IP 的 Linux C 编程始终获取 0.0.0.0
【发布时间】:2016-11-16 11:30:29
【问题描述】:

当我尝试获取客户端 IP 时,程序在 CentOS 中运行时总是得到 0.0.0.0,但是当某些代码在 Ubuntu 中运行时,它会得到正确的 IP:127.0.0.1 我不明白这就是为什么。

请原谅我的英语。

这里是代码一:

#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);


}

【问题讨论】:

  • 您确实意识到 127.0.0.1 不是您的 LAN ip 地址或 WAN ip 地址,对吗?它是您计算机上的环回地址,每台计算机都嵌入了该 IP 地址,并且它是专门为该用途而保留的,因此它不能用作向其邻居通告的 IP 地址。
  • 这两个程序在同一台PC上运行,所以使用loopback地址!当他们在 CentOS 上运行时,会得到 0.0.0.0,;当他们在 Ubnutu 中运行时,他们的程序一可以得到程序二的 IP 是:127.0.0.1 这就是我的问题:为什么以及如何修复它?

标签: c linux sockets tcp


【解决方案1】:

在调用accept() 之前,服务器未将addr_len 设置为client_addr 的大小。

修复这个添加

addr_len = sizeof client_addr;

在致电accept()之前。

【讨论】:

    猜你喜欢
    • 2013-05-26
    • 2020-12-08
    • 1970-01-01
    • 2013-10-16
    • 1970-01-01
    • 1970-01-01
    • 2011-06-12
    • 2012-09-25
    • 2014-10-06
    相关资源
    最近更新 更多