Bind() api 因 ipv6 地址而失败

发布于 2024-12-27 07:49:24 字数 1207 浏览 3 评论 0原文

当我尝试绑定到我的自动配置链接本地地址时它起作用。但是当我尝试绑定到一些手动分配的 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;
 }

请建议。我已经被这个问题困扰了两天多了!

it works when iam trying to bind to my auto-config link local address. but when i try to bind to some manually assigned IPv6 address bind() fails with 10049 error. here is the code

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;
 }

Please advice.I'm stuck with this for over 2 days now!!!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

傲性难收 2025-01-03 07:49:24

建议:

问: in6addr_any< /a> 工作吗?

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

Suggestions:

Q: does in6addr_any work?

Q: Do you happen to be running on an ipv6-aware PC (running Vista or Win7, for example)?

苹果你个爱泡泡 2025-01-03 07:49:24

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

only link-local addresses use scope id don't add it when using global unicast

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文