¿Por qué no este trabajo C ++ código?
-
28-09-2019 - |
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
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