当源从ipv6监听时,无法连接环回地址

时间:2012-11-20 07:39:59

标签: c sockets tcp cgi ipv6

我有一个正在侦听端口的服务器

sockfd = socket(PF_INET6,SOCK_STREAM,IPPROTO_TCP);
memset(&addr,0,len = sizeof(addr));
addr.sin6_family = AF_INET6;
addr.sin6_port = htons(2000);
addr.sin6_flowinfo = 0;
addr.sin6_scope_id = 0;
addr.sin6_addr = in6addr_any;

bind(sockfd,(struct sockaddr*)&addr,len);
listen(sockfd,4);

等待接受

.....    
socket = accept(sockfd,(struct sockaddr*)&addr,&len);

我看到“tcp 0 0 ::: 2000 ::: * LISTEN”与netstat -tan

我有一个客户端试图连接该服务器,但得到错误连接()失败,连接被拒绝

memset(&addr,0,sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = htonl(INADDR_LOOPBACK);
addr.sin_port = htons(2000);

if ((sockfd = socket(PF_INET,SOCK_STREAM,IPPROTO_TCP)) == -1)
     printf("ERROR opening socket\n");

memset(buffer,0x00,sizeof(buffer));

我在这里填充缓冲区。

if (connect(sockfd,(struct sockaddr *)&addr,sizeof(addr)) < 0)
 printf("connect() failure, %s-\n", strerror(errno));

我可以使用telnet xx.xx.xx.xx 2000连接。这段代码有什么问题?

1 个答案:

答案 0 :(得分:0)

要连接到IP6服务器,客户端应尝试建立IP6连接。

所以你可能想改变这个:

addr.sin_family = AF_INET;
addr.sin_port = htons(2000);
addr.sin_addr.s_addr = htonl(INADDR_LOOPBACK);

是:

addr.sin6_family = AF_INET6;
addr.sin6_port = htons(2000);
addr.sin6_addr = in6addr_loopback;

telnet客户端可以在内部使用getaddrinfo()来查询通过telnet命令行上给出的IP4地址指定的主机是否有可用的IP6服务。


顺便说一下:bind()connect()的最后一个参数是socklen_t类型。 accept()的最后一个参数是socklen_t *类型。