select模型
#include<Winsock2.h>
#include<stdio.h>
#pragma comment(lib,"ws2_32.lib")
#pragma warning(disable:4996)
/*
//创建服务器套接字
socket
//绑定本地地址
bind
//进入监听模式
listen
//select模式
//构造fd_set集合
fd_set fdSocket;
//清空fd_set集合并将服务器套接字加入
FD_ZERO(&fdSocket);
FD_SET(sListen, &fdSocket);
//循环
//复制一份fd_set集合并放入select中检测
fd_set fdRead = fdSocket;
int nRet = ::select(0, &fdRead, NULL, NULL, NULL);
//根据select结果进行相应处理(accept read )
*/
int main()
{
//加载套接字库
WSADATA wsaData;
WSAStartup(MAKEWORD(2, 2), &wsaData);
//创建套接字
SOCKET ser = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
//绑定套接字
SOCKADDR_IN addr;
addr.sin_family = AF_INET;
addr.sin_port = htons(4096);
addr.sin_addr.S_un.S_addr = INADDR_ANY;
int b = bind(ser, (sockaddr*)&addr, sizeof(addr));
if (bind != 0)
{
printf("bind error");
return -1;
}
//监听
listen(ser, 5);
//select处理
//初始化文件描述符。添加套接字句柄
fd_set fdSocket;
FD_ZERO(&fdSocket);
FD_SET(ser, &fdSocket);
while (1)
{
//将fdsocket集合的一个拷贝fdRead传递给select函数
//当有时间发生,select函数移除fdRead集合中没有未决I/O操作的套接字句柄,返回
fd_set fdRead = fdSocket;
int nRet = select(0, &fdRead, NULL, NULL, NULL);
if (nRet > 0)
{
//将原来集合fdSocket与Select处理过集合fdRead比较
//确定有哪些套接字有未决I/O,并进一步处理这些I/O
for (int i = 0;i < (int)fdSocket.fd_count;i++)
{
if (FD_ISSET(fdSocket.fd_array[i], &fdRead))
{
if (fdSocket.fd_array[i] == ser) //监听套接字收到新连接
{
if (fdSocket.fd_count < FD_SETSIZE) //如果小于fd_set总数,则将新接受的连接添加进来
{
sockaddr_in addrRemote;
int nAddrLen = sizeof(addrRemote);