基于udp的socket通信时,linux系统调用recvfrom函数。
- 函数功能如下:
- 从套接字上接收一个消息。
- recvfrom :可同时应用于面向连接(TCP)的和无连接(UDP)的套接字。
- recv:一般只用在面向连接(TCP)的套接字,几乎等同于recvfrom,只要将recvfrom的第五个参数设置NULL。
- 存在的问题:阻塞等待超时
假如套接字上没有消息可以读取,除非套接字已被设置为非阻塞模式,否则接收recvfrom一直阻塞等待消息的到来。
- 在涉及套接字的I/O操作上设置超时的方法有以下三种:
- 调用alarm。
- 它在指定超时期满时产生SIGALARM。这个方法涉及信号处理,而信号处理在不同的实现上存在差异,而且可能干扰进程中现有的alarm调用。
- 调用select。select有内置的时间限制,在select中阻塞等待I/O,以此替代直接阻塞在read或write调用上。
- 调用套接字函数setsockopt使用SO_RECVTIMEO和SO_SNDTIMEO套接字选项
这里介绍比较简单的setsockopt设置超时时间的方法
文章来源:https://www.toymoban.com/news/detail-560278.html
/* 设置阻塞超时 */
struct timeval timeOut;
timeOut.tv_sec = 5; //设置5s超时
timeOut.tv_usec = 0;
if (setsockopt(sockfd, SOL_SOCKET, SO_RCVTIMEO, &timeOut, sizeof(timeOut)) < 0)
{
printf("time out setting failed\n");
}
.
.
.
/* 数据阻塞接收 */
int receivePacketLen = recvfrom(sockfd,buffer,sizeof(buffer),0,(structsockaddr*)&svr_addr,&addrLen);
if (receivePacketLen == -1 && errno == EAGAIN) //阻塞接收超时
{
printf("timeout, no input!\n");
exit(1);
}
文章来源地址https://www.toymoban.com/news/detail-560278.html
到了这里,关于UDP接收设置阻塞超时的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!