协议不支持的地址族

use*_*414 10 c sockets centos ipv6

以下代码是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;
}
Run Code Online (Sandbox Code Playgroud)

alk*_*alk 7

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

这条线

 inet_pton(AF_INET, "127.0.0.1", &server, sizeof(server));
Run Code Online (Sandbox Code Playgroud)

应该

 inet_pton(AF_INET, "127.0.0.1", &server.sin_addr);
Run Code Online (Sandbox Code Playgroud)

逐字逐句man inet_pton:

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

AF_INET

[...]地址转换为结构in_addr并复制到dst,dst必须是sizeof(struct in_addr)(4)字节(32位)长.


不相关的问题,但也是一个问题,就是read()返回ssize_t没有int.

以下几行应予以调整:

int n;
[...]
printf("%d, %s\n", n, buf);
Run Code Online (Sandbox Code Playgroud)

成为:

ssize_t n;
[...]
printf("%zd, %s\n", n, buf);
Run Code Online (Sandbox Code Playgroud)