我想測試一個封閉的套接字已被對方正常關閉,而不會發生雙重發送的延遲命中以誘發SIGPIPE
。測試一個封閉的套接字
這裏的假設之一是,如果關閉的套接字在上次寫入/發送之後立即由對方正常關閉。像過早關閉一樣的實際錯誤會在代碼中的其他地方處理。
如果套接字仍然打開,將會有0或更多字節的數據,我實際上不想從套接字緩衝區中取出數據。
我在想我可以撥打int ret = recv(sockfd, buf, 1, MSG_DONTWAIT | MSG_PEEK);
來確定套接字是否仍然連接。如果已連接,但緩衝區中沒有數據,我將返回-1
與errno == EAGAIN
並返回sockfd以供重用。如果它已被對方優雅地關閉,我會得到ret == 0
並打開一個新的連接。
我測試過了,它好像工作。但是,我懷疑當我收到我的數據的最後一位和當對方FIN
到達時,我可以從我的測試recv
中獲得假陽性EAGAIN
。
這是咬我還是有更好的方法呢?
另一種方法是select()(或poll()),因爲它可以控制fd讀取和寫入,但我不知道它是否真正解決了有關FIN時序的問題。 – 2010-03-14 11:25:21
@Giuseppe:不,我不認爲select會解決計時問題。 – 2010-03-14 12:40:41