我有一個選擇在FDSET上運行,它包含幾個TCP連接和一個未綁定的UDP連接。在Windows中,當我關閉來自不同線程的UDP連接的套接字時,它將指示select返回。然而,在Ubuntu中,情況並非如此,爲什麼?爲什麼不關閉UDP套接字選擇返回?
回答
如果這取決於您是否想的select
(和FD_SET
)之前,期間的select
,或關閉FD 。在這兩種情況下,由於下面列出的原因,行爲是不確定的。也許它在Windows下做了一件事,但你不能依賴它。
如果你想在關閉FD 的select
(即後select()
系統調用已經進入,但在返回之前),則行爲是未定義設置在這裏的原因:What does select(2) do if you close(2) a file descriptor in a separate thread?
如果您試圖關閉select
(和FD_SET
)之前的fd ,那麼您正嘗試在現在已關閉即FD無效的FD上嘗試FD_SET
然後select()
。標準在這裏:http://pubs.opengroup.org/onlinepubs/009695399/functions/select.html並且這表示FD_SET
宏可能甚至不會要求select()
查看您的FD。
如果fd參數是小於0 或大於或等於FD_SETSIZE,或者如果fd是不是有效的 文件描述符,或者如果任何參數與表達這些宏的行爲是不明確方 的影響。
如果它(且僅當它),select
應該返回EBADF
:
在下列情況下,PSELECT()和select()失敗,將 errno設置爲:
[EBADF]一個或多個文件描述符集指定了一個不是有效的打開文件描述符的文件描述符 。
但是你沒有辦法知道情況會如此,因爲FD_SET
可能同樣只是忽略無效的文件描述符。
爲了完整性,如果您在close
之前執行FD_SET
,但之後再執行select
,則應該看到EBADF
。
不,FD的關閉與我按下按鈕有關。因此,我100%確定在選擇電話時FD是有效的。 – chacham15
所以當你關閉fd時,它在* select()中?在這種情況下,'select()'本身的行爲不是由POSIX標準定義的(請參閱我發送的鏈接)。它可能會返回它,它可能不會。請參閱:http://stackoverflow.com/questions/543541/what-does-select2-do-if-you-close2-a-file-descriptor-in-a-separate-thread – abligh
據我所知,這鏈接中沒有提到關於調用後關閉的套接字。我錯過了什麼? – chacham15
- 1. Java - 關閉UDP套接字
- 2. 即使套接字關閉,爲什麼socket.isOutputShutdown()返回false?
- 3. 選擇UDP套接字在套接字關閉時不會結束 - 我做錯了什麼?
- 4. 什麼時候連接的UDP套接字會被OS關閉?
- 5. 關閉UDP套接字沒有socket.close()
- 6. 選擇後關閉套接字()
- 7. 關閉套接字並選擇()
- 8. 「java.net.SocketException:套接字關閉」,而綁定一個UDP套接字
- 9. 套接字選擇始終返回零
- 10. 爲什麼OutputStream.write()關閉套接字連接?
- 11. WSARecvFrom來自未連接的UDP套接字不返回
- 12. Apache套接字不關閉?
- 13. 套接字不斷關閉
- 14. 連接關閉不返回
- 15. 爲什麼套接字的另一側沒有關閉套接字? (CLOSE_WAIT)?
- 16. 套接字API:爲什麼`connect`不返回描述符?
- 17. 爲什麼Silverlight或Flash不實現UDP套接字?
- 18. UDP套接字上的recvfrom()返回-1,但WSAGetLastError()返回0
- 19. Unix域套接字,Udp套接字Objective C使用什麼?
- 20. 關閉套接字
- 21. 關閉套接字?
- 22. 爲什麼要在關閉套接字之前使用shutdown()?
- 23. 爲什麼我的Java服務器關閉套接字?
- 24. 爲什麼DefaultHttpClient通過半關閉套接字發送數據?
- 25. 爲什麼最接近的選擇標記返回對象而不是選擇
- 26. 爲什麼我使用Asynchronous UDP client socket隨機接收UDP套接字答案?
- 27. 爲什麼這個python UDP套接字重置爲'None'?
- 28. UDP套接字
- 29. java套接字SocketException套接字關閉
- 30. 關閉回聲IO ::套接字:: INET
顯示代碼或我們無法清楚地知道什麼正在關閉。也是你選擇一個FD數組的選擇? (文件描述/套接字) – nrathaus
:「在同一進程的其他線程中可能正在使用系統調用時關閉文件描述符可能不明智,因爲文件描述符可能會被重用,所以會出現一些模糊的競爭可能會導致意外副作用的條件「 –
@ KarolyHorvath指出,但這似乎並不是問題。套接字關閉的時間似乎並不重要。 – chacham15