2011-10-21 39 views

回答

1

select是設置套接字文件描述符超時的最佳方法。這不是矯枉過正,它實際上是一個正確的調用,它會讓你的程序進入休眠狀態,直到數據可用或發生超時,這意味着你的程序不會鎖定系統。

+0

好的,謝謝......... –

+0

爲什麼它比SO_RCVTIMEO更好? – EJP

+0

實際上並沒有更好的結果......在這種情況下,SO_RCVTIMEO可能會更好,我只想指出,在開銷方面,select不是一個矯枉過正的行爲,而是讓進程處於睡眠狀態。無論哪種情況,您都必須檢查EAGAIN ... –

1

如果使用套接字阻塞模式,然後使用select()來等待數據,然後調用recvfrom()是一個(更常見的)的辦法之前到達,但另一種方法是使用setsockopt()設置套接字的SO_RCVTIMEO選項,它設置了阻塞讀取操作的超時時間(請參閱SO_SENDTIMEO阻止發送操作)。然後您可以撥打recvfrom()並讓其在內部超​​時。

如果您在非阻塞模式下使用套接字,則可以使用WSAASyncSelect()WSAASyncEvent()接收異步FD_READ通知。無需等待超時。

如果以重疊模式使用套接字,則可以使用WSAGetOverlappedResult()GetQueuedCompletionStatus()WSARecvFrom()接收異步讀取通知。無需等待超時。