下面是创建套接字连接的代码,如果IP存在,它会返回正套接字描述符,但如果IP不可用,它会卡住在例程connect()
中。存在:套接字编程:connect()会挂起一个不存在的IP
Connection::Connection(string& ip) : sock(0), status(0), conn(0){
struct sockaddr_in sin;
sock = socket(AF_INET, SOCK_STREAM, 0);//socket() returns -1 on failure.
sin.sin_family = AF_INET;
sin.sin_port = htons(22);
sin.sin_addr.s_addr = inet_addr(ip.c_str());
cout << "sock: " << sock << endl;
//fcntl(sock, F_SETFL, O_NONBLOCK);
if(sock != -1){
conn = connect(sock, (struct sockaddr*)(&sin), sizeof(struct sockaddr_in));
cout << "conn: " << conn << endl;
if (conn != 0){
status = -2;
}
}
else{
status = -1;
}
}
出于调试的目的,我已经socket()
和connect()
后放cout
。并且我测试了cout << "conn: " << conn << endl;
永远不会被执行,并且如果一个不存在的IP被提供给构造函数,它会一直等待。
这些代码适用于现有的IP。
某处我读过设置socket descriptor
到O_NONBLOCK
会解决悬挂问题。是的,只是出现了一个新问题;我甚至无法连接到现有的IP。
请帮我解释它为什么会发生以及如何解决这个问题。
感谢您很好地解释行为。对不起,我的小知识。我可以在上面提供的代码中超时阻塞套接字吗?如是。那么如何? – Rohit
是的,你需要使用'select()'来做到这一点。我已经修改了最后一段,并且链接了一个例子。 – abligh
我会尝试使用'select()'。感谢您的宝贵意见:) – Rohit