[原创]C 语言select函数
参考链接: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函数的更多相关文章
- linux c语言 select函数用法
linux c语言 select函数用法 表头文件 #i nclude<sys/time.h> #i nclude<sys/types.h> #i nclude<unis ...
- linux c语言 select函数使用方法
linux c语言 select函数使用方法 表头文件 #i nclude<sys/time.h> #i nclude<sys/types.h> #i nclude<un ...
- R 语言 select函数在org.Hs.eg.db上的运用
首先org.Hs.eg.db是一个关于人类的 一,在R中导入包library(org.Hs.eg.db) http://www.bioconductor.org/packages/release/da ...
- select()函数用法二
Select在Socket编程中还是比较重要的,可是对于初学Socket的人来说都不太爱用Select写程序,他们只是习惯写诸如 connect.accept.recv或recvfrom这样的阻塞程序 ...
- 细谈select函数(C语言)
Select在Socket编程中还是比较重要的,可是对于初学Socket的人来说都不太爱用Select写程序,他们只是习惯写诸如connect.accept.recv或recvfrom这样的阻塞程序( ...
- select函数的详细使用(C语言)
Select在Socket编程中还是比较重要的,可是对于初学Socket的人来说都不太爱用Select写程序,他们只是习惯写诸如connect.accept.recv或recvfrom这样的阻塞程序( ...
- 细谈select函数(C语言) -(转自 piaojun_pj的专栏)
Select在Socket编程中还是比较重要的,可是对于初学Socket的人来说都不太爱用Select写程序,他们只是习惯写诸如connect.accept.recv或recvfrom这样的阻塞程序( ...
- c语言中函数的简单介绍
c语言中函数的介绍: 函数,简单的说就是代码的打包.存放在一个地方,当需要的时候调用. 函数分类: 1.无参无返回值函数 void func() 2.无参有返回值函数 int func() 3.有参 ...
- 异步套接字基础:select函数以及FD_ZERO、FD_SET、FD_CLR、FD_ISSET
参考:[原创]技术系列之 网络模型(三)多路复用模型 select函数 select函数: 系统提供select函数来实现多路复用输入/输出模型.原型: #include <sys/time.h ...
随机推荐
- HDU 2058 The sum problem
传送门 Description Given a sequence 1,2,3,......N, your job is to calculate all the possible sub-sequen ...
- iOS - NSError用法规范
iphone跬步之--错误信息 NSError 一.获取系统的错误信息 比如移动文件时,获取文件操作错误: NSError *e = nil;[[NSFileManager defaultMana ...
- Hibernate_增删改
package com.etc.test;import java.util.List;import org.hibernate.Session;import org.hibernate.Session ...
- D/A转换器实验
1.代码: #include<reg52.h>typedef unsigned char u8;typedef unsigned int u16;void delay (u16 num){ ...
- PS------“窗口” -> "扩展功能"使用方法
http://forum.xitek.com/thread-1330039-1-1-1.html
- Ztree的简单使用和后台交互的写法(一)
一.引入ztree的头文件 <!-- 引入ztree/--> <script type="text/javascript" src="${pageCon ...
- jquery条件选择多个元素(与、或者)
或者:选择器用逗号分隔,这也对应了jquery对象转dom为$(obj)[0]的写法 如:$('div[name="a"],div[name="b"]') :h ...
- URL组分
url通常包含多个组成部分,在js中可通过location对象获取其中各项信息 访问http://mp.weixin.qq.com/s?__biz=MjM5NjA0NjgyMA==&mid=2 ...
- 【codeblocks配置】C对Mysql数据的查询
codeblocks 编写C文件连接mysql数据库 codeblocks 设置.1.设置lib库文件: Settings->Compiler settings->Linker setti ...
- Marshal
https://msdn.microsoft.com/en-us/library/aa288468(v=vs.71).aspx http://tomosoft.jp/design/?p=4647 ht ...