web-dev-qa-db-ja.com

プロトコルでサポートされていないアドレスファミリ

次のコードは、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;
}
10
user1345414

コードは、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()intではなく_ssize_t_を返します。

次の行を調整します。

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

になるために:

_ssize_t n;
[...]
printf("%zd, %s\n", n, buf);
_
7
alk

このようにサーバーアドレスを設定します。

addr.sin_family = AF_INET;
addr.sin_addr.s_addr = inet_addr(Host);
addr.sin_port = htons(port);
3
sundq

bind でこのエラーを見ました。原因はIPの代わりにlocalhostを使用していた:

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

./myprogram 127.0.0.1:7777
OK! Listening...

さらに、このエラーは1つのLinuxホストで発生し、別のホストでは表示されません。このマシンのネットワーク設定(loデバイス、/ etc/hosts、/ etc/Host.confなど)を確認して比較しましたが、本質的な違いは見つかりませんでした

0
dyomas