//设置发送超时
你只发送, 并发送足够多的数据以填满发送缓冲区, 接收端一直不接收.
发送端一量满发送缓冲区就会阻塞, 如果你设置了发送超时, 超时到了它就会返回发送超时了.

在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()函数就能很好的满足我们的要求:

但用这进行测试时有一个地方是需要注意的,即select()的第五个参数timeval *timeout的问题。设置好timeout的始值后,如果只对select()调用一次,是没有任何问题的,但一旦多次调用,你就会发现怎么好像我设置的timeout值只有第一次有用呢,以后select()总是一刻也不等就返回了呢?

通过查看man和自己测试,原来select()函数内部是会不断更新timeout的值的,以查看超时时间还剩多少。那么第一次调用之后,timeout的值就被更新至0了,以后不管你再调用它多少次,select()都会立即返回了,这就是为什么会出现在多次调用时,select()只有第一次时凑效的缘由了,哈哈,以后再使用它时,要尤其注意这一点了。但它的兄弟函数pselect()没有它的这个问题,它不会在内部在时间值进行更新的。

socket在每次执行select的时候都得要重新对time进行赋值 防止select修改了time参数 对下一次的判断造成干扰
for (i = ; i < waittimeout ; i++)
{
FD_SET(fd , &fdr);
sTime.tv_sec = ;
sTime.tv_usec = ; iRet = select(iMax , &fdr , NULL , NULL , &sTime);
if (iRet == -)
{
LOG_TRACE(&gLogger, "select -1");
return -;
}
else if (iRet > )
{
LOG_TRACE(&gLogger, "wait %ds sock readalbe, select=%d", i, iRet);
return ;
}
}

select 设置发送超时发送注意事项的更多相关文章

  1. Android使用AsyncTask设置请求超时的注意事项

    备注:该篇文章为原创,转载请声明地址,谢谢! /** * AsyncTaskTools2集成了AsyncTask类 * 前三个参数为回到函数,最后一个为全局的Context */ final Asyn ...

  2. Windows 和 Linux下使用socket下载网页页面内容(可设置接收/发送超时)的代码

    主要难点在于设置recv()与send()的超时时间,具体要注意的事项,请看代码注释部分,下面是代码: #include <stdio.h> #include <sys/types. ...

  3. 设置socket接收和发送超时的一种方式

    Linux环境设置Socket接收和发送超时: 须如下定义:struct timeval timeout = {3,0};  //设置发送超时setsockopt(socket,SOL_SOCKET, ...

  4. 接口调试工具ApiPost的发送超时时间设置方法

    有部分使用ApiPost的同学反应:发送接口调试时,响应超时时间设置的太短导致接口访问失败,怎么设置呢? 就连百度也有很多人在搜: 今天就来说一说. ApiPost简介: ApiPost是一个支持团队 ...

  5. Go基础系列:为select设置超时时间

    Go channel系列: channel入门 为select设置超时时间 nil channel用法示例 双层channel用法示例 指定goroutine的执行顺序 After() 谁也无法保证某 ...

  6. LODOP设置同一个任务发送到不同打印机

    前面的博文Lodop打印语句最基本结构介绍(什么是一个任务),一个任务只能有一个打印语句(最后PRINT,PRINTA,PREVIEW等),如果执行多个,LODOP会弹出多次,C-LODOP会提示窗口 ...

  7. C# 的tcp Socket设置自定义超时时间

    简单的c# TCP通讯(TcpListener) C# 的TCP Socket (同步方式) C# 的TCP Socket (异步方式) C# 的tcp Socket设置自定义超时时间 C# TCP ...

  8. 【开源项目13】Volley框架 以及 设置request超时时间

    Volley提供了优美的框架,使android程序网络访问更容易.更快. Volley抽象实现了底层的HTTP Client库,我们不需关注HTTP Client细节,专注于写出更加漂亮.干净的RES ...

  9. android 中设置HttpURLConnection 超时并判断是否超时

    设置超时: URL url1 = new URL(url); HttpURLConnection conn = (HttpURLConnection) url1.openConnection(); c ...

随机推荐

  1. Android 进阶8:进程通信之 Binder 机制浅析

    读完本文你将了解: IBinder Binder Binder 通信机制 Binder 驱动 Service Manager Binder 机制跨进程通信流程 Binder 机制的优点 总结 Than ...

  2. linux进程通信全面解析

      进程IPC 的 7种方式 linux下 进程通讯IPC的方式主要有以下7种: 1.文件 2.共享内存 3.信号 4.管道 5.套接字 6.消息列队 7.信号量   以下正文 中 一一 分析下: 1 ...

  3. PHP 去掉文文文件中的回车与空格

    文本文件fff.txt中去除回车与空格: $aa = file_get_contents('./fff.txt'); $bb = str_replace(array("\r\n", ...

  4. HDU2032 杨辉三角

    解题思路:不要小看这题水题,如果数据类型没有用long long, 当n开为35时,会出现TLE,而且会报非法内存访问,现在还 不理解为什么,若有高手,请不吝赐教. 上代码: #include< ...

  5. [转载] 使用FFmpeg捕获一帧摄像头图像

    最近在研究FFmpeg,比较惊讶的是网上一大堆资料都是在说如何从已有的视频中截取一帧图像,却很少说到如何直接从摄像头中捕获一帧图像,其实我一直有个疑问,就是在Linux下,大家是用什么库来采集摄像头的 ...

  6. POJ1160 Post Office (四边形不等式优化DP)

    There is a straight highway with villages alongside the highway. The highway is represented as an in ...

  7. wifi文件传输

    步骤: 1.下载CocoaHTTPServer 2.解压后,将CocoaHTTPServer-master目录下的Core导入工程. 3.打开Samples/SimpleFileUploadServe ...

  8. RecyclerView 初体验

    网上看了很多 RecyclerView 的教程,也结合学长的代码,终于实现了一个不错看的过去的List 可以通过左滑删除Item 长按Item或者点击按钮,可以对Item进行拖拽 更具体的内容会写在代 ...

  9. JAMstack 技术要点

    1.  简要说明 Modern web development architecture based on client-side JavaScript, reusable APIs,and preb ...

  10. 封装Socket.BeginReceive/EndReceive以支持Timeout

    Socket .NET中的Socket类提供了网络通信常用的方法,分别提供了同步和异步两个版本,其中异步的实现是基于APM异步模式实现,即BeginXXX/EndXXX的方式.异步方法由于其非阻塞的特 ...