[00015]-[2015-09-04]-[01]-[WinSocket编程1 Select模型开发]

套接字Select模型是比较常用的一种I/O模型,利用该模型使得Windows Sockets应用程序可以在同一时间内
管理和控制多个套接字,该模型的核心就是select()函数----调用select()函数检查当前多个套接字的状态
----是否可读,可写,有异常。。。。。根据该函数的返回值,判断套接字的可读可写性,然后调用相应的
Windows Sockets API函数完成数据的发送和接收等操作。。。。

【阻塞模式】 套接字执行I/O操作时,如果执行操作的条件没有得到满足,线程会被阻塞在该调用的函数上,
程序不得不处于等待状态,该调用函数什么时候返回,不得而知;

【非阻塞模式】 套接字执行I/O操作时,无论在何种情况下,调用函数都会立即返回,软件设计人员需要编写
更多的代码,对函数返回的错误码(nErrCode)进行处理(GetLastError()),有时候在应用程序中
往往需要在一个循环体内反复调用该函数,直到该函数返回成功结果为止,这显然不是好办法。

【select()函数】
int select(int nfds, fd_set FAR* readfds, fd_set FAR* writefds, fd_set FAR* exceptfds const struct timeval FAR* timeout);

【0】nfds 可被忽略,与Berkeley套接字应用程序兼容
【1】readfds 具有可读性套接字集合的指针;
【2】writefds 具有可写性套接字集合的指针;
【3】exceptfds 检查错误套接字集合的指针;
【4】timeout 设置该select()函数等待时间

#define FD_SETSIZE 64
typedef struct fd_set
{
u_int fd_count;
SOCKET fd_addry[FD_SETSIZE];
}fd_set;

struct timeval
{
long tv_sec;
long tv_usec;
};

timeout == NULL; 表示无限等待,直到条件符合返回
timeout == 0; 立即返回
timeout == **** 表示等待****时间之后返回

FD_CLR(s, *set) 从set集合中删除s套接字
FD_ISSET(s, *set) 检查s是否是set集合中的一名成员
FD_SET(s, *set) 将套接字s加入到set集合中
FD_ZERO(*set) 将set集合初始化为空集合

常用代码结构

SOCKET listenSocket;
FD_SET allfd;
FD_SET readfd;
FD_SET writefd;
int reVal;

FD_ZERO(&allfd);
FD_SET(listenSocket, &allfd);

while(1)
{
FD_ZERO(readfd);
FD_ZERO(writefd);
readfd = allfd;
writefd = allfd;

reVal = select(0, &readfd, &writefd, NULL, NULL);
if(reVal == SOCKET_ERROR)
{
// 错误处理
}
if(reVal > 0)
{
for(int i = 0; i < allfd.fd_count; i++)
{
SOCKET sTmp = allset.fd_array[i];
if(FD_ISSET(sTmp, &readfd)) // 可读性 有数据可读 或者 有连接发起
{
if(sTmp == listenSocket) // 因为listenSocket 不断监听指定端口是否有连接发起,现在有链接发起
{
// 建立新的连接 SOCKET NewAcceptSocket = accept(listenSocket, NULL, NULL);
// ..........
}
else
{
// 有数据可以接受 RecvData()
// ..........
}
}

if(FD_ISSET(sTmp, &writefd))
{
// SendData()
// ...........
}
}
}

}

时间: 2024-11-25 16:32:31

[00015]-[2015-09-04]-[01]-[WinSocket编程1 Select模型开发]的相关文章

【我的书】Unity Shader的书 — 目录(2015.09.04更新)

写在前面 感谢所有点进来看的朋友.没错,我目前打算写一本关于Unity Shader的书. 出书的目的有下面几个: 总结我接触Unity Shader以来的历程,给其他人一个借鉴.我非常明白学Shader的艰难,在群里也见了很多人提出的问题.我觉得学习Shader还是一件有规律可循的事情,但问题是中文资料难觅,而大家又不愿意去看英文...这对我有什么好处呢?强迫我对知识进行梳理,对细节问题把握更清楚. 第二个原因你懂的. 关于本书的定位问题: 面向Unity Shader初学者,但要: 有一定的

socket编程的select模型

在掌握了socket相关的一些函数后,套接字编程还是比较简单的,日常工作中碰到很多的问题就是客户端/服务器模型中,如何让服务端在同一时间高效的处理多个客户端的连接,我们的处理办法可能会是在服务端不停的监听客户端的请求,有新的请求到达时,开辟一个新的线程去和该客户端进行后续处理,但是这样针对每一个客户端都需要去开辟一个新的线程,效率必定底下. 其实,socket编程提供了很多的模型来处理这种情形,我们只要按照模型去实现我们的代码就可以解决这个问题.主要有select模型和重叠I/o模型,以及完成端

2015.09.04 TCP/IP协议

IP IP层(网络层)接收由更低层(网络接口层,例如以太网设备驱动程序)发来的数据包,并把该数据包发送到更高层---TCP或UDP层(传输层):相反,IP层也把从TCP或UDP层接收来的数据包传送到更低层.IP数据包是不可靠的,因为IP并没有做任何事情来确认数据包是否按顺序发送的或者有没有被破坏,IP数据包中含有发送它的主机的地址(源地址)和接收它的主机的地址(目的地址). 高层的TCP和UDP服务在接收数据包时,通常假设包中的源地址是有效的.也可以这样说,IP地址形成了许多服务的认证基础,这些

2015.09.04 数据结构笔记

插入排序:直接插入排序,希尔排序交换排序:冒泡排序,快速排序选择排序:简单选择排序,堆排序归并排序 所有简单排序都是稳定的,所有高级排序都是不稳定的,归并排序是稳定的:所有简单排序时间复杂度都是O(n2),所有高级排序和归并排序都是O(nlogn)所有简单排序和选择排序(如堆排序)辅助空间都是O(1),快速排序为O(logn),归并排序为O(n2)

Javascript DOM 编程艺术读书笔记16/04/01

愚人节快乐 开始用webstorm了,随着学习深入,代码越来越长,因为不借助ide还真是挺难的 今天发现了一个严重的误区,text和textNode是完全不同的两个概念,之前没有特别注意,写代码很容易跳过createTextNode直接用parentNode.appendChild(text) 单独拎出来晒一晒,以后引以为戒 Javascript DOM 编程艺术读书笔记16/04/01

Bentley.STAAD.RCDC.V8i.04.01.01.03 1CD

1.Bentley Multiframe Advanced V8i SS3 17.00.02.10 Win32_64 1CDBentley Multiframe Advanced V8i SS3 17.00.02.10 Win32_64 1CD Multiframe的分析和设计工具给你一个非常强大和灵活的创建.分析和研究结果的结构的手段.Multiframe唯一的一款功能之间使用VBA自动化的结构分析程序.使用自动化,你可... 2.Bentley Utilities Designer V8i

Ubuntu12.04 之 CUDA 编程 (二) ~~~ GPU 程序加速

关于 Ubuntu12.04 下 CUDA5.5 的安装请参看如下链接 Ubuntu-12.04 安装 CUDA-5.5 关于 Ubuntu12.04 下 CUDA5.5 程序的运行请参看如下链接 Ubuntu12.04 之 CUDA 编程 (一) --- GPU 运行程序 1.程序的并行化 前一篇文章讲到了如何利用 CUDA5.5 在 GPU 中运行一个程序.通过程序的运行,我们看到了 GPU 确实可以作为一个运算器,但是,我们在前面的例子中并没有正真的发挥 GPU 并行处理程序的能力,也就是

移植 uboot2012.04.01 到tq2440(1)--建立自己的开发板

首先: 先到官网上下载uboot源码:ftp://ftp.denx.de/pub/u-boot/,使用arm-linux-交叉工具链采用4.4.3版本: 一. 首先建立自己的开发板 拷贝board/samsung/smdk2410/目录到board/tq2440(这个文件夹是自己建立的) [email protected]:~/bootloader/uboot-2012.04.01/u-boot-2012.04.01/board$ cp -a samsung/smdk2410/* ./tq244

我关注的一周技术动态 2015.09.27

分布式系统实践 1. 走向分布式 http://dcaoyuan.github.io/papers/pdfs/Scalability.pdf 要点: 这是台湾的一个作者写的为期30天的分布式系统设计学习小册子, 刚开始涵盖了分布式系统设计的基本理论, 包括partiton, replication和CAP理论, 后面以kafka和zookeeper为例, 将上述理论加以实例化介绍, 内容非常精简, 适合初学者阅读和学习. 2. 如何编写一个分布式数据库 http://mp.weixin.qq.c