Address family not supported by protocol
c, centos, ipv6, sockets
Solution
The code passes the wrong destination address and wrong number of arguments to `inet_pton()`. (For the latter the compiler should have warned you about, btw)
This line
inet_pton(AF_INET, "127.0.0.1", &server, sizeof(server));
should be
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
[...] The address is converted to a struct in_addr and copied to dst, which must be sizeof(struct in_addr) (4) bytes (32 bits) long.
Not related to the problem, but also an issue, is that `read()` returns `ssize_t` not `int`.
The following lines shall be adjusted:
int n;
[...]
printf("%d, %s\n", n, buf);
to become:
ssize_t n;
[...]
printf("%zd, %s\n", n, buf);
Problem
The following code is a socket programming sample for a TCP client. But when I run this, connect() is returned as Address family not supported by protocol. I have heard, this problem will happen if the platform does not support ipv6. But AF_INET I wrote is ipv4. Also my server, that is CentOS6.4, is configured within an inet6 addr . Does anyone know why? ``` #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; } ```