c - 协议(protocol)不支持的地址族

标签 c sockets centos ipv6

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

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

听说,如果平台不支持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;
}

最佳答案

代码将错误的目标地址和错误的参数数量传递给 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

[...] The address is converted to a struct in_addr and copied to dst, which must be sizeof(struct in_addr) (4) bytes (32 bits) long.


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

应调整以下行:

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

成为:

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

关于c - 协议(protocol)不支持的地址族,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20368832/

相关文章:

c - 为什么在 main() 函数的起始行之后声明变量会导致错误?

c# - 在流对象C#中使用GetStream方法

c - 为什么对象 (ELF) 文件中的 .bss 部分没有内容?

java - 在单个上下文切换中将相同的 tcp 消息发送到多个目的地/主机

c++ - 为什么新建一个socket是可读可写的,是select()监听的?

php - "wkhtmltopdf binary is not found or not executable"尽管 CentOS 服务器上的路径是正确的

centos - iptables 重定向本地连接

sockets - 在 CentOS 上的 Hadoop 数据节点上打开套接字连接

c - 在遇到一定数量的换行符后,我的程序会返回我想要的正确位置吗?

c - 用c系统函数执行openssl命令和在终端执行openssl命令输出是不一样的