Семейство адресов не поддерживается протоколом

Следующий код - это пример программирования сокета для клиента 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;
}

Ответ 1

Код передает неправильный адрес назначения и неправильное количество аргументов в inet_pton(). (Для последнего компилятор должен был предупредить вас о: btw)

Эта строка

 inet_pton(AF_INET, "127.0.0.1", &server, sizeof(server));

должен быть

 inet_pton(AF_INET, "127.0.0.1", &server.sin_addr);

Verbatim from 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() возвращает ssize_t not int.

Следующие строки должны быть скорректированы:

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

чтобы стать:

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

Ответ 2

Установите адрес сервера следующим образом;

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

Ответ 3

Я видел эту ошибку во время привязки. Причина была в использовании 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 и т.д.) И не обнаружил существенной разницы