web-dev-qa-db-fra.com

Famille d'adresses non prise en charge par le protocole

Le code suivant est un exemple de programmation de socket pour un client TCP.

Mais lorsque j'exécute cela, connect () est renvoyé en tant que famille d'adresses non prise en charge par le protocole.

J'ai entendu dire que ce problème se produira si la plate-forme ne prend pas en charge ipv6.

Mais AF_INET que j'ai écrit est ipv4.

Mon serveur, c'est-à-dire CentOS6.4, est également configuré dans un addr inet6.

Quelqu'un sait-il pourquoi?

#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

Le code transmet la mauvaise adresse de destination et le nombre incorrect d'arguments à inet_pton(). (Pour ce dernier, le compilateur aurait dû vous avertir, btw)

Cette ligne

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

devrait être

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

Verbatim de man inet_pton :

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

AF_INET

[...] L'adresse est convertie en une structure in_addr et copiée dans dst, qui doit être sizeof (struct in_addr) (4) octets (32 bits) de long.


Ce n'est pas lié au problème, mais aussi à un problème, que read() renvoie ssize_t Et non int.

Les lignes suivantes doivent être ajustées:

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

devenir:

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

Définissez l'adresse du serveur comme ceci;

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

J'ai vu cette erreur pendant bind . La cause était d'utiliser localhost au lieu d'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...

De plus: cette erreur se produit sur un hôte Linux et n'apparaît pas sur un autre. Je vérifie et compare les paramètres réseau sur ces machines (lo périphérique,/etc/hosts, /etc/Host.conf, etc.) et je n'ai pas trouvé de différence essentielle

0
dyomas