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