以下代码是 TCP 客户端的套接字编程示例。
但是当我运行它时,connect() 作为协议(protocol)不支持的地址族返回。
听说,如果平台不支持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;
}
最佳答案
代码将错误的目标地址和错误的参数数量传递给 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
[...] 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.
与问题无关,但也是一个问题,是 read()
返回 ssize_t
而不是 int
。
应调整以下行:
int n;
[...]
printf("%d, %s\n", n, buf);
成为:
ssize_t n;
[...]
printf("%zd, %s\n", n, buf);
关于c - 协议(protocol)不支持的地址族,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20368832/