下面是創建套接字連接的代碼,如果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