【问题标题】:Can not connect with loopback address when source is listenning from ipv6当源从 ipv6 侦听时无法连接回环地址
【发布时间】:2012-11-08 05:56:21
【问题描述】:

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

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);

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

我有一个客户端正在尝试连接该服务器,但出现错误连接()失败,连接被拒绝

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 连接。这段代码有什么问题?

【问题讨论】:

    标签: c sockets tcp cgi ipv6


    【解决方案1】:

    要连接到 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 * 类型。

    【讨论】:

    • 在服务器端,它接受 bot v4 和 v6 连接。我在服务器上监听了四个端口,其中三个没有问题。我可以用 v4 连接它们,但只有这个端口有问题。我使用 cgic 并从 web 调用 cgi,但它失败了。我查看了wireshark,发现它会将msg发送到我在代码中没有提到的另一个端口,它也没有监听。
    • 我在打开套接字之前填充了顶部的缓冲区,然后错误更改为“网络无法访问”我更改了 addr.sin_addr.s_addr = htonl(INADDR_LOOPBACK);添加到 addr.sin_addr.s_addr = inet_addr("127.0.0.1");然后“连接被拒绝”错误又回来了。
    • 服务器是否与客户端运行在同一主机上? @brknl
    • 主机字节顺序是否不同于网络字节顺序取决于代码运行平台的字节序。例如,x86 是不同的,PowerPC 是相同的。网络字节顺序是 Big-Endian。有关更多信息,请参见此处:en.wikipedia.org/wiki/Endianness@brknl
    • 您可能想在您的 OP 中添加您声明 addr 的方式。 @brknl
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-05-31
    • 2023-03-23
    • 1970-01-01
    • 2021-10-28
    • 2015-05-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多