2012-06-07 61 views
0

我正在調用UDP套接字上的select()以查看是否有要讀取的數據。每次該方法返回-1並將errno設置爲22(無效參數)。這裏是我的代碼的一部分:在UDP套接字上調用select()會給出無效參數錯誤

fd_set sockets; 
struct timeval alarm; 
alarm.tv_sec = 0; 
alarm.tv_usec = 1000; 
FD_ZERO(&sockets); 
FD_SET(udpSocket, &sockets); 
maxfd = udpsocket + 1; 
selected = select(maxfd, &sockets, NULL, NULL, &alarm); 
printf("%d\n", selected); 

「Selected」始終爲-1。我知道套接字是好的,因爲在這一點上我已經成功地發送了數據。

+0

您可以使用初始化套接字和鬧鐘的方式更新問題嗎? – Fred

+0

我強烈建議你將'struct timeval alarm'重命名爲別的東西,碰巧有一個同名的函數(即''alarm()') – Hasturkun

回答

2

事實證明,對錯誤的原因是,我報警的微秒屬性設置爲:

alarm.tv_usec = 2000000; 

這顯然是太高的值。顯然,將秒屬性設置爲2會更容易:

alarm.tv_sec = 2; 
2

由於選擇的手冊頁,EINVAL意味着「nfds爲負數或包含在超時值內的值無效」,這表明udpsocket-2或更少。

一個可能的提示:您在fd_set中設置了udpSocket,然後使用udpsocket來計算maxfd。有兩個變量只在單個字符的情況下有所不同,很容易錯過。

相關問題