求一个代理服务器的解决方案(效率问题)

rotApple 2008-04-30 03:28:43

目前想写一个代理服务器
思路如下(已写了一个小测试成功):

客户端请求--->服务器ACCEPT,客户端(myclient类)存入CMAP. 在new myclient时myclient里会新建一个SOCKET,用于取client请求的网址数据, 并且类里面会开两个线程, 一个收, 一个发, 收和发做了线程同步, 收的时候把数据加进一个链表(一个类), 发从链表里面取.

现在的问题就是按这种结构的话, 来一个客户端就会开两个线程, 如此的话50个客户端并发就会有100个线程. 服务器会受不了.

所以想求一个解决方法, 或者其它高效的代理服务器结构.
...全文
101 15 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
rotApple 2008-05-10
  • 打赏
  • 举报
回复
最终用了IOCP, 结帖了.
rotApple 2008-05-09
  • 打赏
  • 举报
回复
OK, 大概了解了. 那用线程池试试效果先. 谢谢unsigned.
僵哥 2008-05-08
  • 打赏
  • 举报
回复
对于代理服务器,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();
rotApple 2008-05-08
  • 打赏
  • 举报
回复

想了想, 同步的话会有问题, 100个客户端, 第一个发, 网络不好. 阻塞, 到第100个发的时候会等死??
rotApple 2008-05-08
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 unsigned 的回复:]
引用楼主 rotApple 的帖子:
类里面会开两个线程, 一个收, 一个发, 收和发做了线程同步, 收的时候把数据加进一个链表(一个类), 发从链表里面取.

单向代理?这个代理的大致结构示意为 Client -> Agent -> Host
那为什么不采用
线程1:Recv from Client -> Send To Host
线程2:Recv from Host -> Send To Client
中间还加一个链表,不烦么?收到的数据缓存下来,再发送,那当Client跟Agent之间的网络相当好,那么Clie…
[/Quote]


谢谢,
你的意思是这样的吗: client在accept后存起来, client在send to host时, 代理记录是哪个client发的然后recv时send to记录的client对吗? 那么把cleint在SEND和代理RECV和SEND做同步是吧?
后面你说的这个缓存起来的问题我还真没考虑过, 很感谢. 目前要按你的想法再做一个CASE测试. 如果我没有理解错你的话的话.
rotApple 2008-05-08
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 lwykj 的回复:]
最优选当然是iocp了

不过服务器 100个线程都困难的话,也太挫了!
[/Quote]


哈哈. 那也不一定是固定的100个啊. 你不可能只准50个客户连吧?
lzd 2008-05-08
  • 打赏
  • 举报
回复
把客户端加入列表。

用线程池处理
Eleven 2008-05-07
  • 打赏
  • 举报
回复
UP
WinEggDrop 2008-05-07
  • 打赏
  • 举报
回复
一个客户端用一个线程就能解决了,没必要要两个线程.
僵哥 2008-05-06
  • 打赏
  • 举报
回复
[Quote=引用楼主 rotApple 的帖子:]
类里面会开两个线程, 一个收, 一个发, 收和发做了线程同步, 收的时候把数据加进一个链表(一个类), 发从链表里面取.
[/Quote]
单向代理?这个代理的大致结构示意为 Client -> Agent -> Host
那为什么不采用
线程1:Recv from Client -> Send To Host
线程2:Recv from Host -> Send To Client
中间还加一个链表,不烦么?收到的数据缓存下来,再发送,那当Client跟Agent之间的网络相当好,那么Client就会不断发数据到Agent,而Agent到Host之间的网络相当差的话,那么是不是这些数据会一直缓存在你的链表当中,而这个缓存只有你自己知道,那你有多少内存用来消耗,这样做又有多少必要性?
lwykj 2008-05-06
  • 打赏
  • 举报
回复
最优选当然是iocp了

不过服务器 100个线程都困难的话,也太挫了!
rotApple 2008-05-06
  • 打赏
  • 举报
回复
都多少天了?? 只有两个人回答.
meiZiNick 2008-05-01
  • 打赏
  • 举报
回复
都是很好的建议! 值得学习
rotApple 2008-04-30
  • 打赏
  • 举报
回复

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

jwybobo2007 2008-04-30
  • 打赏
  • 举报
回复
那最有效率的就是IOCP了,采用完成端口模型

18,363

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧