【问题标题】:Bind() api fails with ipv6 addressBind() api 失败并显示 ipv6 地址
【发布时间】:2012-01-16 04:55:09
【问题描述】:

当我试图绑定到我的自动配置链接本地地址时它可以工作。但是当我尝试绑定到一些手动分配的 IPv6 地址时,bind() 失败并出现 10049 错误。这是代码

bool StartServer()
{
  const char *Ip = " fe80::216:76ff:fe12:2661%4";
  SHORT nIPFamily = -1;
  int dSock;
  union 
 {
   struct sockaddr_in  saddr4;
   struct sockaddr_in6  saddr6;
 }ServerIP;

memset(&ServerIP,0,sizeof(ServerIP));

 if(strstr(Ip,":"))
 {
   UCHAR MyIp[16];
   USHORT ScopeId = 0;
   ServerIP.saddr6.sin6_family = nIPFamily = AF_INET6;
   ServerIP.saddr6.sin6_port = htons( nPort );
   StringToAddress( Ip, MyIp ); //common function to convert string to address (16byte)
   memcpy( ServerIP.saddr6.sin6_addr.u.Byte, MyIp,16 );
   sscanf(strstr(Ip,"%")+1,"%d",&ScopeId);
   ServerIP.saddr6.sin6_scope_id = ScopeId;
   nAddLen = sizeof(sockaddr_in6);
   psockaddr = &ServerIP.saddr6;
 }

 if ((dSock = socket(nIPFamily, SOCK_STREAM, 0)) < 0)
 {
   AfxMessageBox("Failed to create server socket");
   return -1;
 }
 if (bind (dSock, (sockaddr*)psockaddr, nAddLen) < 0)
 {
   char errmsg[128];
   sprintf(errmsg,"Bind Failed with error %d",WSAGetlastError());
   AfxMessageBox(errmsg);
   return -1;
 }

请指教。我已经坚持了 2 多天了!!!

【问题讨论】:

  • 当您尝试手动分配的地址时,您会将fe80::216:76ff:fe12:2661%4 更改为什么?处理范围 ID 的代码应该不同。 (实际上应该会消失。)
  • Mike 实际上我正在设置一些地址,例如“2000::3”。在这种情况下绑定失败!!但是当我以 fe80 开头的链接本地添加格式设置地址时,它可以工作。但是我的一位同事分配了一些地址,而不是链接本地添加的格式。对于两个背靠背连接的系统,他能够使用套接字发送和接收流量。这让我担心!我的 IPv6 配置可能有问题!!!
  • 您的 sscanf() 将无法尝试使用该输入解析范围 ID。
  • bind()返回的错误是什么?

标签: ipv6


【解决方案1】:

建议:

问:in6addr_any 有效吗?

问:您是否碰巧在支持 ipv6 的 PC 上运行(例如运行 Vista 或 Win7)?

【讨论】:

  • 我正在使用 winxp 并配置了 ipv6。
【解决方案2】:

只有链接本地地址使用范围ID,使用全局单播时不要添加它

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-04-21
    • 2011-08-27
    • 2012-04-11
    • 2014-09-06
    • 1970-01-01
    • 2010-11-17
    • 2014-08-07
    相关资源
    最近更新 更多