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

エラーは

"不明なエラー"

これが主な機能です

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:さて、エラーをキャッチしましたが、私には役に立たない「不明なエラー」と表示されます。なぜそれはグーグルに接続しないのですか?

解決済み:ありがとう!

4

3 に答える 3

2

strerror()はここでは適切ではありません。UnixコードをWindowsに移動しようとしているようです。strerror()はUnixでは正しいことです。Unix上のconnect()はエラーコードをグローバルerrno値に格納し、strerror()はerrnoコードをエラー文字列に変換します。Winsockは、実際のエラー値に至るまで、エラーコードをまったく異なる方法で処理するため、strerror()との互換性はありません。

Winsockエラー番号をエラーメッセージ文字列に変換する正しい方法については、WinsockプログラマーのFAQの項目2.8を参照してください。

于 2010-06-21T15:38:53.820 に答える
2

strerror()はWindowsでchar *を返すため、catch(char *エラー)が必要です

于 2010-06-20T02:55:29.423 に答える
1

申し訳ありませんが、コメントではなく回答として投稿するつもりでした。

あなたはを投げてchar*いますが、それをキャッチするためのcatch句はありません。おそらくこれはあなたがやりたかったことです:

if(WSAConnect(this-> _ socket、(sockaddr *)&addr、sizeof(addr)、NULL、NULL、NULL、NULL)!= 0)
        std :: runtime_error(strerror(WSAGetLastError()));をスローします。

アップデート:

connect()の代わりにWSAConnect()を使用している特別な理由はありますか?これは機能するはずです:

_socket = socket(AF_INET、SOCK_STREAM、NULL);
if(connect(_socket、&addr、sizeof addr)== SOCKET_ERROR){
    //エラー
}

また、これが役立つ場合があります:http: //www.madwizard.org/programming/tutorials/netcpp

于 2010-06-20T02:57:12.513 に答える