1. ホーム
  2. c

[解決済み] プロトコルでサポートされていないアドレスファミリ

2022-03-06 14:10:42

質問

次のコードは、TCPクライアントのソケットプログラミングサンプルです。

しかし、これを実行すると、Address family not supported by protocolとして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;
}

解決方法は?

このコードでは、間違った宛先アドレスと間違った数の引数を 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

[アドレスは、以下のように変換されます。 dstはsizeof(struct in_addr) (4) bytes (32 bits)の長さでなければなりません。


問題とは関係ありませんが、問題点として、以下があります。 read() が返ってくる ssize_t ない int .

以下の行を調整すること。

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

になるように。

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