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

rotApple 2008-04-30 03:28:43

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

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

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

所以想求一个解决方法, 或者其它高效的代理服务器结构.
...全文
98 15 打赏 收藏 转发到动态 举报
写回复
用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,356

社区成员

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

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