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;
}
ОшибкаПочему этот код C++ не работает?
«Неизвестная ошибка»
и здесь является основной функцией
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;
}
Так он должен отлавливать все исключения, насколько я знаю. Как я могу это исправить? (Не должно быть исключения вообще, поскольку он подключен к google.com и winsock инициализирован и т. Д.)
ОБНОВЛЕНИЕ: ошибка действительно возникает после WSAConnect, но не должно быть проблем с подключением, и ни один из моих catch заявления используются по какой-то причине.
ОБНОВЛЕНИЕ 2: Ну, теперь он ловит ошибку, но он говорит «Неизвестная ошибка», которая бесполезна для меня. Почему он не подключается к Google?
SOLVED: спасибо!
'gethostbyname' является API C и никогда не будет вызывать исключение C++. Вы уверены, что здесь исходит ошибка? –
Включите обработку исключительных ситуаций с исключительным доступом (в Visual Studio, Ctrl + Alt + E и установите флажки) и запустите приложение для отладки. Это позволит вам ломаться, когда генерируется исключение. –
Спасибо, Джеймс. Исключение происходит сразу после WSAConnect (поэтому он не подключается, и ни одна из моих команд catch не работает по какой-то причине) –