C语言 协议不支持地址族

fkaflof6  于 9个月前  发布在  其他
关注(0)|答案(4)|浏览(106)

下面的代码是TCP客户端的套接字编程示例。
但是当我运行这个函数时,connect()被返回为协议不支持的地址族。
我听说,如果平台不支持ipv6,就会出现这个问题。
但是我写的AF_INET是IPv4。
另外,我的服务器,也就是CentOS6.4,配置在一个inet6地址。
有人知道为什么吗?

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

字符串

qvtsj1bj

qvtsj1bj1#

这段代码向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

[...]该地址被转换为结构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);

vptzau2j

vptzau2j2#

像这样设置服务器地址;

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

字符串

wgx48brx

wgx48brx3#

我在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等),没有发现本质区别

vptzau2j

vptzau2j4#

把这两条线在终点站走

sudo sysctl -w net.ipv6.conf.all.disable_ipv6=0
sudo sysctl -w net.ipv6.conf.all.disable_ipv6=1

字符串

相关问题