2013-06-28 1 views
-1

Je configuré Windows 8 pare-feu pour permettre sortant IPV6 et les connexions entrantes comme une mesure de précaution, mais chaque fois que j'essaie de se connecter à soit sont l'hôte distant ou à ma propre machine en utilisant l'adresse de bouclage (à une application de serveur ipv6 fonctionnant simultanément) la fonction de connexion échoue avec l'erreur 10049 quel que soit le port que je choisis. Est-ce un problème de configuration réseau? IP4 fonctionne très bien.IPV6 Erreur de connexion 10049 (A-GAIN!)

#include "stdafx.h" 
#include <iostream> 
#include <iostream> 
#include <string> 
#include <stdlib.h> 


#ifndef UNICODE 
#define UNICODE 
#endif 

#define WIN32_LEAN_AND_MEAN 






#include <winsock2.h> 
#include <WS2tcpip.h> 
#include <ws2ipdef.h> 
#include <iphlpapi.h> 
#include <IPTypes.h> 


#pragma comment(lib, "ws2_32.lib") 
#pragma comment(lib,"iphlpapi.lib") 



using namespace std; 


static int MAXPENDING = 5; 

void set_interface(SOCKET s, DWORD Index); 






int main(int argc,char* argv[]) 
{ 

    WSADATA wsaData; 
    int Result; 
    int optv = 1; 
    char *optval = (char*)&optv; 
    int optlen = sizeof(optval); 
    DWORD Index = 22;  
    bool connected = false; 
    string exit = "quit"; 
    string name; 
    sockaddr_in6 c_addr; 
    c_addr.sin6_family = AF_INET6; 

    char buffer[1024]; 







    Result = WSAStartup(MAKEWORD(2, 2), &wsaData); 
    if (Result != NO_ERROR) { 
     printf("WSAStartup function failed with error: %d\n", GetLastError()); 
     return 0; 
    } 





    SETUP: 

     SOCKET connector; 
     connector = socket(AF_INET6, SOCK_STREAM, IPPROTO_TCP); 
     if (connector == INVALID_SOCKET) { 
      wprintf(L"socket function failed with error: %ld\n", WSAGetLastError()); 
      closesocket(connector); 
      return 1; 
     } 









     cout << "Enter host name(URL): "; 
     cin >> name; 
     cout << endl; 



     char *hostname = const_cast<char*>(name.c_str()); 

     if(inet_pton(AF_INET6,hostname,&c_addr.sin6_addr)<0){ 
      printf("InetPton() function failed with error: %d/n",GetLastError()); 
      closesocket(connector); 
      return 1; 
     } 





     string p; 
     char *hostport; 
     int p0rt; 
     cout << "Enter the port number you wish to connect on: " ; 
     cin >> p; 
     cout << endl; 
     hostport = const_cast<char*>(p.c_str()); 
     p0rt = atoi(hostport); 

     if(!(0 < p0rt && p0rt < 65,536)){ 
      cout << "Error: port number must be greater than 0 and less than 65,536. " << endl; 
      cout << endl; 
      cout << "Re-enter the port number you wish to connect on: " ; 
      cin >> p; 
      cout << endl; 
      hostport = const_cast<char*>(p.c_str()); 
      p0rt = atoi(hostport); 

     }else{ 
      c_addr.sin6_port = htons(p0rt); 
     } 








    if(connect(connector,(sockaddr*)&c_addr,sizeof(c_addr))<0){ 
      printf("Connect failed with error: %d\n",GetLastError()); 
      string cmd; 
      cout << endl; 
      cout <<"Try again? Type 'y' to reattempt connection or type any other key to exit: "; 
      cin >> cmd; 
      cout << endl; 
      if(cmd=="y"){ 

       goto SETUP; 
      }else { 
       goto QUIT; 
      } 


    }else{ 
     connected = true; 
     cout << "Connected to host " << hostname << " on port " << c_addr.sin6_port << endl; 
     cout << "Type 'quit' to exit the program " << endl; 
    } 

    while(connected==true){ 

     int nbr = 0; 


     cout << endl; 
     cout << ">"; 
     scanf("%s",buffer); 
     cout << endl; 

     string str(buffer); 

     if(str==exit){ 

      connected = false; 
      goto QUIT; 
     } 




     long nbs = send(connector,buffer,sizeof(buffer),0); 
     if(nbs < 0){ 
      printf("send() failed", GetLastError()); 
      goto QUIT; 
     } 

     while(nbr < nbs){ 
      nbr = recv(connector,buffer,sizeof(buffer),0); 
      if(nbr < 0){ 
       printf("recv() failed", GetLastError()); 
       goto QUIT; 

      }else if(nbr==0){ 
       printf("recv() failed: connection closed prematurely", GetLastError()); 
       goto QUIT;    
      }else if(nbr > 0){ 
       cout << endl; 
       cout << ">> "; 
       printf(buffer); 
       cout << endl; 
      } 

     } 



    } 


    QUIT: 

     if (closesocket(connector) == SOCKET_ERROR) { 
      printf("closesocket function failed with error: %ld\n", GetLastError()); 
      WSACleanup(); 
      return 1; 
     } 


    WSACleanup(); 

    return 0; 




}; 


void set_interface(SOCKET s, DWORD Index){ 




     MIB_IF_ROW2 T2; 
     NET_LUID ID; 
     DWORD ptbuflen = (DWORD)sizeof(T2); 


     ConvertInterfaceIndexToLuid(Index,&ID); 
     T2.InterfaceLuid = ID; 
     GetIfEntry2(&T2); 



     if(WSAIoctl(s,SIO_ASSOCIATE_HANDLE,&T2,ptbuflen,NULL,0,0,NULL,NULL)>0){ 
      printf("WSAIoctl() function failed with error: %d\n", GetLastError()); 
      closesocket(s); 


     } 

     if(WSAIoctl(s,SIO_TRANSLATE_HANDLE,&T2,ptbuflen,NULL,0,0,NULL,NULL)>0){ 
      printf("WSAIoctl() function failed with error: %d\n", GetLastError()); 
      closesocket(s); 


     } 

}; 
+0

duplication possible de [bind() échoue avec erreur de socket Windows 10049] (http://stackoverflow.com/questions/14366048/bind-fails-with-windows-socket-error-10049) –

Répondre

1

Vous devez mettre à zéro la partie de la que vous n'utilisez pas. Mettre à zéro la chose enire d'abord, puis remplissez les parties dont vous avez besoin.

Si l'utilisateur ne parvient pas à entrer un port valide pour la première fois, vous ne validez pas le nouveau port entré une deuxième fois et vous n'attribuez pas cette deuxième valeur de port au . Vous devez effectuer votre validation dans une boucle, puis attribuer la valeur finale acceptée au . Vous utilisez inet_pton() lorsque vous utilisez getaddrinfo() à la place. inet_pton() convertit uniquement une chaîne d'adresse IP en son format binaire. Il ne va pas résoudre un nom d'hôte à une adresse IP. getaddrinfo() effectue cette résolution à la place, et prend également en charge la conversion des chaînes d'adresses IP (spécifiez l'indicateur AI_NUMERICHOST dans le paramètre hints pour obtenir ce comportement).

+0

Merci. Cela semble fonctionner. Mais qu'en est-il de la structure sockaddr_in6? J'ai besoin de spécifier le scopeID afin qu'il sache quelle interface utiliser. –

+0

Non, vous n'avez pas besoin de spécifier un ID de portée. Si vous voulez vous connecter en utilisant une interface spécifique, alors 'bind()' le socket à l'adresse IP locale de cette interface avant d'appeler 'connect()'. –

+0

J'ai été en mesure de spécifier l'interface de connexion en utilisant la fonction WSAIoctl(). Appréciez votre aide. FTR: J'ai effacé la structure sockaddr_in6 et utilisé une structure addrinfo avec getaddrinfo() et c'est ce qui a fait l'affaire. –