Tcp Server
1: 当我们的Server接入一个客户端进来以后,就要管理好负责从客户端来接收数据,但是服务器要对多个客户端从不能一直等待这一个客户端有数据进来;
2: 我们的server还要读写数据,总不能一直等着有新的用户进来;
3: 需要一种方式来管理, select模型来管理我们的Tcp Server;
1> 创建一个句柄集合,这个集合里面有要管理的所有的socket(句柄);
2> 使用select等待这些句柄上面;
3> 监听socket有数据进来了,表示有新的连接;
4> 已经建立好连接的socket,有数据进来了,表示服务器收到了客户端的数据;
5> 如果客户端关闭了socket或断网了select也能监测得到;
Select
1: 创建一个监听socket:
int s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (s == INVALID_SOCKET) {
return -1;
}
struct sockaddr_in sockaddr;
sockaddr.sin_addr.S_un.S_addr = inet_addr(“127.0.0.1”);
sockaddr.sin_family = AF_INET;
sockaddr.sin_port = htons(port);
int ret = bind(s, (const struct sockaddr*)&sockaddr, sizeof(sockaddr));
ret = listen(s, 1);
2: 配置句柄管理集合:
fd_set socket_set;
FD_ZERO(&socket_set);
FD_SET(s, &socket_set);
FD_CLR(sock, socket_set);
FD_ISSET(s, &socket_set)
int ret = select(0, &socket_set, NULL, NULL, NULL);
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
//配置windows环境
#ifdef WIN32
#include <WinSock2.h>
#include <Windows.h>
#pragma comment(lib,"WSOCK32.LIB")
#endif // WIN32
/*
Select:
调用select函数,然后任务挂起,等待我们管理的句柄,有事件发生:
1:读数据
2:新的用户进来:
3:关闭
1>准备一个句柄
2>将我们的socket句柄加入到我们这个集合;
3>调用select函数等待在这