【发布时间】:2015-01-13 07:17:18
【问题描述】:
以下是创建套接字连接的代码,如果 IP 存在,则返回正套接字描述符,而如果 IP 不存在,则会卡在例程 connect():
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;
}
}
出于调试目的,我将cout 放在socket() 和connect() 之后。而且我已经测试过cout << "conn: " << conn << endl; 永远不会执行并继续等待,如果提供给构造函数的 IP 不存在。
这些代码适用于现有 IP。
在某处我读到将socket descriptor 设置为O_NONBLOCK 可以解决挂起问题。是的,确实如此,但出现了一个新问题;我什至无法连接到现有 IP。
请帮助我解释为什么会发生这种情况以及如何解决这个问题。
【问题讨论】:
标签: c++ sockets network-programming