select fd_set 按消息到达时间排序
select fd_set order by message time of arrival
我在两个 UDP 套接字上有一个 select
。有时 select
returns 2,因此两个套接字都已准备好接收,但我想首先接收可读取的最旧消息。有什么方法可以存档吗?
我需要先收到最先到达的消息:
- 消息 m1 在时间 t1 到达套接字 s1.
- 消息 m2 在时间 t2 到达套接字 s2.
t1 < t2: 所以我必须先从套接字中获取消息 m1 s1.
现在我有类似的东西:
recived do_recive(fd_set* container, int nfds, int* sockets, unsigned n_sockets) {
// ...
int activity = select(nfds, container, NULL, NULL, NULL);
// ...
for(i=0;i<n_sockets;i++) {
if(FD_ISSET(sockets[i], container)) {
recvfrom(...);
break;
}
}
// ...
}
如果select returns 2,说明你的进程从第一个数据包到达到第二个数据包到达的时间被抢占(没有准备好运行)到达的。所以没有办法知道哪个先到达。就你的流程而言,两个数据包是同时到达的。
另请注意,网络中的路由器可以(并且确实)重新排序和延迟数据包。因此,即使您从一台计算机先发送数据包 A 再发送数据包 B(半秒后),也不能保证数据包 A 会先于 B 到达。一般来说,如果您的代码取决于 UDP 数据包到达的顺序,那么它只是在现实世界中行不通。
我在两个 UDP 套接字上有一个 select
。有时 select
returns 2,因此两个套接字都已准备好接收,但我想首先接收可读取的最旧消息。有什么方法可以存档吗?
我需要先收到最先到达的消息:
- 消息 m1 在时间 t1 到达套接字 s1.
- 消息 m2 在时间 t2 到达套接字 s2.
t1 < t2: 所以我必须先从套接字中获取消息 m1 s1.
现在我有类似的东西:
recived do_recive(fd_set* container, int nfds, int* sockets, unsigned n_sockets) {
// ...
int activity = select(nfds, container, NULL, NULL, NULL);
// ...
for(i=0;i<n_sockets;i++) {
if(FD_ISSET(sockets[i], container)) {
recvfrom(...);
break;
}
}
// ...
}
如果select returns 2,说明你的进程从第一个数据包到达到第二个数据包到达的时间被抢占(没有准备好运行)到达的。所以没有办法知道哪个先到达。就你的流程而言,两个数据包是同时到达的。
另请注意,网络中的路由器可以(并且确实)重新排序和延迟数据包。因此,即使您从一台计算机先发送数据包 A 再发送数据包 B(半秒后),也不能保证数据包 A 会先于 B 到达。一般来说,如果您的代码取决于 UDP 数据包到达的顺序,那么它只是在现实世界中行不通。