Pregunta

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;
}

El error es

"Error desconocido"

y aquí es la función principal

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;
}

Por lo tanto, debe coger alguna excepción como lo que yo sé. ¿Cómo puedo arreglar esto? (Debería no es una excepción en absoluto, ya que está conectado a google.com y Winsock se inicializa etc)

ACTUALIZACIÓN:. En realidad se está lanzando el error después de WSAConnect pero no debería ser un problema para conectar y ninguno de mis declaraciones de capturas están siendo utilizados por alguna razón

ACTUALIZACIÓN 2: Bueno, ahora se captura el error pero no dice "Error desconocido", que es inútil para mí. ¿Por qué no se puede conectar a Google?

RESUELTO: gracias

¿Fue útil?

Solución

strerror () devuelve un char * en las ventanas por lo que necesita un retén (char * Error)

Otros consejos

strerror () no es apropiado en este caso. Parece que usted está tratando de mover el código de Unix a Windows; strerror () es lo que hay en Unix. connect () en Unix códigos tiendas de error en el valor global de errno y strerror () se traduce códigos errno a cadenas de error. manijas Winsock códigos de error del todo diferente, incluso a los valores reales de error, por lo que no son compatibles con strerror ().

punto 2.8 en FAQ del Winsock programador de la forma correcta para encender Winsock números de error en cadenas de mensajes de error.

Lo siento, quería escribir esto como no es una respuesta un comentario.

Usted está lanzando una char* pero no hay ninguna cláusula catch para atraparla. Tal vez esto es lo que quería hacer:

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

ACTUALIZACIÓN:

¿Hay alguna razón particular por la que está utilizando WSAConnect () en lugar de connect ()? Esto debería funcionar:

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

También puede resultar útil: http://www.madwizard.org/programming/ tutoriales / netcpp

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top