博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
linux网络编程中的超时设置
阅读量:5309 次
发布时间:2019-06-14

本文共 1124 字,大约阅读时间需要 3 分钟。

1 下面是在网上找到的资料,先非常的感谢。

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

在send(),recv()过程中有时由于网络状况等原因,收发不能预期进行,而设置收发超时控制: 

在下需要注意的是时间的控制结构是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)); 
这样做在环境下是不会产生效果的,须如下定义: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()会立即返回,并收到多少数据返回多少数据。

 

2 项目问题描述

客户端需要每分钟去服务器拉去日志,文件大小不定,为了服务端数据库的备份,当服务端数据库崩溃以后需要修换路径,所以服务端需要重启,那么问题来了,如果正是客户端发送线程的时候服务端断了,怎么办?

现象----->客户端不在继续发送线程,只是下载线程。猜想可能是因为没有收到服务端的确认信息,经过调试发现不是。后来定位到recv这个函数上面。尝试设置超时3秒,出现了新的问题,就是这个文件的发送成无限发送,最终知道勒问题的原因就是:设置的时间太短,以至于文件太大没有发送完,备份数据库就没有清除这个文件编号,导致循环发送。设置为一分钟就好了。

加油骚年。。。。。。。

转载于:https://www.cnblogs.com/lanjianhappy/p/8930827.html

你可能感兴趣的文章
内联汇编实现 memcpy 和 memset
查看>>
css学习笔记
查看>>
关键字--union
查看>>
iOS开发者账号详细介绍
查看>>
Shell入门
查看>>
运算符与格式输出输入4
查看>>
理解事务——原子性、一致性、隔离性和持久性
查看>>
JAVA 大作业——DAY 7
查看>>
深入学习微框架Spring-boot
查看>>
React 同构
查看>>
输入转移
查看>>
.net 获取网站根目录总结
查看>>
bzoj 2039 [2009国家集训队]employ人员雇佣 最小割建图
查看>>
SQL PRIMARY KEY 约束
查看>>
DS28E01典型应用及破解方法
查看>>
ijkplayer实现IMediaDataSource
查看>>
头大啊 红框框位置怎么处理
查看>>
串口——RS232与UART
查看>>
headless browers
查看>>
[c#]控制台进度条的示例
查看>>