Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C getaddrinfo()返回环回地址_C_Sockets - Fatal编程技术网

C getaddrinfo()返回环回地址

C getaddrinfo()返回环回地址,c,sockets,C,Sockets,我在局域网中的某些套接字通信应用程序的目标机器具有IPv4的192.168.98.91 当我尝试用getaddrinfo()解析IPaddress时,它返回127.0.0.1 如何获取192.168.98.91 我在/etc/hosts文件中为myhost设置了192.168.98.91,我对myhost所做的ping将192.168.98.91显示为IP地址 我的机器是CentOS6.4 这是/etc/hosts的设置 192.168.98.91 myhost 127.0.0.1 my

我在局域网中的某些套接字通信应用程序的目标机器具有IPv4的
192.168.98.91

当我尝试用getaddrinfo()解析IPaddress时,它返回
127.0.0.1

如何获取
192.168.98.91

我在
/etc/hosts
文件中为
myhost
设置了
192.168.98.91
,我对
myhost
所做的ping将
192.168.98.91
显示为IP地址

我的机器是CentOS6.4

这是/etc/hosts的设置

192.168.98.91   myhost
127.0.0.1   myhost localhost.localdomain 
这是我的密码

#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <errno.h>
#include <arpa/inet.h>

int
main(int argc,char *argv[]){
    int sock;
    struct addrinfo hints,*res;
    int n;
    int err;
    if(argc != 2){
        fprintf(stderr,"Usage : %s dst \n",argv[0]);
        return 1;
    } 
    memset(&hints,0,sizeof(hints));
    hints.ai_family = AF_UNSPEC; 
    hints.ai_socktype = SOCK_DGRAM;
    err = getaddrinfo(argv[1],"12345",&hints,&res);
    if(err != 0){
        perror("getaddrinfo");
        printf("getaddrinfo %s\n",strerror(errno));
        printf("getaddrinfo : %s \n",gai_strerror(err));
        return 1;
    }

    sock = socket(res->ai_family,res->ai_socktype,0);
    if(sock < 0){
        perror("socket");
        return 1;
    }
    {
        const char *ipverstr;
        switch (res->ai_family){
            case AF_INET:
                ipverstr = "IPv4";
                break;
            case AF_INET6:
                ipverstr = "IPv6";
                break;
            default:
                ipverstr = "unknown";
                break;            
        }
        printf("ipverstr = %s\n ",ipverstr);            
    }
    n = sendto(sock,"HELLO",5,0,res->ai_addr,res->ai_addrlen);
    //n = sendto(sock,"HELLO", 5, 0,(struct sockaddr *)addr, sizeof(addr));
    if(n<1){
        perror("sendto");
        {

        }
        return 1;
    }
    struct sockaddr_in *addr;
    addr = (struct sockaddr_in *)res->ai_addr; 
    printf("inet_ntoa(in_addr)sin = %s\n",inet_ntoa((struct in_addr)addr->sin_addr));

    printf("############ finish !! #######\n");
    close(sock);
    freeaddrinfo(res);
    return 0;
}
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
int
main(int argc,char*argv[]){
int袜子;
结构addrinfo提示,*res;
int n;
INTERR;
如果(argc!=2){
fprintf(stderr,“用法:%s dst\n”,argv[0]);
返回1;
} 
memset(&hints,0,sizeof(hints));
hits.ai_family=AF_unsec;
hits.ai_socktype=SOCK_DGRAM;
err=getaddrinfo(argv[1]、“12345”、&提示和res);
如果(错误!=0){
perror(“getaddrinfo”);
printf(“getaddrinfo%s\n”,strerror(errno));
printf(“getaddrinfo:%s\n”,gai_strerror(err));
返回1;
}
sock=socket(res->ai_族,res->ai_socktype,0);
if(sock<0){
佩罗(“插座”);
返回1;
}
{
const char*ipverstr;
开关(res->ai_系列){
案例分析:
ipverstr=“IPv4”;
打破
案例6:
ipverstr=“IPv6”;
打破
违约:
ipverstr=“未知”;
打破
}
printf(“ipverstr=%s\n”,ipverstr);
}
n=sendto(sock,“HELLO”,5,0,res->ai_addr,res->ai_addrlen);
//n=sendto(sock,“HELLO”,5,0,(struct sockaddr*)addr,sizeof(addr));
如果(地址:;
printf(“inet_ntoa(in_addr)sin=%s\n”,inet_ntoa((struct in_addr)addr->sin_addr));
printf(“完成!!”;
关闭(袜子);
freeaddrinfo(res);
返回0;
}

如果您使用
struct addrinfo
ai\u next
成员遵循
getaddrinfo()返回的结果链,您还将获得
myhost
192.168.98.91

在这里,您可以找到一个完整的示例,该示例还显示了如何执行此操作:

从上面的链接:

       ...
       s = getaddrinfo(NULL, argv[1], &hints, &result);
       if (s != 0) {
           fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(s));
           exit(EXIT_FAILURE);
       }

       /* getaddrinfo() returns a list of address structures.
          Try each address until we successfully bind(2).
          If socket(2) (or bind(2)) fails, we (close the socket
          and) try the next address. */

       for (rp = result; rp != NULL; rp = rp->ai_next) {
          /* Do something with rp->ai_family, rp->ai_socktype, ... */
       }
       ...

/etc/hosts
中的此行删除
myhost

127.0.0.1   myhost localhost.localdomain 

如果您遵循
getaddrinfo()返回的结果链,则在请求
myhost
时,
127.0.0.1
将不再被
getaddrinfo()返回
使用
struct addrinfo
ai_next
成员,您还可以获得
192.168.98.91
myhost

在这里,您可以找到一个完整的示例,该示例还显示了如何执行此操作:

从上面的链接:

       ...
       s = getaddrinfo(NULL, argv[1], &hints, &result);
       if (s != 0) {
           fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(s));
           exit(EXIT_FAILURE);
       }

       /* getaddrinfo() returns a list of address structures.
          Try each address until we successfully bind(2).
          If socket(2) (or bind(2)) fails, we (close the socket
          and) try the next address. */

       for (rp = result; rp != NULL; rp = rp->ai_next) {
          /* Do something with rp->ai_family, rp->ai_socktype, ... */
       }
       ...

/etc/hosts
中的此行删除
myhost

127.0.0.1   myhost localhost.localdomain 

会导致
127.0.0.1
在请求
myhost
时,
getaddrinfo()
不再返回
您浏览过getaddrinfo返回的地址链接列表了吗?您浏览过该列表了吗?getaddrinfo()可能会为您提供多个地址。所描述的症状听起来很奇怪,因为环回地址应该仅在请求
localhost
lo
或类似内容时才会弹出。因此,我建议您也向我们展示机器的
/etc/hosts
/etc/hosts.conf
文件。我编辑以添加我的代码和主机设置。我不使用hosts.conf。显示如何实际使用
getaddrinfo()
的代码对于理解它的错误似乎至关重要。敢拿给我们看…!;-)您浏览过getaddrinfo返回的地址链接列表了吗?您浏览过该列表了吗?getaddrinfo()可能会为您提供多个地址。所描述的症状听起来很奇怪,因为环回地址应该仅在请求
localhost
lo
或类似内容时才会弹出。因此,我建议您也向我们展示机器的
/etc/hosts
/etc/hosts.conf
文件。我编辑以添加我的代码和主机设置。我不使用hosts.conf。现在我可以看到
192.168.98.91
。现在我可以看到
192.168.98.91