Почему этот код C ++ не работает? - PullRequest
2 голосов
/ 20 июня 2010
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;
}

Ошибка

"Неизвестная ошибка"

и вот основная функция

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?

решено: спасибо!

Ответы [ 3 ]

2 голосов
/ 21 июня 2010

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

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

2 голосов
/ 20 июня 2010

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

1 голос
/ 20 июня 2010

Извините, я хотел опубликовать это как ответ, а не как комментарий.

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

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

ОБНОВЛЕНИЕ:

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...