2012-01-16 2 views
0

работает, когда iam пытается связать мой локальный адрес автоматической настройки. но когда я пытаюсь связать какой-то вручную назначенный адрес IPv6, bind() с ошибкой 10049. вот кодBind() api не работает с адресом ipv6

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 дней!

+0

Что вы измените 'fe80 :: 216: 76ff: FE12: 2661% 4', когда вы попробуйте вручную назначенный адрес ? Код, связанный с идентификатором области, должен быть другим. (должно быть, вероятно, уйти, на самом деле.) – mpontillo

+0

Майк фактически Iam установил некоторые адреса, такие как «2000 :: 3». В этом случае привязка не удалась! но когда я устанавливаю адрес в локальном добавочном формате link, начиная с fe80, он работает. Но один из моих коллег присвоил некоторые адреса, кроме как в формате link-local add. для двух систем, подключенных к спине, и он мог отправлять и получать трафик с помощью сокетов. и это беспокоит меня !!! может быть какая-то проблема с моей конфигурацией IPv6 !!! – user1151217

+0

Ваш 'sscanf()' не будет пытаться проанализировать идентификатор области с этим входом. – mpontillo

ответ

0

Предложения:

Q: in6addr_any работу?

В: Случается, что вы работаете на ПК с поддержкой ipv6 (например, Vista или Win7)?

+0

Iam с использованием winxp и config'd ipv6. – user1151217

0

только ссылка локального адреса использовать идентификатор диапазона не добавлять его при использовании глобальной одноадресной