目前想写一个代理服务器
思路如下(已写了一个小测试成功):客户端请求--->服务器ACCEPT,客户端(myclient类)存入CMAP.  在new myclient时myclient里会新建一个SOCKET,用于取client请求的网址数据, 并且类里面会开两个线程, 一个收, 一个发, 收和发做了线程同步, 收的时候把数据加进一个链表(一个类), 发从链表里面取.现在的问题就是按这种结构的话, 来一个客户端就会开两个线程, 如此的话50个客户端并发就会有100个线程. 服务器会受不了.所以想求一个解决方法, 或者其它高效的代理服务器结构.

解决方案 »

  1.   

    那最有效率的就是IOCP了,采用完成端口模型
      

  2.   


    楼上的你的回答不切实际啊.  我不可能为了写这个再去从头学这个IOCP啊. 时间来不及.
      

  3.   

    最优选当然是iocp了不过服务器 100个线程都困难的话,也太挫了!
      

  4.   

    单向代理?这个代理的大致结构示意为 Client -> Agent -> Host
    那为什么不采用
    线程1:Recv from Client -> Send To Host
    线程2:Recv from Host -> Send To Client
    中间还加一个链表,不烦么?收到的数据缓存下来,再发送,那当Client跟Agent之间的网络相当好,那么Client就会不断发数据到Agent,而Agent到Host之间的网络相当差的话,那么是不是这些数据会一直缓存在你的链表当中,而这个缓存只有你自己知道,那你有多少内存用来消耗,这样做又有多少必要性?
      

  5.   

    谢谢,
    你的意思是这样的吗: client在accept后存起来, client在send to host时, 代理记录是哪个client发的然后recv时send to记录的client对吗? 那么把cleint在SEND和代理RECV和SEND做同步是吧?
    后面你说的这个缓存起来的问题我还真没考虑过, 很感谢. 目前要按你的想法再做一个CASE测试. 如果我没有理解错你的话的话.
      

  6.   

    对于代理服务器,Accept之后,不应该缓存,代理服务器应该不存在广播或者P2P的需求,那么任何一个客户端连接,只需要理会一个配对的外连服务.如果是基于多线程,那么完全可以采用固定线程池进行迭代处理.通常一个请求过来,那么如果没有被断开连接,那么这个线程就需要一直服务在这一组配对连接上面,直到服务结束(任何一方断开,再次重新请求的另案处理,当做另外一个新用户).
    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();
      

  7.   

    OK, 大概了解了. 那用线程池试试效果先. 谢谢unsigned.