2011-06-09 97 views
1

在我的程序中,我试图实现对双栈操作(包括IPv4和IPv6套接字)的支持。accept()函数在IPv6中返回-1

在IPv4的情况下,一切工作正常。但在IPv6情况下,accept()返回值为-1(错误)。

任何人都可以提出可能的原因,以及如何解决它?

回答

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_in6struct sockaddr storage,并确保大小参数是正确的。