Bind() api 因 ipv6 地址而失败
当我尝试绑定到我的自动配置链接本地地址时它起作用。但是当我尝试绑定到一些手动分配的 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 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
建议:
问: 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)?
仅链路本地地址使用范围 ID,使用全局单播时不要添加它
only link-local addresses use scope id don't add it when using global unicast