2010-06-20 4 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; 
} 

ОшибкаПочему этот код 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: спасибо!

+0

'gethostbyname' является API C и никогда не будет вызывать исключение C++. Вы уверены, что здесь исходит ошибка? –

+3

Включите обработку исключительных ситуаций с исключительным доступом (в Visual Studio, Ctrl + Alt + E и установите флажки) и запустите приложение для отладки. Это позволит вам ломаться, когда генерируется исключение. –

+0

Спасибо, Джеймс. Исключение происходит сразу после WSAConnect (поэтому он не подключается, и ни одна из моих команд catch не работает по какой-то причине) –

ответ

2

strerror() возвращает символ * на окнах, так что вам нужно поймать (CHAR * ошибка)

1

Извините, я имел в виду, чтобы этот пост как ответ не комментарий.

Вы бросаете char*, но нет уловки catch, чтобы поймать его. Возможно, это то, что вы хотите сделать:

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

UPDATE:

Есть ли какая-либо конкретная причина, почему вы используете WSAConnect() вместо подключения()? Это должно работать:

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

Вы также можете найти этот полезный: http://www.madwizard.org/programming/tutorials/netcpp

2

strerror() не подходит здесь. Похоже, вы пытаетесь переместить код Unix в Windows; strerror() - это правильная вещь в Unix. connect() в Unix хранит коды ошибок в глобальном значении errno, а strerror() переводит errno коды в строки ошибок. Winsock обрабатывает коды ошибок совершенно по-другому, вплоть до фактических значений ошибок, так что они не совместимы с strerror().

См. item 2.8 в FAQ программиста Winsock для правильного способа превращения номеров ошибок Winsock в строки сообщений об ошибках.

Смежные вопросы