在我的程序中,我试图实现对双栈操作(包括IPv4和IPv6套接字)的支持。accept()函数在IPv6中返回-1
在IPv4的情况下,一切工作正常。但在IPv6情况下,accept()
返回值为-1
(错误)。
任何人都可以提出可能的原因,以及如何解决它?
在我的程序中,我试图实现对双栈操作(包括IPv4和IPv6套接字)的支持。accept()函数在IPv6中返回-1
在IPv4的情况下,一切工作正常。但在IPv6情况下,accept()
返回值为-1
(错误)。
任何人都可以提出可能的原因,以及如何解决它?
当accept()
返回-1
,errno
将被设置为指示发生了什么特定的错误。请致电perror("accept")
查看错误的简单方法,并用结果更新您的问题。
而且,请注意,必须accept()
已经在套接字上被称为:
socket()
调用创建。 (你应该通过PF_INET6
为您插座创建IPv6协议族插座的第一个参数)bind()
使用struct sockaddr_in6
参数作为第二个参数(其sin6_family
设置为AF_INET6
对于IPv6,以表明您具有约束力到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()
足够的空间来写出一个IPv4地址,它就会失败当它接受IPv6连接时。确保您分配了struct sockaddr_in6
或struct sockaddr storage
,并确保大小参数是正确的。