用setsockopt()来控制recv()与send()的超时

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情
在send(),recv()过程中有时由于网络状况等原因,收发不能预期进行,而设置收发超时控制:
在Linux下需要注意的是时间的控制结构是struct timeval而并不是某一整型数,以下是来自于网上一篇文章中的摘录,它是这样写的:
int nNetTimeout=1000;//1秒,
//设置发送超时
setsockopt(socket,SOL_SOCKET,SO_SNDTIMEO,(char *)&nNetTimeout,sizeof(int));
//设置接收超时
setsockopt(socket,SOL_SOCKET,SO_RCVTIMEO,(char *)&nNetTimeout,sizeof(int));
这样做在Linux环境下是不会产生效果的须如下定义:struct timeval timeout = {3,0}; 
 
//设置发送超时
setsockopt(socket,SOL_SOCKET,SO_SNDTIMEO,(char *)&timeout,sizeof(struct timeval));
//设置接收超时
setsockopt(socket,SOL_SOCKET,SO_RCVTIMEO,(char *)&timeout,sizeof(struct timeval));
有两点注意就是
1)recv ()的第四个参数需为MSG_WAITALL,在阻塞模式下不等到指定数目的数据不会返回,除非超时时间到。还要注意的是只要设置了接收超时,在没有MSG_WAITALL时也是有效的。说到底超时就是不让你的程序老在那儿等,到一定时间进行一次返回而已。
2)即使等待超时时间值未到,但对方已经关闭了socket, 则此时recv()会立即返回,并收到多少数据返回多少数据。

网络编程——超时检测(select()、poll()和 setsockopt()的设置合理的超时检测机制) 网络编程中的超时检测是确保程序高性能和可靠性的关键一环。本文介绍了多种超时检测方法,包括使用 select()、poll() 函数,设置 setsockopt() 选项,使用时间戳和定时器,以及使用非阻塞套接字等。具体的使用方法取决于编程需求和特定的情况。合理地选择并使用这些方法,可以有效地避免程序长时间阻塞,并保障系统在网络故障或其他异常情况下的稳定运行。在进行网络编程时,请务必重视超时检测,并根据实际情况选择适合的方法,从而提高网络应用的性能和健壮性。 阅读详情

相关推荐

socketsendrecv超时设置

二、send超时不会体现在对send函数的调用上,看msdn的解释:If no buffer space is available within the transport system to hold the data to be transmitted, send will block unless the socket has been placed in nonblocking mode.即只要协议栈缓冲区窗口没满,send就会成功。一、socket必须是阻塞类型的,否则设置超时毫无意义。

码农code之路 2851

python socket单线程任务解决recv()超时问题

问题描述 Jetson Nano控制深度相机intelrealsense在远端负责远程数据采样,但是由于intelrealsense的pipeline只能被一个线程连接,为了防止远端TCP客户端强制掉电,任务卡在connect.recv(),需要对连接添加一个超时机制,关闭TCP连接。 方法 使用socket.setdefaulttimeout(time)函数 该函数在设置超时的time后,当connect.recv()超过设定时间就会抛出一个timeout异常。通过捕捉异常跳出connect.recv()

P_Leung的技术博客 9004

关于socketsendrecv超时设置

一、socket必须是阻塞类型的,否则设置超时毫无意义。 二、send超时不会体现在对send函数的调用上,看msdn的解释:If no buffer space is available within the transport system to hold the data to be transmitted, send will block unless the socket has

学而不思则罔 1万+

python recv timeout_如何在python的socket recv方法上设置超时

如何在python的socket recv方法上设置超时?我需要在python&#s套接字recv方法上设置超时。 怎么做?8个解决方案103 votes典型的方法是使用select()等待数据可用或直到超时发生。 仅在数据实际可用时调用recv()。 为了安全起见,我们还将套接字设置为非阻塞模式,以保证socket.settimeout()永远不会无限期阻塞。 select()也可以用于一次等待...

weixin_39543647的博客 3464

setsockopt()设定recv()send()超时控制

setsockopt()设定recv()send()超时控制send(),recv()过程中有时由于网络状况等原因,收发不能预期进行,而设置收发超时控制: 在Linux下需要注意的是时间的控制结构是struct timeval而并不是某一整型数,以下是来自于网上一篇文章中的摘录,它是这样写的: int nNetTimeout=1000;//1秒, /

GNU'S Not Unix 2077

linux下用setsockopt()控制recv()send()超时

send(),recv()过程中有时由于网络状况等原因,收发不能预期进行,而设置收发超时控制: 在Linux下需要注意的是时间的控制结构是struct timeval而并不是某一整型数,以下是来自于网上一篇文章中的摘录,它是这样写的: int nNetTimeout=1000;//1秒, //设置发送超时 setsockopt(socket,SOL_SOCKET,SO_SNDTIME

libinbin_1014的专栏 1327

setsockopt()控制recv()send()超时 【转】

send(),recv()过程中有时由于网络状况等原因,收发不能预期进行,而设置收发超时控制: 在Linux下需要注意的是时间的控制结构是struct timeval而并不是某一整型数,以下是来自于网上一篇文章中的摘录,它是这样写的: int nNetTimeout=1000;//1秒, //设置发送超时 setsockopt(socket,SOL_SOCKET,SO_SNDTIMEO,(char *)&nNetTimeout,sizeof(int)); //设置接收超时 setsockopt(s

weixin_43390708的博客 510

setsockopt()控制recv()send()超时[转]

setsockopt()控制recv()send()超时[转] 在send(),recv()过程中有时由于网络状况等原因,收发不能预期进行,而设置收发超时控制: 在Linux下需要注意的是时间的控制结构是struct timeval而并不是某一整型数,以下是来自于网上一篇文章中的摘录,它是这样写的: int nNetTimeout=1000;//1秒, //设置发送

occupy8的专栏 974
上一篇: Linux中使用select()注意事项
下一篇: RedBoot部分操作命令
newger
博客等级 码龄19年 15粉丝 27原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值