2011-06-28 69 views
3

這裏的新手問題..只是想在這裏確定..C#.Net Socket保持活躍時間?

這是不是一個HTTP保持活着的問題。

有一種方法可以確保套接字在一段時間後關閉()。

爲什麼我問這是因爲,如果我只是關閉套接字馬上..客戶端可能無法接收該數據包,以表示類似的密碼不正確等。

有沒有像內置的命令插座內的任何超時?

我試圖避免建立定時器或事件來關閉它關閉思維替代的解決方案

回答

2

我從來沒有嘗試過自己,但有LingerOption。請參閱Socket.LingerState Property

此屬性控制的 時間長度面向連接的連接 將一個 呼叫之後保持打開以關閉數據時仍然有待發送 。當你調用方法發送 數據給對等體時,這個數據被放置在 的輸出網絡緩衝區中。這個 屬性可用於確保在Close方法刪除 連接之前將此數據發送到遠程主機 。

+0

沒有工作太好,也許我沒有正確使用它? 'socket.LingerState = new LingerOption(true,3); socket.Send(new byte [] {0}); socket.Close();'發送零字節只有一次10次... ehhhh你知道我會讓它們打開嗎我認爲它們遲早會關閉 – SSpoke

+0

嘗試設置'socket.NoDelay = true'並且還增加'3'來讓我們說'30'。 –

+0

不變。 'socket.LingerState = new LingerOption(true,30); socket.NoDelay = true;'我猜這意味着放置在傳出網絡緩衝區上的數據會在那裏停留一段時間。甚至可能只有一分鐘......而這就等於我的客戶在3-5秒內甚至超時了。 – SSpoke

0

我假設你正在談論TCP協議。
如果您想確保客戶端已收到某些內容,則客戶端需要發送最後收到的消息的響應(例如,錯誤的密碼),並且服務器在收到確認或關閉後會關閉連接readtimeout。

+0

客戶端不發送任何響應我無權修改客戶端。老實說,我想要的是避免來自假客戶端的殭屍連接,如假冒telnet等,我也想讓這些假客戶知道他們爲什麼斷開連接等。你知道我會離開它嗎..我知道在C++,你可以用'setsocketopt'做到這一點。 – SSpoke

+0

http://msdn.microsoft.com/en-us/library/e160993d.aspx - C#訪問套接字選項的方式。 – weismat