我跑在bash下面一行,在虛擬機上運行Red Hat 5:力連接到工作
for i in {1..100000};
do telnet 10.10.10.105 41941;
done
在某些時候,TELNET連接到端口,即使沒有人聽就可以了。它似乎是連接到它的自我? 當我啓動應用程序的客戶端時出現同樣的問題,沒有啓動服務器 - 客戶端成功連接到ip:端口。客戶端看起來是這樣的:
addr.sin_family = AF_INET;
addr.sin_port = htons(atoi(port));
addr.sin_addr.s_addr = inet_addr(hostname);
some_while_loop
{
status = ::connect(sock, (sockaddr *)&addr, sizeof(addr));
if (status == -1)
{
shutdown(sock, 2);
close(sock);
return false;
}
}
我發現這篇文章:http://web.deu.edu.tr/doc/soket/在6.2其中指出,該連接將如果你成功了,以你在運行在同一臺機器。我的問題是,爲什麼會發生這種情況?這是硬件問題,還是紅帽內核正在使用的故障安全內核,或者是因爲我使用的端口(例如1025,我沒有這個問題)......?
那麼,對SYN的回覆不是ACK,它是一個SYN + ACK,在連接完成之前,它必須被ACK'd。我認爲這裏的基本機制有些不同。 – EJP
@EJP請看編輯答案,並重新考慮downvote/deletevote! –
@JonasWielicki,同時啓動確實似乎是這種情況,因爲在連接上,地址和端口實際上並沒有被阻塞,所以connect()將它們視爲鏈接套接字的可行選項。作爲一個解決這個問題的方法,我發現你可以'getsockname(sock,&sock_addr,&addr_size)'檢查端口是否相同,從而關閉連接。如果服務器試圖使用相同的地址和端口,還可以使用setsockopt設置上面提到的套接字來重新使用地址(SO_REUSEADDR)。正確地感謝您的幫助 – user1783445