2010-06-20 111 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:现在它捕捉错误,但它说“未知的错误”,这对我没用。为什么不能连接到谷歌?

求助:谢谢!所以你需要一个catch(字符*错误)

+0

'gethostbyname'是一个C API,不会抛出C++异常。你确定这是错误发生的地方吗? – 2010-06-20 02:36:58

+3

启用一次机会异常处理(在Visual Studio中,Ctrl + Alt + E并选中所有复选框)并运行附加到调试器。这将允许您在抛出异常时中断。 – 2010-06-20 02:40:05

+0

谢谢詹姆斯。在WSAConnect之后就是一个例外(所以它没有连接,并且我的catch语句没有出于某种原因正在工作) – 2010-06-20 02:52:44

回答

2

字符串错误()返回在Windows上一个char *,我的意思是张贴此作为一个答案不评论。

你扔char*,但没有赶上它的条款。也许这是你想要做什么:

 
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上是正确的。 Unix上的connect()存储全局errno值中的错误代码,而strerror()将errno代码转换为错误字符串。 Winsock完全不同的处理错误代码,甚至到实际的错误值,以便它们与strerror()不兼容。

请参阅Winsock程序员常见问题中的item 2.8以将Winsock错误号码转换为错误消息字符串的正确方法。

相关问题