【问题标题】:Address family not supported by protocol协议不支持的地址族
【发布时间】:2013-12-20 13:17:31
【问题描述】:

以下代码是一个 TCP 客户端的套接字编程示例。

但是当我运行它时,connect() 被返回为不受协议支持的地址族。

听说,如果平台不支持ipv6就会出现这个问题。

但是我写的AF_INET是ipv4。

我的服务器,即 CentOS6.4,也是在 inet6 addr 中配置的。

有人知道为什么吗?

#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>

int
main(){
    struct sockaddr_in server;
    int sock;
    char buf[32];
    int n;
    sock = socket(AF_INET,SOCK_STREAM,0);
    perror("socket");
    server.sin_family = AF_INET;
    server.sin_port = htons(12345);
    inet_pton(AF_INET,"127.0.0.1",&server,sizeof(server));
    connect(sock,(struct sockaddr *)&server,sizeof(server));
    perror("connect");
    memset(buf,0,sizeof(buf));
    n = read(sock,buf,sizeof(buf));
    perror("read");
    printf("%d,%s\n",n,buf);
    close(sock);
    return 0;
}

【问题讨论】:

    标签: c sockets centos ipv6


    【解决方案1】:

    这样设置服务器地址;

    addr.sin_family = AF_INET;
    addr.sin_addr.s_addr = inet_addr(host);
    addr.sin_port = htons(port);
    

    【讨论】:

    • 情况已更改为“连接被拒绝”。看起来向前迈进了一步。
    • 我确定Connection refused 表示服务器不存在或服务器关闭
    • "Connection refused" 表示ip-address可达,但指定端口没有人监听,所以ip-address"的机器拒绝”进行连接。
    • 我的服务器不工作。我会在另一个线程上提问,这样这个线程就会跑题了。
    • 您好,您也可以看看这个吗? stackoverflow.com/questions/60874596/…
    【解决方案2】:

    代码将错误的目标地址和错误数量的参数传递给inet_pton()。 (对于后者,编译器应该已经警告过你,顺便说一句)

    这一行

     inet_pton(AF_INET, "127.0.0.1", &server, sizeof(server));
    

    应该是

     inet_pton(AF_INET, "127.0.0.1", &server.sin_addr);
    

    来自man inet_pton的逐字记录:

    int inet_pton(int af, const char *src, void *dst);

    AF_INET

    [...] 地址转换为 一个 struct in_addr 并复制到 dst,其长度必须为 sizeof(struct in_addr) (4) 个字节(32 位)。


    与问题无关,但也是一个问题,是read()返回ssize_t而不是int

    以下几行需要调整:

    int n;
    [...]
    printf("%d, %s\n", n, buf);
    

    变成:

    ssize_t n;
    [...]
    printf("%zd, %s\n", n, buf);
    

    【讨论】:

    【解决方案3】:

    我在bind 期间看到了这个错误。原因是使用 localhost 而不是 IP:

    ./myprogram localhost:7777
    *** exception! `bind' failed for `localhost:7777' (97, Address family not supported by protocol)
    
    ./myprogram 127.0.0.1:7777
    OK! Listening...
    

    另外:此错误发生在一台 Linux 主机上,而不会出现在另一台主机上。我检查并比较了这台机器上的网络设置(lo 设备、/etc/hosts、/etc/host.conf 等),没有发现本质区别

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多