出於某種原因,我們的程序爲tcp套接字選擇了BLOCKING模式,我知道這是一個糟糕的設計,但我現在不能做太多的修改。如何在tcp套接字的BLOCKING模式下感覺不那麼痛苦?
問題是,當peer關機時,我們程序中的recv調用會掛起,有什麼解決方法嗎? SO_KEEPALIVE選項有幫助還是應該實施一些心跳機制?
謝謝。
出於某種原因,我們的程序爲tcp套接字選擇了BLOCKING模式,我知道這是一個糟糕的設計,但我現在不能做太多的修改。如何在tcp套接字的BLOCKING模式下感覺不那麼痛苦?
問題是,當peer關機時,我們程序中的recv調用會掛起,有什麼解決方法嗎? SO_KEEPALIVE選項有幫助還是應該實施一些心跳機制?
謝謝。
你可以做嘗試以下方法:
確定爲什麼它很難插座轉向非阻塞模式。什麼阻止你改變不好的設計?害怕太多的修改和更大的熵,它可能會破壞工作的東西?我會推薦一個設計修復,而不是與它一起生活。
TCP KEEP-ALIVE是確定對等體是否可用的選項。
如果您可以修改對等應用程序代碼,那麼應用程序級別交換心跳應該有所幫助。但是,如何在沒有計時器的情況下離開被阻止的recv()?因此下一個。
防止套接字上的永久塊。在send()和recv()中設置超時。
在套接字上設置讀取超時。由於您尚未指定語言,因此不可能告訴您具體的操作方式,但在基本級別上,它是套接字選項SO_RCVTIMEO。使它足夠長以至於如果它發生,它必須是對等故障。
如果你知道的東西是'壞設計'然後修復它! –
Mitch是對的,改進設計可以長期爲您提供更好的服務...但是如果您無法做到這一點,您可能會在send()和recv()調用中超時,如下所示:http:/ /stackoverflow.com/a/4182564/131930 –
這不是一個糟糕的設計。 '感覺痛苦'不是問題描述。您尚未指定編程語言。 -1 – EJP