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:现在它捕获了错误,但它显示“未知错误”,这对我来说毫无用处。为什么它不会连接到谷歌?
求助:谢谢!
答案 0 :(得分:2)
strerror()在Windows上返回一个char *,因此你需要一个catch(char * error)
答案 1 :(得分:2)
strerror()在这里不合适。看起来你正在尝试将Unix代码移动到Windows; strerror()在Unix上是正确的。 Unix上的connect()将错误代码存储在全局errno
值中,而strerror()将errno
代码转换为错误字符串。 Winsock完全不同地处理错误代码,甚至低到实际的错误值,因此它们与strerror()不兼容。
请参阅Winsock程序员常见问题解答中的item 2.8,了解将Winsock错误号码转换为错误消息字符串的正确方法。
答案 2 :(得分:1)
抱歉,我的意思是将此作为回答而非发表评论。
你正在抛出一个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