参考链接:http://www.cnblogs.com/GameDeveloper/p/3406565.html

注意点: select() 只是执行一次的超时检测。重新进行select要重新设置“超时时间”以及“句柄”。

connect 非阻塞的例子:

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <time.h>
#include <fcntl.h>
#include <errno.h>
#include <string.h> int main(int argc, char** argv)
{
int sockfd,recvbytes,res,flags,error=-,n;
socklen_t len;
fd_set rset,wset;
struct timeval tval;
struct sockaddr_in serv_addr;
char*sendData="";//发送字符串
char buf[]="/0"; //接收buffer
//创建socket描述符
if((sockfd = socket(AF_INET, SOCK_STREAM, )) == -)
{
perror("socket create failed");
return ;
} serv_addr.sin_family=AF_INET;
serv_addr.sin_port=htons();
serv_addr.sin_addr.s_addr=inet_addr("172.16.0.111");
bzero(&(serv_addr.sin_zero),);
flags=fcntl(sockfd,F_GETFL,);
fcntl(sockfd,F_SETFL,flags|O_NONBLOCK);//设置为非阻塞 if( (res = connect(sockfd, (struct sockaddr *)&serv_addr, sizeof(struct sockaddr)) )< )
{
if(errno != EINPROGRESS)
{
return ;
} } //如果server与client在同一主机上,有些环境socket设为非阻塞会返回 0
// if(0 == res) goto done; while(error!=){ tval.tv_sec=;
tval.tv_usec=; //要在while重新设置时间,否则超时不生效
FD_ZERO(&rset); //要在while重新添加句柄,否则检测不了变化
FD_SET(sockfd,&rset);
wset=rset;
printf("enter while\n"); res = select(sockfd+, NULL, &wset, NULL,&tval) ;
if( res == )
{
perror("connect time out\n");
// close(sockfd);
// return 1;
}
else
{
if(res>){ len=sizeof(error);
getsockopt(sockfd, SOL_SOCKET, SO_ERROR, &error, &len); printf("error:%d\n", error);
if(error)
{
fprintf(stderr, "Error in connection() %d - %s\n", error, strerror(error));
// return 1;
} } }
} if(res !=)
{
printf("done\n");
if( (n = send(sockfd, sendData, strlen(sendData),) ) ==- )
{ perror("send error!");
close(sockfd);
return ;
}
if( ( n = select(sockfd+,&rset,NULL, NULL,&tval)) <= )//rset没有使用过,不用重新置为sockfd
{
perror("receive time out or connect error");
close(sockfd);
return -;
}
if((recvbytes=recv(sockfd, buf, , )) ==-)
{
perror("recv error!");
close(sockfd);
return ;
} printf("receive num %d\n",recvbytes);
printf("%s\n",buf); }
}

[原创]C 语言select函数的更多相关文章

  1. linux c语言 select函数用法

    linux c语言 select函数用法 表头文件 #i nclude<sys/time.h> #i nclude<sys/types.h> #i nclude<unis ...

  2. linux c语言 select函数使用方法

    linux c语言 select函数使用方法 表头文件 #i nclude<sys/time.h> #i nclude<sys/types.h> #i nclude<un ...

  3. R 语言 select函数在org.Hs.eg.db上的运用

    首先org.Hs.eg.db是一个关于人类的 一,在R中导入包library(org.Hs.eg.db) http://www.bioconductor.org/packages/release/da ...

  4. select()函数用法二

    Select在Socket编程中还是比较重要的,可是对于初学Socket的人来说都不太爱用Select写程序,他们只是习惯写诸如 connect.accept.recv或recvfrom这样的阻塞程序 ...

  5. 细谈select函数(C语言)

    Select在Socket编程中还是比较重要的,可是对于初学Socket的人来说都不太爱用Select写程序,他们只是习惯写诸如connect.accept.recv或recvfrom这样的阻塞程序( ...

  6. select函数的详细使用(C语言)

    Select在Socket编程中还是比较重要的,可是对于初学Socket的人来说都不太爱用Select写程序,他们只是习惯写诸如connect.accept.recv或recvfrom这样的阻塞程序( ...

  7. 细谈select函数(C语言) -(转自 piaojun_pj的专栏)

    Select在Socket编程中还是比较重要的,可是对于初学Socket的人来说都不太爱用Select写程序,他们只是习惯写诸如connect.accept.recv或recvfrom这样的阻塞程序( ...

  8. c语言中函数的简单介绍

    c语言中函数的介绍: 函数,简单的说就是代码的打包.存放在一个地方,当需要的时候调用. 函数分类: 1.无参无返回值函数 void func() 2.无参有返回值函数  int func() 3.有参 ...

  9. 异步套接字基础:select函数以及FD_ZERO、FD_SET、FD_CLR、FD_ISSET

    参考:[原创]技术系列之 网络模型(三)多路复用模型 select函数 select函数: 系统提供select函数来实现多路复用输入/输出模型.原型: #include <sys/time.h ...

随机推荐

  1. [Android]ListFragment.setEmptyText() 抛 java.lang.IllegalStateException

    在ListFragment子类中直接调用setEmptyText(getString(R.string.msg_no_invited_parties)), 抛java.lang.IllegalStat ...

  2. Docker探索系列1之docker入门安装与操作

    preface docker这种时髦的技术我接触的比较晚,如果不是公司在使用这项技术,估计还得会更晚接触.好了,说下我司现在docker使用的情况.docker在我司是用来跑web服务的,里面的web ...

  3. python3,交互模式,无法使用ctrl和方向键,需要和ctrl一块用

    转自csdn博客 http://blog.csdn.net/pumaadamsjack/article/details/52447989 https://pypi.python.org/pypi/re ...

  4. OC之从键盘输入NSString字符串

    方法一: char *a; static char z; a = &z; gets(a); NSString *intput = [NSString stringWithUTF8String: ...

  5. css006 文本格式化

    css006 文本格式化 文本格式化:字体(font-family).颜色(color).字号(font-size). 行距(line-height).粗体(font-weight).斜体(font- ...

  6. SMO推导和代码-记录毕业论文4

    SMO的数学公式通过Platt的论文和看这个博客:http://www.cnblogs.com/jerrylead/archive/2011/03/18/1988419.html,大概弄懂了.推导以后 ...

  7. 在不同的pyhon版本中切换

    issue discription 在一台电脑上同时安装了python2.7和python3.5,怎样在这两个版本中切换调用? solution to the issue 进入python安装文件夹, ...

  8. JQuery------Select标签的各种使用方法

    optioin属性(value) <option value='>Hello</option> option的点击事件 <select class="s-one ...

  9. 分页进阶--ajax+jquery+struts2

    按照上次的分页逻辑,分页查询的业务大概需要几个“零件”:1.当前页:2.总页数:3.跳转页.后端需要处理的是:按照传送过来请求的页码返回相应地数据,并且接受初始化参数的请求:总页码.第一页的数据. 使 ...

  10. c++编译错误提示及解决

    IntelliSense: #error 指令: Please use the /MD switch for _AFXDLL builds 修改设置:工程(Project)-> 属性(Prope ...