下面的代码是TCP客户端的套接字编程示例。
但是当我运行这个函数时,connect()被返回为协议不支持的地址族。
我听说,如果平台不支持ipv6,就会出现这个问题。
但是我写的AF_INET是IPv4。
另外,我的服务器,也就是CentOS6.4,配置在一个inet6地址。
有人知道为什么吗?
#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;
}
字符串
4条答案
按热度按时间qvtsj1bj1#
这段代码向
inet_pton()
传递了错误的目的地址和错误的参数数量(对于后者,编译器应该已经警告过你了,顺便说一句)。这条线
字符串
应
型
原文来自
man inet_pton
:**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
。应调整以下线路:
型
成为:
型
vptzau2j2#
像这样设置服务器地址;
字符串
wgx48brx3#
我在bind期间看到此错误。原因是使用
localhost
而不是IP:字符串
此外:此错误发生在一个Linux主机上,而不会出现在另一个主机上。我检查并比较了此计算机上的网络设置(
lo
设备、/etc/hosts、/etc/host.conf等),没有发现本质区别vptzau2j4#
把这两条线在终点站走
字符串