首先和formost,我沒有把這個標記爲'pselect'的問題,所以我選擇了'select'。pselect被正式中斷
我使用pselect來處理UDP套接字上的超時。代碼如下所示:
UDP_STATUS udp_socket_recv(udp_socket_t* p_sock, int* p_bytes_rcvd)
{
int res = 0;
fd_set fds;
struct timespec timeout;
FD_ZERO(&fds);
FD_SET(p_sock->m_socket, &fds);
if (p_sock->m_timeout == NULL) {
res = pselect(p_sock->m_socket + 1, &fds, NULL, NULL, NULL, NULL);
} else {
timeout.tv_sec = p_sock->m_timeout->tv_sec;
timeout.tv_msec = p_sock->m_timeout->tv_usec * 1000;
res = pselect(p_sock->m_socket + 1, &fds, NULL, NULL, &timeout, NULL);
}
if (res == 0)
return UDP_TIMEOUT;
else if (res == -1) {
printf("pselect error: %s\n", strerror(errno)); /* Sometimes we end up here */
return UDP_FAILURE;
}
res = recvfrom(p_sock->m_socket, ..); /* etc etc */
}
現在,上面的作品只是在案件絕大多數罰款(雖然我可能misstyped的東西,因爲我沒有獲得複製/粘貼)。但是,pselect有時會返回-1,而strerror(errno)調用會打印「中斷的系統調用」。
我甚至不知道這是你想怎麼辦插座超時,我可以不記得我是怎麼想出了這個解決方案...
任何幫助深表感謝。
那麼,這只是一箇中斷的系統調用。再次調用pselect(),mybe它會成功。順便說一下'if(p_sock-> m_timeout == NULL){'如果超時值爲NULL,則只調用pselect。您可能還想在'else {...}'情況下調用pselect()。 – wildplasser
是的,我很抱歉,我忘記了else子句中的pselect。 關於再次調用pselect,如果再次失敗會怎麼樣? – user1986698