【发布时间】: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