select例子
好长时间没有写了,其实一直在坚持学习。
#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <netinet/in.h>
#include <sys/time.h>
#include <sys/ioctl.h>
#include <unistd.h>
#include <stdlib.h> int main()
{
int server_sockfd, client_sockfd;
int server_len, client_len;
struct sockaddr_in server_address;
struct sockaddr_in client_address;
int result;
fd_set readfds, testfds; server_sockfd = socket(AF_INET, SOCK_STREAM, ); server_address.sin_family = AF_INET;
server_address.sin_addr.s_addr = htonl(INADDR_ANY);//允许任何ip连接
server_address.sin_port = htons();
server_len = sizeof(server_address); bind(server_sockfd, (struct sockaddr*)&server_address, server_len);
listen(server_sockfd, ); FD_ZERO(&readfds);
FD_SET(server_sockfd, &readfds);//将监听套接字放到可读集合中 while(){
char ch;
int fd;
int nread; testfds = readfds; printf("server waiting\n"); result = select(FD_SETSIZE, &testfds, (fd_set*), (fd_set*), (struct timeval*));//时间指针为0:表示一直阻塞,如果返回小于1表示程序出错
if(result < ){
perror("server5");
exit();
} for(fd = ; fd < FD_SETSIZE; ++fd){
if(FD_ISSET(fd, &testfds)){
if(fd == server_sockfd){//监听套接字可读表示,有新连接
client_len = sizeof(client_address);
client_sockfd = accept(server_sockfd, (struct sockaddr*)&client_address, &client_len);
FD_SET(client_sockfd, &readfds);//将客户端套接字放到可读集合中
printf("adding client on fd %d\n", client_sockfd);
}else{
ioctl(fd, FIONREAD, &nread); if(nread == ){//读到0字节表示客户端断开socket
close(fd);
FD_CLR(fd, &readfds);//将套接字从集合中清除
printf("removing client on fd %d\n", fd);
}else{ read(fd, &ch, );
sleep();
printf("serving cient on fd %d\n", fd);
ch++;
write(fd, &ch, );
} }
}
} } }
select例子的更多相关文章
- select、poll、epoll用法
我们先从著名的C10K问题开始探讨,由于早期在网络还不普及的时候,互联网的用户并不是很多,一台服务器同时在线100个用户估计在当时已经算是大型应用了.但是随着互联网的发展,用户群体迅速的扩大,每一个用 ...
- select,poll,epoll之api笔记
参考:http://www.cnblogs.com/Anker/p/3265058.html select /* According to POSIX.1-2001 */ #include <s ...
- vs2012 连接oracle11g 及数据的insert及select 的总结
下载链接Oracle 11g所需的驱动ODTwithODAC1120320_32bit,下载链接为http://www.oracle.com/technetwork/topics/dotnet/uti ...
- mybatis动态sql
MyBatis 采用功能强大的基于 OGNL 的表达式来消除其他元素. if choose(when,otherwise) trim(where,set) foreach 例子(2): &l ...
- 协程、异步IO
协程,又称微线程,纤程.英文名Coroutine,协程是一种用户态的轻量级线程. 协程拥有自己的寄存器上下文和栈.协程调度切换时,将寄存器上下文和栈保存到其他地方,在切回来的时候,恢复先前保存的寄存器 ...
- python之路-Day11
引子 到目前为止,我们已经学了网络并发编程的2个套路, 多进程,多线程,这哥俩的优势和劣势都非常的明显,我们一起来回顾下 协程 协程,又称微线程,纤程.英文名Coroutine.一句话说明什么是线程: ...
- SQL Server安全(5/11):架构与安全(Schemas and Security)
在保密你的服务器和数据,防备当前复杂的攻击,SQL Server有你需要的一切.但在你能有效使用这些安全功能前,你需要理解你面对的威胁和一些基本的安全概念.这篇文章提供了基础,因此你可以对SQL Se ...
- 10月23日上午PHP数组
正则表达式 1.替换 $s = "hello5world"; $s = preg_replace("/\d/","#",$s); echo ...
- Python的平凡之路(10)
异步IO 数据库 队列 缓存 1.Gevent协程 定义:用户态的轻量级线程.协程拥有自己的寄存器上下文和栈.协程调度切换时,将寄存器上下文和栈保存到其他地方,在切回来的时候,恢复先前保存的寄存器上下 ...
随机推荐
- 如何在word中的第3+n页处插入页面并重新从1开始
在插入页码时有时可能会遇到这种情况: word的第一页是文档名称 第二页是目录 第三页才开始是正文,而我们希望看到页码从第三页开始才是第1页. 在第三页的开头,插入分隔符“下一页”,如果office2 ...
- Eclipse运行内存溢出
VM arguments中添加如下: -Xms512m-Xmx1024m-XX:PermSize=256m-XX:MaxPermSize=256m-Xmn128m
- iOS开发--录音简单实现
- iOS开发中的错误整理,AFN框架和MJRefresh框架搭配应该注意的问题
注意问题一:每次请求之前先将之前的请求取消 注意问题二:请求成功之后要判断footer或者header的显示状态 首次下拉刷新,要判断是否已经全部 ...
- Java 测试代码模板
package com.robert.service; import org.apache.commons.logging.Log; import org.apache.commons.logging ...
- Self Host WebApi服务传输层SSL加密(服务器端+客户端调用)
接上篇<WebApi服务URI加密及验证的两种方式>,在实际开发中,仅对URI进行加密是不够的,在传输层采用SSL加密也是必须的. 如果服务寄宿于IIS,那对传输层加密非常简单仅需要配置一 ...
- 网页提示[Not allowed to load local resource: file://XXXX]错误
网页通过http 访问时, 点击打开文件的link.在Chrome 中会报 Not allowed to load local resource: file// XXXX 的错误 <!--Add ...
- Perl 的面向对象编程
转自 http://net.pku.edu.cn/~yhf/tutorial/perl/perl_13.html 拓展阅读 http://bbs.chinaunix.net/forum.php?mod ...
- cocoaPod的使用
因为准备在项目中使用bootstrap,在安装bootstrap过程中提示需要Ruby的版本在1.9.2以上,而目前使用的Ruby版本是Mac系统自带的1.8.7.所以需要对Ruby进行升级.这里使用 ...
- js-JavaScript高级程序设计学习笔记2
第四章 变量.作用域和内存问题 1.ES变量包含两种不同数据类型的值--基本类型值(5种基本数据类型)和引用类型值(保存在内存中的对象,所有引用类型值都是Object的实例) 2.只能给引用类型值动态 ...