accept()函数在IPv6的情况下返回-1

时间:2011-06-09 10:09:45

标签: ipv6

在我的程序中,我正在尝试实现对双栈操作的支持(IPv4和IPv6套接字)。

就IPv4而言,一切正常。但在IPv6情况下,accept()返回-1值(错误)。

有人可以提出可能的原因,以及如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

accept()返回-1时,errno将设置为指示发生了哪些特定错误。请致电perror("accept")以便轻松查看错误,并使用结果更新您的问题。

另请注意,必须在以下的套接字上调用accept()

  • 使用socket()电话创建。 (您应该将PF_INET6传递给套接字的第一个参数以创建IPv6协议族套接字)
  • 绑定,使用bind()使用struct sockaddr_in6参数作为第二个参数(其sin6_family设置为AF_INET6,表示您将绑定到IPv6地址)。请记住先将sin6_zero字段清零。一种策略是将整个sockaddr结构归零,这会将IPv6地址设置为IN6ADDR_ANY,这意味着您只需设置端口和地址族。
  • 通过致电listen()
  • 收听

如果您仍然遇到问题,请发布您目前为止的代码。

如果我不得不猜测(因为你没有发布任何代码),我认为如果它适用于IPv4并且可以accept()连接,但IPv6连接accept()调用返回-1,我认为您可能没有将accept()传递给struct sockaddr足够大的printf("sizeof(struct sockaddr_in) = %ld\n", sizeof(struct sockaddr_in)); printf("sizeof(struct sockaddr_in6) = %ld\n", sizeof(struct sockaddr_in6));

例如,以下代码:

sizeof(struct sockaddr_in) = 16
sizeof(struct sockaddr_in6) = 28

打印(在我的系统上):

accept()

如果您只给struct sockaddr_in6足够的空间来写出IPv4地址,则在接受IPv6连接时会失败。确保分配struct sockaddr storage或{{1}},并确保size参数正确。