我找到了关于如何设置 posix 套接字超时的答案。该答案的 linux 部分:
// LINUX
struct timeval tv;
tv.tv_sec = timeout_in_seconds;
tv.tv_usec = 0;
setsockopt(sockfd, SOL_SOCKET, SO_RCVTIMEO, (const char*)&tv, sizeof tv);
Run Code Online (Sandbox Code Playgroud)
以及 posix 文档中的引用:
Run Code Online (Sandbox Code Playgroud)SO_RCVTIMEO设置超时值,该值指定输入函数完成之前等待的最长时间。它接受一个 timeval 结构,其中包含秒数和微秒数,指定等待输入操作完成的时间限制。如果接收操作已经阻塞了这么长时间而没有接收到额外的数据,则如果没有接收到数据,它将返回部分计数或设置为 [EAGAIN] 或 [EWOULDBLOCK] 的 errno。该选项的默认值为零,这表示接收操作不应超时。该选项采用 timeval 结构。请注意,并非所有实现都允许设置此选项。
我不明白的是:这会导致udp包丢失吗?如果收到udp包超时怎么办?
PS:我知道UDP本质上是不可靠的,所以我的问题实际上主要是关于处理UDP消息时发生超时的情况。
不; 它不会让你更有可能丢包。
研究网络传输如何在较低级别发生;你有一张网卡。当该卡接收数据时,无论您的程序在做什么,它都会将数据存储到自己的内存区域中。当你调用recv时;您要求操作系统将数据从网卡内存移动到程序内存。这意味着如果当你的线程正在做其他事情时有一个数据包进入;它不仅会被删除,还会在您的线程下次获取数据时进行处理。
如果你的线程没有足够频繁地调用recv;那么网卡的内存就会满了。当这种情况发生时,不能存储新的数据包;如果它使用 TCP,那么路由器将被告知它无法处理它;如果是 UDP,那么它将被简单地丢弃。正是这一部分使得 UDP 本质上不可靠,因为它可能在数据包传输过程中的任何时刻发生。
超时影响线程等待数据出现在网卡内存区域的时间;除非你不再调用recv;不影响丢弃的数据包或不影响。
| 归档时间: |
|
| 查看次数: |
1287 次 |
| 最近记录: |