在linux的socket编程中,经常会遇到超时设置的问题,例如请求方如果在Ks内不发送数据则服务器要断开连接停止服务。这里我使用select的io复用实现超时5s设置,具体代码片段如下:

fd_set fs;
timeval tv;
tv.tv_sec = 5;
tv.tv_usec = 0;
FD_ZERO(&fs);
FD_SET(socket_fd,&fs);
int ret = select(socket_fd+1,&fs,NULL,NULL,&tv);
if(ret == -1){
fprintf(stderr, "socket_job:run:error.\n");
}else if(ret == 0){
fprintf(stderr, "socket_job:run:time out.\n");
}else{
if(FD_ISSET(socket_fd,&fs)){
int length = 1024*1024;
char* buffer = new char[length];
memset(buffer,0,sizeof(char)*length);
int n = recv(socket_fd,buffer,sizeof(char)*length,0);
if(n > 0){
//deal msg
buffer[length] = '\0';
search_collector* searcher = new search_collector();
string result("");
searcher->search(buffer,10,result);
//send result,result must be end with \n
int result_length = strlen(result.c_str());
ret = send(socket_fd,result.c_str(),result_length,0);
int all_send = 0;
while(ret > 0 && ret < result_length){
result_length -= ret;
all_send += ret;
ret = send(socket_fd,result.c_str()+all_send,result_length,0);
}
}
delete[] buffer;
} }

  

 

使用select io复用实现超时设置的更多相关文章

  1. 实现Linux select IO复用C/S服务器代码

    已在ubuntu 下验证可用 服务器端 #include<stdio.h>#include<unistd.h>#include<stdlib.h>#include& ...

  2. 7.3 5种IO模型与IO复用

    5种IO模型分别如下: 1.阻塞IO模型 当上层应用app1调用recv系统调用时,如果对等方没有发送数据(缓冲区没有数据),上层app1将阻塞(默认行为,被linux内核阻塞). 当对等方发送了数据 ...

  3. imx6中iomux IO复用

    IOMUX Controller (IOMUXC) IO多路复用控制器1.overviewThe IOMUX Controller (IOMUXC), together with the IOMUX, ...

  4. STM8S---选项字节(Option Byte)写操作之IO复用

    功能实现目标   通过对选项字节的写操作来实现TIM2的CH3通道的PWM输出IO复用.能够设置为PA3或者PD2输出. 通过STVP方式操作链接 选项字节   选项字节包含芯片硬件特性的配置和存储器 ...

  5. 套接字IO超时设置和使用select实现超时管理

    在涉及套接字IO超时的设置上有一下3种方法: 1.调用alarm,它在指定的时期满时产生SIGALRM信号.这个方法涉及信号的处理,而信号处理在不同的实现上存在差异,而且可能干扰进程中现有的alarm ...

  6. select、poll、epoll三组IO复用

    int select(int nfds,fd_set* readfds,fd_set* writefds,fd_set* exceptfds,struct timeval* timeout)//其中n ...

  7. linux基础编程:IO模型:阻塞/非阻塞/IO复用 同步/异步 Select/Epoll/AIO(转载)

      IO概念 Linux的内核将所有外部设备都可以看做一个文件来操作.那么我们对与外部设备的操作都可以看做对文件进行操作.我们对一个文件的读写,都通过调用内核提供的系统调用:内核给我们返回一个file ...

  8. 多路IO复用模型--select, poll, epoll

    select 1.select能监听的文件描述符个数受限于FD_SETSIZE,一般为1024,单纯改变进程打开的文件描述符个数并不能改变select监听文件个数 2.解决1024以下客户端时使用se ...

  9. IO复用: select 和poll 到epoll

    linux 提供了select.poll和epoll三种接口来实现多路IO复用.下面总结下这三种接口. select 该函数允许进程指示内核等待多个事件中的任何一个发生,并只在有一个或多个事件发生或经 ...

随机推荐

  1. 使用BeanUtils操作Bean属性

    package com.wzh.test.beanutils; import java.lang.reflect.InvocationTargetException; import java.text ...

  2. IntelliJ IDEA 注册码

    IntelliJ IDEA 注册码 *.lanyus.com及*.qinxi1992.cn下的全部授权服务器已遭JetBrains封杀 请搭建自己的IntelliJ IDEA授权服务器,教程在http ...

  3. request.setCharacterEncoding 和常用内置对象 跳转

    1.直接转码 new String(name.getBytes("ISO8859_1"),"GBK") 2. request.setCharactorEncod ...

  4. [ActionScript3.0] 传递任意数量的参数

    function setAgument(a:int,...rest):void{ for(var i:int=0;i<rest.length;i++){ trace(rest[i]); }}se ...

  5. [datatable]C# DataTable 如何排序

    DataTable dt = new DataTable(); dt.Columns.Add("ProductID", typeof(string)); dt.Columns.Ad ...

  6. Hbase基础操作

    $HBASE_HOME/bin/hbase org.apache.hadoop.hbase.mapreduce.RowCounter 'tablename'

  7. AOP切入点注解报错

    开始学习AOP,出现如下的错误,最后发现是JDK与aspectj,aspectjweaver版本问题造成的.之后改成最新版本,代码运行正常. 利用这些特性可以进行代码的插入,比如权限,缓存结合mecm ...

  8. The 2013 ACM-ICPC Asia Changsha Regional Contest - K

    Pocket Cube Time Limit: 2 Seconds      Memory Limit: 65536 KB Pocket Cube is a 3-D combination puzzl ...

  9. HDU 4118 Holiday's Accommodation

    Holiday's Accommodation Time Limit: 8000/4000 MS (Java/Others)    Memory Limit: 200000/200000 K (Jav ...

  10. Unity原生渲染方案

    Unity原生渲染方案 作者:3dimensions three_dimensions@live.cn 本文为原创内容,转载请注明出处. 做这个的动机是想在原生代码中使用Unity的材质系统绘制,同时 ...