以下代码是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;
}
答案 0 :(得分:7)
代码将错误的目标地址和错误的参数数传递给inet_pton()
。 (对于后者,编译器应该警告过你,顺便说一下)
这一行
inet_pton(AF_INET, "127.0.0.1", &server, sizeof(server));
应该是
inet_pton(AF_INET, "127.0.0.1", &server.sin_addr);
int inet_pton(int af,const char * src,void * dst);
<强> AF_INET 强>
[...]地址转换为 结构in_addr并复制到dst,它必须是sizeof(struct in_addr)(4)字节(32位)长。
与问题无关,但也是一个问题,read()
返回ssize_t
而不是int
。
以下几行应予以调整:
int n;
[...]
printf("%d, %s\n", n, buf);
成为:
ssize_t n;
[...]
printf("%zd, %s\n", n, buf);
答案 1 :(得分:3)
像这样设置服务器地址;
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = inet_addr(host);
addr.sin_port = htons(port);
答案 2 :(得分:0)
我在bind期间看到此错误。原因是使用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主机上发生,在另一台Linux主机上未出现。我检查并比较了这台机器上的网络设置(lo
设备,/ etc / hosts,/ etc / host.conf等),没有发现本质区别