1
如果發生阻塞,UDP套接字blocking on receive
未收到任何數據,也不會收到任何數據,因爲發送方進程因某種原因已崩潰。 套接字選項SO_RCVTIMEO
可以設置爲確保接收系統調用將返回,但是是否存在解決該問題的「已知方法」(因爲超時值不精確並且取決於系統,如果它是緩慢與否)如何防止接收套接字永久阻塞,以防接收到任何數據?
如果發生阻塞,UDP套接字blocking on receive
未收到任何數據,也不會收到任何數據,因爲發送方進程因某種原因已崩潰。 套接字選項SO_RCVTIMEO
可以設置爲確保接收系統調用將返回,但是是否存在解決該問題的「已知方法」(因爲超時值不精確並且取決於系統,如果它是緩慢與否)如何防止接收套接字永久阻塞,以防接收到任何數據?
您可以使用select
函數來了解某個東西已準備好在套接字上讀取。
while (1)
{
int retval;
fd_set rfds;
// one second timeout
struct timeval tv = {1,0};
FD_ZERO(&rfds);
FD_SET(fd, &rfds);
retval = select(1, &rfds, NULL, NULL, &tv);
if (retval == -1)
{
perror("select()");
exit(1);
}
else if (retval)
{
printf("Data is available now.\n");
// if recvfrom() is called here, it won't block
}
else
{
// no data to read... perform other tasks
}
}