参考链接: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. Beta版本——项目测试

    前端测试 一.测试用例(tutor_distribution_0001) 测试内容 获取下拉框的输入测试 测试代码 $("#sub-confirm").click(function ...

  2. UOJ#246. 【UER #7】套路

    题目传送门 官方题解传送门 一句话题意的话就是给定一个序列,从中找出至少$k$个连续的元素形成子序列,使得子序列中任意两个元素差值的最小值于其长度-1的乘积最大. 题目中给出了$ 1 \leq a_i ...

  3. Linux C/C++ --- “” and <> in the use of head include file(Pending Verification)

    for example: #include <stdlib.h>#include <stdio.h>#include <wiringPi.h>#include &l ...

  4. 淘淘商城基于maven和svn的理解

    首先了解下maven和svn是什么: Maven是一个项目的管理工具,它包含了一个项目对象模型 (Project Object Model),一组标准集合,一个项目的生命周期(Project Life ...

  5. 编译安装redis

    一.版本说明 CentOS版本 [root@localhost ~]# uname Linux [root@localhost ~]# uname -r 2.6.32-431.el6.i686 [ro ...

  6. shiro 更改登录的用户名

    ShiroUser user = (ShiroUser) SecurityUtils.getSubject().getPrincipal(); user.name = newName;

  7. Marshal

    https://msdn.microsoft.com/en-us/library/aa288468(v=vs.71).aspx http://tomosoft.jp/design/?p=4647 ht ...

  8. Hash Table in C

    http://www.sparknotes.com/cs/searching/hashtables/section3.rhtml http://en.literateprograms.org/Spec ...

  9. js与php转换时间戳

    php时间:1368524732 js代码: function getLocalTime(nS) { return new Date(parseInt(nS) * 1000).toLocaleStri ...

  10. 重写UILabler的sizeThatFits方法,需要触发两次才会有效果

    #import "ViewController.h" @interface SpecialLabel:UILabel @end @implementation SpecialLab ...