2010-06-20 7 views
2
int Socket::Connect(const std::string& host, int port) 
{ 

    if(this->_connected) 
     throw "Socket is already connected"; 
    // Get the IP from the string 


    hostent* ip = gethostbyname(host.c_str()); 

    /*if(server == NULL) 
     throw strerror(WSAGetLastError());*/ 

    // Information for WinSock. 
    sockaddr_in addr; 
    // Clear up the memory 
    memset(&addr, 0, sizeof(addr)); 
    addr.sin_family = AF_INET; 
    addr.sin_port = htons(port); 
    addr.sin_addr = *((in_addr *)ip->h_addr); 

    // Try and connect 
    if(WSAConnect(this->_socket, (sockaddr *)&addr, sizeof(addr), NULL, NULL, NULL, NULL) != 0) 
     throw strerror(WSAGetLastError()); // this is being thrown but not caught? 
    this->_connected = true; 
    return 0; 
} 

L'erreur estPourquoi ce code C++ ne fonctionne-t-il pas?

"Erreur inconnue"

et voici la fonction principale

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    try{ 


    Socket* socket = new Socket(); 
    if(socket->Connect("google.com", 80) == 0) 
     std::cout << "[-] connected..." << endl; 

    std::string line = socket->RecvLine(); 
    std::cout << line << endl; 
    } 
    catch(char* errcstr) 
    { 
     std::cout << errcstr << endl; 
    } 
    catch(int err) 
    { 
     std::cout << err << endl; 
    } 
    catch(std::string errstr) 
    { 
     std::cout << errstr << endl; 
    } 
    catch(exception ex) 
    { 
     std::cout << ex.what() << endl; 
    } 
    system("pause"); 
    return 0; 
} 

il devrait donc prendre des exceptions pour autant que je sache. Comment puis-je réparer cela? (Il ne devrait pas y avoir d'exception puisqu'elle est connectée à google.com et que winsock est initialisé, etc.)

MISE À JOUR: L'erreur est réellement lancée après WSAConnect mais il ne devrait pas y avoir de problème de connexion et aucun de mes accrochages déclarations sont utilisées pour une raison quelconque. MISE À JOUR 2: Eh bien maintenant il attrape l'erreur mais il dit "Erreur inconnue" qui est inutile pour moi. Pourquoi ne se connectera-t-il pas à google?

RESOLU: merci!

+0

'gethostbyname' est une API C et ne lèvera jamais une exception C++. Êtes-vous sûr que c'est de là que vient l'erreur? –

+3

Activez la gestion des exceptions de première chance (dans Visual Studio, Ctrl + Alt + E et cochez toutes les cases à cocher) et exécutez la commande jointe au débogueur. Cela vous permettra de rompre lorsque l'exception est levée. –

+0

Merci James. L'exception est juste après WSAConnect (donc il ne parvient pas à se connecter et aucune de mes instructions catch ne fonctionne pour une raison quelconque) –

Répondre

2

strerror() retourne un char * sur les fenêtres de sorte que vous avez besoin d'une prise (char * erreur)

1

Désolé, je voulais poster cela comme une réponse pas un commentaire.

Vous lancez un char* mais il n'y a pas de clause de capture pour l'attraper. Peut-être est ce que vous vouliez faire:

 
if(WSAConnect(this->_socket, (sockaddr *)&addr, sizeof(addr), NULL, NULL, NULL, NULL) != 0) 
     throw std::runtime_error(strerror(WSAGetLastError())); 

MISE À JOUR:

est-il une raison particulière pour laquelle vous utilisez WSAConnect() au lieu de connexion()? Cela devrait fonctionner:

 
_socket = socket(AF_INET, SOCK_STREAM, NULL); 
if (connect(_socket, &addr, sizeof addr) == SOCKET_ERROR) { 
    //Error 
} 

Vous pouvez également trouver ce utile: http://www.madwizard.org/programming/tutorials/netcpp

2

strerror() ne convient pas ici. Il semble que vous essayez de déplacer le code Unix vers Windows; strerror() est la bonne chose sur Unix. connect() sur Unix stocke les codes d'erreur dans la valeur globale errno, et strerror() traduit les codes errno en chaînes d'erreur. Winsock gère les codes d'erreur de manière totalement différente, même en fonction des valeurs d'erreur réelles, de sorte qu'ils ne sont pas compatibles avec strerror().

Consultez la FAQ du programmeur Winsock pour savoir comment transformer les numéros d'erreur Winsock en chaînes de message d'erreur.

Questions connexes