看看select()函數,它似乎用於檢查多個事件源。如何在沒有select()的情況下在特定套接字和特定端口上超時?
我有一個套接字綁定到我的服務器上的一個端口。
基本上想要在500ms後超時recvfrom()函數。
是select()最好/唯一的方法來做到這一點,或者它是否殺死?
謝謝!
看看select()函數,它似乎用於檢查多個事件源。如何在沒有select()的情況下在特定套接字和特定端口上超時?
我有一個套接字綁定到我的服務器上的一個端口。
基本上想要在500ms後超時recvfrom()函數。
是select()最好/唯一的方法來做到這一點,或者它是否殺死?
謝謝!
select是設置套接字文件描述符超時的最佳方法。這不是矯枉過正,它實際上是一個正確的調用,它會讓你的程序進入休眠狀態,直到數據可用或發生超時,這意味着你的程序不會鎖定系統。
如果使用套接字阻塞模式,然後使用select()
來等待數據,然後調用recvfrom()
是一個(更常見的)的辦法之前到達,但另一種方法是使用setsockopt()
設置套接字的SO_RCVTIMEO
選項,它設置了阻塞讀取操作的超時時間(請參閱SO_SENDTIMEO
阻止發送操作)。然後您可以撥打recvfrom()
並讓其在內部超時。
如果您在非阻塞模式下使用套接字,則可以使用WSAASyncSelect()
或WSAASyncEvent()
接收異步FD_READ
通知。無需等待超時。
如果以重疊模式使用套接字,則可以使用WSAGetOverlappedResult()
或GetQueuedCompletionStatus()
從WSARecvFrom()
接收異步讀取通知。無需等待超時。
好的,謝謝......... –
爲什麼它比SO_RCVTIMEO更好? – EJP
實際上並沒有更好的結果......在這種情況下,SO_RCVTIMEO可能會更好,我只想指出,在開銷方面,select不是一個矯枉過正的行爲,而是讓進程處於睡眠狀態。無論哪種情況,您都必須檢查EAGAIN ... –