1:select内部是个数组,而epoll内部结构是红黑二叉树
2:select查询起来慢,而epoll查询起来快
3:每次循环,内部都要发生拷贝(查看相关代码)而epoll不需要这样的操作,也就是初始化一次拷贝
#include
#include<winsock2.h>
#include<windows.h>
#include
#include
int main()
{
std::vectorclients;
WSAData data;
if (WSAStartup(MAKEWORD(2, 2), &data) == SOCKET_ERROR) {
std::cout << (“WSAStartUp Error”) << std::endl;
}
SOCKET socket_fd = socket(AF_INET, SOCK_STREAM, 0);
sockaddr_in add_ress;
add_ress.sin_family = AF_INET;
add_ress.sin_port = htons(8080); //绑定端口号
add_ress.sin_addr.S_un.S_addr = htonl(INADDR_ANY); //能够接受任意ip地址消息
bind(socket_fd, (sockaddr*)&add_ress, sizeof(add_ress));
listen(socket_fd, 5);在这里插入代码片
fd_set read_fd;
fd_set temp_fd;
FD_ZERO(&read_fd);
FD_ZERO(&temp_fd);
FD_SET(socket_fd, &read_fd);
TIMEVAL tv;//设置超时等待时间
tv.tv_sec = 1;
tv.tv_usec = 0;
std::size_t max_fd = socket_fd;
while (1) {
temp_fd = read_fd;
//因为底层内部实现会删除temp_fd的集合,因此要加一个局部数据
int ret = select(max_fd + 1, &temp_fd, NULL, NULL, &tv); //最后一个参数表上阻塞
if (ret == -1) {
break;
}
//如果socket_fd在temp_fd集合内,说有事件来了
if (FD_ISSET(socket_fd, &temp_fd)) {
sockaddr_in add_client;
int len = sizeof(add_client);
SOCKET client_fd = accept(socket_fd, (SOCKADDR*)&add_client, &len);
clients.emplace_back(client_fd);
FD_SET(client_fd, &read_fd);
auto fd = std::find_if(clients.begin(), clients.end(), [max_fd](SOCKET fd)->bool {return fd > max_fd;});
if (fd != clients.end()) {
max_fd = *fd; //更新fd
}
}
else {
//其实从这地方也能看出,select的底层结构是数组,
int count = clients.size();
for (int i = 0;i < count;++i) {
if (FD_ISSET(clients[i], &temp_fd)) {
char buffer[100] = { 0 };
int bytes = recv(clients[i], buffer, 100, 0);
if (bytes == -1) {
continue;
}
if (bytes == 0) {//客户端退出了
SOCKET temp_fd = clients[i];
closesocket(temp_fd);
clients.erase(clients.begin()+i);
FD_CLR(temp_fd, &read_fd);
//read_fd.fd_array[i] = 0; //傻逼底层,竟然不删除,垃圾
auto fd = std::find_if(clients.begin(), clients.end(), [max_fd](SOCKET fd)->bool {return fd > max_fd;});
if (fd == clients.end()) {
max_fd = socket_fd;
}
else {
max_fd = *fd; //更新fd
}
continue;
}
else {
//处理消息, 不写了
}
}
}
}
}
}
select的列子说明select内部实现原理
最新推荐文章于 2022-07-04 12:17:17 发布