使用TCP套接字时,当无网络连接时,还会继续send,继续recv阻塞,知道TCP自己协议机制判断断开连接时才会停止发送和接收,时间需要几分钟之久。
解决的办法是,自己设置接收超时时间,当超时后重新发送,或者从新初始化socket然后在重新创建socket重新connect
代码如下:  
     int iSendTimeout, iRecvTimeOut;
       iClientSock = socket(AF_INET, SOCK_STREAM, 0);
       if(iClientSock < 0)
       {
               printf("[%s:%d]client init error\r\n", __FILE__, __LINE__);
               return ERROR;
       }
       iRecvTimeOut = 3000;        
       iRet1 = setsockopt(iClientSock, SOL_SOCKET, SO_RCVTIMEO, &iRecvTimeOut, sizeof(int));
       printf("%s\r\n", strerror(errno));
       iSendTimeout = 3000;        
       iRet2 = setsockopt(iClientSock, SOL_SOCKET, SO_SNDTIMEO, (char *)&iSendTimeout, sizeof(int));
       printf("%s\r\n", strerror(errno));
但是编译会出错,perror显示参数错误(Invalid argument ),看了下内核中的实现,参数确实错了,其中最后一个参数是sizeof(struct timeval) 类型的,而非其他类型
改正为:

struct timeval tv;    //声明一个 struct timeval 类型的变量

然后最后个参数写为:
iRet2=setsockopt(iClientSock, SOL_SOCKET, SO_SNDTIMEO, &iSendTimeout, sizeof(tv));
参数解析:
 int setsockopt(int s, int level, int optname,const void *optval, socklen_t optlen);
1)int s :sockfd,即socket文件描述符
2)int level : SOL_SOCKET(通用套接字) ,IPPROTO_TCP,等
3) int optname  :SO_SNDTIMEO(发送超时时间)|SO_RSVTIMEO(接收超时时间)等,设置选项,
4) const void *optval :自定义的超时时间的地址
5) struct timeval的大小,即sizeof(struct timecal)

使用setsockopt()接口,设置TCP的接收与发送超时,Invalid argument错误问题相关推荐

  1. linux C - TCP数据接收和发送示例

    [推荐阅读] 浅谈linux 内核网络 sk_buff 之克隆与复制 深入linux内核架构--进程&线程 了解Docker 依赖的linux内核技术 1.client端(读) #includ ...

  2. 网络基础4(TCP三次握手,四次握手,TCP流量控制,TCP状态转换 , TCP异常断开,设置TCP属性,端口复用)

    TCP协议 TCP通信时序 下图是一次TCP通讯的时序图.TCP连接建立断开.包含大家熟知的三次握手和四次握手. TCP通讯时序 在这个例子中,首先客户端主动发起连接.发送请求,然后服务器端响应请求, ...

  3. TCP实现之:TCP报文接收

    TCP实现之:TCP报文接收 本章节讲述了内核TCP协议层快速收报的流程,包括从IP层将报文传递给TCP层,一直到用户调用系统调用收到报文数据的过程.之所以说是快速收报过程,是因为本文暂不分析异常网络 ...

  4. setsockopt java_setsockopt 设置

    1.closesocket(一般不会立即关闭而经历TIME_WAIT的过程)后想继续重用该socket: BOOL bReuseaddr=TRUE; setsockopt(s,SOL_SOCKET , ...

  5. TCP/IP传输层协议实现 - TCP接收窗口/发送窗口/通告窗口(lwip)

    1.tcp通告窗口/接收窗口/发送窗口 接收端有一个接收窗口大小,接收端只能接收这么多数据,接收窗口的数据需要被上层接收后才释放更大接收空间,才可以接收更多数据:接收窗口之前的数据已经被接收,再次接收 ...

  6. STM32输入捕获模式设置并用DMA接收数据

    参考: STM32的PWM输入模式设置并用DMA接收数据 Input capture mode The input stage samples the corresponding TIx input ...

  7. Redhat中通过命令工具和配置文件设置TCP/IP参数的方法

    Redhat中通过命令工具和配置文件设置TCP/IP参数的方法 ①ifconfig命令 用ifconfig命令修改后重起服务配置不保存 给Eth0接口设置IP地址和子网掩码广播地址并激活:ifconf ...

  8. moxa Nport配置tcp/udp实现数据发送和回传(补充数据接收错乱处理方法)

    moxa Nport配置tcp/udp实现数据发送和回传–记一次吐血经历 目的 现有一内网环境需要连外网进行钉钉推送,开始使用串口连接实体电脑的方式实现,现需要撤除实体电脑,故选用串口服务器的方式实现 ...

  9. 计算机网络课程设计——发送和接收TCP数据包以及发送和捕获ARP数据包

    1.课程设计要求: 发送和接收TCP数据包:TCP是一种面向连接的.可靠的传输层协议.TCP协议工作在网络层IP协议的基础上.本课程设计的目的是设计一个发送和接收TCP数据包的程序,其功能是填充一个T ...

最新文章

  1. 【跃迁之路】【552天】程序员高效学习方法论探索系列(实验阶段309-2018.08.11)...
  2. Manifest值冲突解决方法
  3. Android数据库文件的导出
  4. Git 提交代码 简单步骤
  5. python3中类的继承
  6. 软件构造学习笔记-第十三周
  7. Scrapy框架学习(1)
  8. 概率论和数理统计 - 01
  9. java replace 双引号到单引号
  10. flex弹性盒子的兼容性写法
  11. 指数加权移动平均模型_常见收益模型
  12. 深入理解JVM虚拟机读书笔记——类的加载机制
  13. 有一种努力叫“凌晨四点”
  14. Marked.js让您的文档编辑更加轻松自如!
  15. 【Vertica系列】一、安装建库
  16. 修改多台远程服务器,电脑默认用户名Administrator
  17. ChinaSoft 论坛巡礼 | 泛在操作系统理论、技术与开源生态构建
  18. java计算机毕业设计慧学IT精品课程网站MyBatis+系统+LW文档+源码+调试部署
  19. 反思广交会:人民币升值对中国经济压力有多大?
  20. 什么是领导力?如何提升领导力?

热门文章

  1. python 网页爬取数据生成文字云图
  2. 登录页面跳出框架的JS
  3. Table城市代码翻译
  4. mongodb数据库中插入数据
  5. jprofiler_windows-x64_9_1注册码
  6. Windows 10 Threshold 2 升级记录
  7. linux rar安装
  8. 理解杀毒软件技术的意义 脱壳、虚拟、启发式介绍
  9. [pytorch、学习] - 4.1 模型构造
  10. node --- 模块加载机制