recvfrom()函数如何设置为非阻塞模式,超时等待几秒程序就继续往下走

时间:2021-12-21 14:39:12
c++ LINUX socket 非阻塞

9 个解决方案

#1


select 函数可以知道,套接字是否可读,可写等。可读时再用recvfrom读,就不会卡住。
如果做服务器的话,windows下一般用完成端口,linux下用epoll模型。比select复杂些。

#2


一般用ioctlsocket检查是否有内容可读,没内容就跳过,没你这么玩的。

#3


1. 多路复用: select 带timeout 或者其他类似的poll,epoll
2. 异步IO: iocp(windows), asio
3. 非阻塞的socket,  自己轮询。 
4. 多线程:开一个IO线程阻塞读, 读到数据通知主线程。 

方法很多,自己斟酌利弊。 

#4


可以学一下select,对你应该有帮助

#5


用事件模式比较简单http://blog.csdn.net/wanjingwei/article/details/4306609

#6


引用 3 楼 mujiok2003 的回复:
1. 多路复用: select 带timeout 或者其他类似的poll,epoll
2. 异步IO: iocp(windows), asio
3. 非阻塞的socket,  自己轮询。 
4. 多线程:开一个IO线程阻塞读, 读到数据通知主线程。 

方法很多,自己斟酌利弊。 

我做的是网络时间同步,UDP通信方式,我用了select但是发现丢包率很高,但这也不要紧,我可以多发几次请求,关键是有时候读取到的包是响应上一次请求的,即错误的时间报文,请问这个要怎么处理?

#7


引用 1 楼 ml232528 的回复:
select 函数可以知道,套接字是否可读,可写等。可读时再用recvfrom读,就不会卡住。
如果做服务器的话,windows下一般用完成端口,linux下用epoll模型。比select复杂些。

你好我做的是网络时间同步,UDP通信方式,我用了select但是发现丢包率很高,但这也不要紧,我可以多发几次请求,关键是有时候读取到的包是响应上一次请求的,即错误的时间报文,请问这个要怎么处理?

#8


引用 6 楼 hdxxjhuahuo 的回复:
Quote: 引用 3 楼 mujiok2003 的回复:

1. 多路复用: select 带timeout 或者其他类似的poll,epoll
2. 异步IO: iocp(windows), asio
3. 非阻塞的socket,  自己轮询。 
4. 多线程:开一个IO线程阻塞读, 读到数据通知主线程。 

方法很多,自己斟酌利弊。 

我做的是网络时间同步,UDP通信方式,我用了select但是发现丢包率很高,但这也不要紧,我可以多发几次请求,关键是有时候读取到的包是响应上一次请求的,即错误的时间报文,请问这个要怎么处理?

丢包和乱序是UDP的基本特点, 做设计的时候就考虑。 一般做法:1. A/B 连个UDP通道发送相同内容,以减少丢包几率
2. 缓存乱序到底的UDP包, 如果超时或队列长度超限的时候, 判定为丢包。 
3. 丢包的时候,通过TCP去请求发送丢失的包。 

实现起来,比较复杂, 有一个商业话库可以处理这种情况:LBM。 如果应用对丢包、乱序敏感的话, 还是用TCP吧。  
  

#9


引用 8 楼 mujiok2003 的回复:
Quote: 引用 6 楼 hdxxjhuahuo 的回复:

Quote: 引用 3 楼 mujiok2003 的回复:

1. 多路复用: select 带timeout 或者其他类似的poll,epoll
2. 异步IO: iocp(windows), asio
3. 非阻塞的socket,  自己轮询。 
4. 多线程:开一个IO线程阻塞读, 读到数据通知主线程。 

方法很多,自己斟酌利弊。 

我做的是网络时间同步,UDP通信方式,我用了select但是发现丢包率很高,但这也不要紧,我可以多发几次请求,关键是有时候读取到的包是响应上一次请求的,即错误的时间报文,请问这个要怎么处理?

丢包和乱序是UDP的基本特点, 做设计的时候就考虑。 一般做法:1. A/B 连个UDP通道发送相同内容,以减少丢包几率
2. 缓存乱序到底的UDP包, 如果超时或队列长度超限的时候, 判定为丢包。 
3. 丢包的时候,通过TCP去请求发送丢失的包。 

实现起来,比较复杂, 有一个商业话库可以处理这种情况:LBM。 如果应用对丢包、乱序敏感的话, 还是用TCP吧。  
  

谢谢!!

#1


select 函数可以知道,套接字是否可读,可写等。可读时再用recvfrom读,就不会卡住。
如果做服务器的话,windows下一般用完成端口,linux下用epoll模型。比select复杂些。

#2


一般用ioctlsocket检查是否有内容可读,没内容就跳过,没你这么玩的。

#3


1. 多路复用: select 带timeout 或者其他类似的poll,epoll
2. 异步IO: iocp(windows), asio
3. 非阻塞的socket,  自己轮询。 
4. 多线程:开一个IO线程阻塞读, 读到数据通知主线程。 

方法很多,自己斟酌利弊。 

#4


可以学一下select,对你应该有帮助

#5


用事件模式比较简单http://blog.csdn.net/wanjingwei/article/details/4306609

#6


引用 3 楼 mujiok2003 的回复:
1. 多路复用: select 带timeout 或者其他类似的poll,epoll
2. 异步IO: iocp(windows), asio
3. 非阻塞的socket,  自己轮询。 
4. 多线程:开一个IO线程阻塞读, 读到数据通知主线程。 

方法很多,自己斟酌利弊。 

我做的是网络时间同步,UDP通信方式,我用了select但是发现丢包率很高,但这也不要紧,我可以多发几次请求,关键是有时候读取到的包是响应上一次请求的,即错误的时间报文,请问这个要怎么处理?

#7


引用 1 楼 ml232528 的回复:
select 函数可以知道,套接字是否可读,可写等。可读时再用recvfrom读,就不会卡住。
如果做服务器的话,windows下一般用完成端口,linux下用epoll模型。比select复杂些。

你好我做的是网络时间同步,UDP通信方式,我用了select但是发现丢包率很高,但这也不要紧,我可以多发几次请求,关键是有时候读取到的包是响应上一次请求的,即错误的时间报文,请问这个要怎么处理?

#8


引用 6 楼 hdxxjhuahuo 的回复:
Quote: 引用 3 楼 mujiok2003 的回复:

1. 多路复用: select 带timeout 或者其他类似的poll,epoll
2. 异步IO: iocp(windows), asio
3. 非阻塞的socket,  自己轮询。 
4. 多线程:开一个IO线程阻塞读, 读到数据通知主线程。 

方法很多,自己斟酌利弊。 

我做的是网络时间同步,UDP通信方式,我用了select但是发现丢包率很高,但这也不要紧,我可以多发几次请求,关键是有时候读取到的包是响应上一次请求的,即错误的时间报文,请问这个要怎么处理?

丢包和乱序是UDP的基本特点, 做设计的时候就考虑。 一般做法:1. A/B 连个UDP通道发送相同内容,以减少丢包几率
2. 缓存乱序到底的UDP包, 如果超时或队列长度超限的时候, 判定为丢包。 
3. 丢包的时候,通过TCP去请求发送丢失的包。 

实现起来,比较复杂, 有一个商业话库可以处理这种情况:LBM。 如果应用对丢包、乱序敏感的话, 还是用TCP吧。  
  

#9


引用 8 楼 mujiok2003 的回复:
Quote: 引用 6 楼 hdxxjhuahuo 的回复:

Quote: 引用 3 楼 mujiok2003 的回复:

1. 多路复用: select 带timeout 或者其他类似的poll,epoll
2. 异步IO: iocp(windows), asio
3. 非阻塞的socket,  自己轮询。 
4. 多线程:开一个IO线程阻塞读, 读到数据通知主线程。 

方法很多,自己斟酌利弊。 

我做的是网络时间同步,UDP通信方式,我用了select但是发现丢包率很高,但这也不要紧,我可以多发几次请求,关键是有时候读取到的包是响应上一次请求的,即错误的时间报文,请问这个要怎么处理?

丢包和乱序是UDP的基本特点, 做设计的时候就考虑。 一般做法:1. A/B 连个UDP通道发送相同内容,以减少丢包几率
2. 缓存乱序到底的UDP包, 如果超时或队列长度超限的时候, 判定为丢包。 
3. 丢包的时候,通过TCP去请求发送丢失的包。 

实现起来,比较复杂, 有一个商业话库可以处理这种情况:LBM。 如果应用对丢包、乱序敏感的话, 还是用TCP吧。  
  

谢谢!!