假設你有一個可以有零個或多個套接字的設置。當我嘗試調用空fd集上的select操作時,我得到的是-1作爲設置的fds的數量,這意味着錯誤。那麼你會怎麼建議來克服這個問題,你可能會說如果是空的話不會調用,但我有一個循環,任何時候fd set都可以容納0個或更多的套接字。關於這個問題的最佳方法是什麼? (我們使用C編程語言)套接字選擇空虛設置
回答
這是不對的。您應該能夠指定0作爲集合中文件描述符的數量。實際上,這就是我記得早期使用超時代碼的原因,使用select
時沒有描述符,並且超時值設置得當。
如果它返回-1,則需要查看errno
以查看問題所在。
啊,根據你的評論,WSAEINVAL
是指WinSock。這解釋了你的問題。這是一個可怕的野獸被趕出我們痛苦的:-)
This page here狀態,你會得到WSAEINVAL
如果超時值無效或全部三個描述符參數爲null。它後來表明FD_ZERO
「將該集初始化爲空集」。不管最後的片段是否意味着該參數仍然被認爲是NULL,我都不知道。假設你的超時時間沒有問題(因爲如果你在其中一個集合中有FD),那可能就是這種情況。我知道Berkeley套接字區分NULL FD集合(即NULL指針)和空FD集合(沒有FD集合的有效指針) - WinSock可能不是那種多功能的,特別是因爲nfds
被忽略並僅包含與Berkeley兼容的內容。
我懷疑(雖然我不確定)WinSock可能希望你不要做你想做的事。它可能只是假設你做錯了什麼,並且應該只將select
用於一個或多個FD集合中的一個或多個套接字(因爲沒有FD的select
的唯一用途是延遲,而Windows有很多更好的方法延遲)。
請閱讀select幫助。它說WSAEINVAL將被返回,如果「超時值無效,或者所有三個描述符參數都爲空。」 。很明顯,你也傳遞了一個不正確的超時值。所以,如果你想用0描述符來提供一個正確的timout值。
在Windows下,select
函數完全忽略nfds
參數。 目前我無法測試它,但如果所有集合都非空而是空的,則可能會返回錯誤。
要解決此問題,您可以完全跳過選擇,或者保留一個虛擬套接字以確保套件中始終存在至少一個套接字。
你是對的nfds在Windows中被忽略但是,我的參數不是NULL只是空的.Windows似乎威脅它是NULL。廢話.. – whoi 2010-04-08 09:47:45
Linux處理這個比Windows好多了!在Linux中,使用完全相同的參數調用select()會返回0。 另外,@Hasturkun,我已經在Windows和Linux上測試過 - 我將在Windows上證實它返回-1(SOCKET_ERROR)。 – 2018-02-21 08:29:26
- 1. 在OSX上設置套接字選項
- 2. 選擇套接字編程
- 3. 選擇套接字和stdin
- 4. 設置網絡套接字
- 5. 套接字編程 - C - 選擇連接
- 6. 通過SO_RCVTIMEO套接字選項在Ruby中設置套接字超時
- 7. 套接字接收設置超時
- 8. 在TCP套接字超時選擇
- 9. 選擇後關閉套接字()
- 10. 套接字選擇始終返回零
- 11. 選擇和讀取套接字(Unix)
- 12. 選擇非阻塞套接字
- 13. Unix域套接字和選擇
- 14. 套接字選擇()第二次阻塞
- 15. 選擇與數據套接字迷失
- 16. 阻止套接字和選擇
- 17. Nodejs和socket.io選擇套接字廣播
- 18. gtk +的新事件(選擇套接字)
- 19. 套接字選擇()時間切換?
- 20. 套接字 - 選擇/線程/都
- 21. Python套接字服務器與選擇
- 22. 套接字Python選擇和多處理
- 23. 關閉套接字並選擇()
- 24. 帶選擇的非阻塞套接字
- 25. 區分使用選擇的套接字
- 26. knockout.js - 設置一個空選擇
- 27. Android:ListView選擇器設置爲空?
- 28. 設置默認/空值與選擇TagHelper
- 29. 與虛擬機的套接字連接
- 30. 設置多個UDP套接字
你是否將'nfds'參數設置爲0來調用'select'? 你在使用什麼平臺? – Hasturkun 2010-04-08 08:31:05
您可能還想發佈代碼,讓我們的生活變得更輕鬆。雷蒙德陳可能是一個槍心靈調試器,但我們中的一些人喜歡從硬證據工作:-) – paxdiablo 2010-04-08 08:35:34
@Hasturkun - 是的nfds是0,我在窗口 – whoi 2010-04-08 08:39:25