目前想写一个代理服务器
思路如下(已写了一个小测试成功):客户端请求--->服务器ACCEPT,客户端(myclient类)存入CMAP. 在new myclient时myclient里会新建一个SOCKET,用于取client请求的网址数据, 并且类里面会开两个线程, 一个收, 一个发, 收和发做了线程同步, 收的时候把数据加进一个链表(一个类), 发从链表里面取.现在的问题就是按这种结构的话, 来一个客户端就会开两个线程, 如此的话50个客户端并发就会有100个线程. 服务器会受不了.所以想求一个解决方法, 或者其它高效的代理服务器结构.
楼上的你的回答不切实际啊. 我不可能为了写这个再去从头学这个IOCP啊. 时间来不及.
那为什么不采用
线程1:Recv from Client -> Send To Host
线程2:Recv from Host -> Send To Client
中间还加一个链表,不烦么?收到的数据缓存下来,再发送,那当Client跟Agent之间的网络相当好,那么Client就会不断发数据到Agent,而Agent到Host之间的网络相当差的话,那么是不是这些数据会一直缓存在你的链表当中,而这个缓存只有你自己知道,那你有多少内存用来消耗,这样做又有多少必要性?
你的意思是这样的吗: client在accept后存起来, client在send to host时, 代理记录是哪个client发的然后recv时send to记录的client对吗? 那么把cleint在SEND和代理RECV和SEND做同步是吧?
后面你说的这个缓存起来的问题我还真没考虑过, 很感谢. 目前要按你的想法再做一个CASE测试. 如果我没有理解错你的话的话.
if(WSAStartup(...)) return;
SOCKET Listener = socket(...);
if(NOT(INVALID(Listener))) return;
...
if(SOCKET_ERROR==bind(Listener...)) return;
if(SOCKET_ERROR==listen(Listener,SOMAXCONN)) return;
while(NOT(IsTerminated))
{
THREAD T=GetFreeThread();//取得空闲线程
if(NOT(T))//如果没有空闲线程
WaitThreadOrTerminated();//等待空闲线程信号或者退出信号
if(IsTerminated) continue;//退出
SOCKET Client = accept(Listener...);//接受连接
IsTerminated = IsTerminated || ERROR() || INVALID(Client);//判断是否退出,是否发生错误,是否有效连接
if(IsTerminated) {
if(NOT(INVALID(Client)))
closesocket(Client...);
continue;
}
if(NOT(JoinClient(Client,T)))//交给线程处理连接
closesocket(Client...);
}
WSACleanup();