单线程的: 异步io通知 WSAEventSelect
单线程上最多只能接受64个event;
改版多线程的 , 大概思路:
1. 主线程就接受一个监听套接字, accept返回的socket 仍到全局队列中
2. 一个分配socket的线程 用于控制 socket 分配到哪个 监听事件的线程中去 [ dispath thread] ;
3. 创建一个线程池 默认4个线程, 每个线程分别监听 WSA_MAXIMUM_WAIT_EVENTS - 1 个事件, 第一个事件用于分派线程通知
有新的socket 来了 ; 这样 4个线程总共可监听 (WSA_MAXIMUM_WAIT_EVENTS - 1 ) * 4 个socket;
代码有点乱, 也没测试过; 纯粹一种思路
用了大量的线程同步,其实不太好 , 可优化很多地方;
#include <iostream>
#include <WinSock2.h>
#include <Windows.h>
#include <stdio.h>
#include <process.h>
#include <deque>
#include <vector>
#include <unordered_map>
#pragma comment(lib, "ws2_32.lib")
#define PORT 9988
using namespace std;
//socket对象
typedef struct _SOCK_OBJ
{
enum {BUFFSIZE = 4096};
SOCKET sock;
char *buf;
_SOCK_OBJ(SOCKET s):sock(s), buf(new char[BUFFSIZE]) {}
~_SOCK_OBJ(){
if(sock != INVALID_SOCKET)
closesocket(sock);
if(buf){
delete [] buf;
}
}
}SOCK_OBJ,*PSOCK_OBJ;
//每个线程一个
typedef struct _THREAD_INFO{
WSAEVENT * event_arr; //所有的事件都在这
HANDLE thread_handle; //线程handler
vector<SOCK_OBJ*> sock_obj_arr; //socket对象
char nCount; // 当前数量
SRWLOCK lock; //读写锁
_THREAD_INFO():nCount(0),event_arr(0){
sock_obj_arr.reserve(WSA_MAXIMUM_WAIT_EVENTS/2);
event_arr = new WSAEVENT[WSA_MAXIMUM_WAIT_EVENTS];
event_arr[0] = WSACreateEvent();
InitializeSRWLock(&lock);
}
//没用到
int get_sock_count() {
int i = 0;
AcquireSRWLockShared(&lock);
i = nCount;
ReleaseSRWLockShared(&lock);
return i;
}
// 触发一次添加操作,