在我的程序中,我正在尝试实现对双栈操作的支持(IPv4和IPv6套接字)。
就IPv4而言,一切正常。但在IPv6情况下,accept()
返回-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参数正确。