参考链接: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. FZU 1752 A^B mod C(快速加、快速幂)

    题目链接: 传送门 A^B mod C Time Limit: 1000MS     Memory Limit: 65536K 思路 快速加和快速幂同时运用,在快速加的时候由于取模耗费不少时间TLE了 ...

  2. BZOJ3393:[USACO LPHONE] 激光通讯

    分层图+堆优化的dijkstra 将原图分为4层,分别是只向上,向下,向左,向右建立边,然后层与层之间的转移很好处理.稠密图,应该用堆优化的dijkstra. //OJ 1845 //by Cydia ...

  3. 【原】dangerouslySetInnerHTML, 让React正常显示你的html代码

    昨天在弄一个让内容换行显示时,遇到一个问题,就是我有<br />的代码在页面中不换行,而是直接显示<br />,代码如下: <!DOCTYPE html> < ...

  4. css009 装饰网站的导航

    css009 装饰网站的导航 1.         选择定义样式的链接 1.连接的状态: A.未访问  a:link{C;} B.已访问  a:visited{ color : red; } C.鼠标 ...

  5. gitlab迁移库地址后远程的切换

    本地需要把origin删除,然后再添加新的origin git remote rm origingit remote add origin [url] git push --set-upstream ...

  6. WebDataGrid设置某行某列的值

    <ig:WebDataGrid ID="grid"  OnRowSelectionChanged="grid_RowSelectionChanged" O ...

  7. UnityShader:HSV(色相,饱和度,亮度)转换

    http://blog.csdn.net/costfine/article/details/46930473 发现其实美术调整颜色的时候大部分都是调整的HSV,因为可以方便的分别调整色相(hue).饱 ...

  8. (转)SVN分支/合并原理及最佳实践

    先说说什么是branch.按照Subversion的说法,一个branch是某个development line(通常是主线也即trunk)的一个拷贝,见下图: branch存在的意义在于,在不干扰t ...

  9. Robot Framework--11 RF结合Jenkins

    转自:http://blog.csdn.net/tulituqi/article/details/17846463 为什么我们要引入RF?其实最初我们引入RF是为了能够快速的开展自动化验收测试,为敏捷 ...

  10. bootloader (run in CLI or Qt-GUI mode)

    1.PC端 https://github.com/cidadao/efm32_loader http://theramblingness.com/2015/07/16/a-gui-and-cli-ut ...