我在Windows 2008x64上的一個C++應用程序出現問題(相同的應用程序在Windows 2003x64上運行得很好)。Socket在應用程序崩潰後仍在監聽
在發生崩潰或者有時在正常關機/重啓循環之後,在使用端口82上的套接字時它有問題需要接收命令。
看看netstat我看到套接字在應用程序停止後超過10分鐘仍處於監聽狀態(此過程絕對不再運行)。
TCP 0.0.0.0:82 LISTENING
我嘗試設置套接字選項REUSEADDR但據我所知,只有影響再次連接到這是在TIME_WAIT狀態的端口。無論哪種方式,這種改變似乎沒有任何區別。
int doReuse = 1;
setsockopt(listenFd, SOL_SOCKET, SO_REUSEADDR,
(const char *)&doReuse, sizeof(doReuse));
任何想法我能做些什麼來解決或至少避免這個問題?
編輯:
難道netstat的-an但是這是所有我得到:
TCP 0.0.0.0:82 0.0.0.0:0 LISTENING
netstat的-anb我得到:
TCP 0.0.0.0:82 0.0.0.0:0 LISTENING
[System]
我所知道的優雅地關閉,但即使應用程序由於某種原因崩潰,我仍然需要能夠重新啓動它。有問題的應用程序使用內部使用Windows套接字API的內部庫。
編輯:
顯然有針對此問題沒有解決,所以發展我將與代理/工具來解決它去。感謝所有的建議,非常感謝。
如果您在計算機重新啓動後仍有問題,可能是其他程序正在使用您的端口。做一個'netstat -anb'來看看誰在82上收聽。 – 2010-12-16 20:44:54
這是崩潰後的正常現象。套接字inofrmation被保存在操作系統中(你的應用程序只是持有這些信息的句柄)。當你的應用程序崩潰時(或者在不關閉連接的情況下退出),套接字將一直保持使用狀態,直到操作系統檢測到應用程序已經失效(這可能會持續10分鐘)。您最好的選擇是通過端口作爲命令行參數,這樣您就可以在解除竊聽的同時快速更改端口。 – 2010-12-16 21:21:46
在Windows事件記錄器中是否有任何錯誤消息,可能是事件ID 4227? – 2010-12-16 21:42:21