关于网络转发 socket句柄保护

SVIP_ 2011-05-24 11:47:46
最近在开发一个网络TCP服务器的时候, 运行至后期客户端多时遇到一个效率问题.

由于服务器端使用了TThreadList来保存客户端的socket句柄, 每次有客户端连接时,
TThreadList.add(nClinetSocket);

有数据时,在发送

TThreadList.lock;

for i= 0 to count-1 do
begin
sendPack(XXXXXXXXXXXXXXX);
end;

TThreadList.Unlock;

效率很低. 各位高手们, 有没有更好的机制提高这种效率呢, 既保证socket句柄的安全性, 又能提高效率.
...全文
104 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
sxhem 2011-06-03
  • 打赏
  • 举报
回复
关注+学习
lyhoo163 2011-05-25
  • 打赏
  • 举报
回复
关注。
yangxie5201314 2011-05-24
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 doorsky123 的回复:]

引用 3 楼 sqldebug_fan 的回复:
引用 1 楼 yangxie5201314 的回复:
用C++得了。

首先这个不是语言的问题。

这个需要用SOCKET端口模型,现在比较流行的是:
1、每个SOCKET开一个线程,类如INDY,每个服务器大概能支持到200-500左右;
2、使用完成端口,这个需要自己编码实现,每个服务器可以支持2000以上,当然具体效率还受限……
[/Quote]
可能他没明白你说的意思。
SVIP_ 2011-05-24
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 sqldebug_fan 的回复:]
引用 1 楼 yangxie5201314 的回复:
用C++得了。

首先这个不是语言的问题。

这个需要用SOCKET端口模型,现在比较流行的是:
1、每个SOCKET开一个线程,类如INDY,每个服务器大概能支持到200-500左右;
2、使用完成端口,这个需要自己编码实现,每个服务器可以支持2000以上,当然具体效率还受限于IO和带宽。
[/Quote]
我现在的问题是在socket句柄管理上, 以及发送效率上. 我使用的网络模型是DXsocket, 它使用的是线程池模式.
SQLDebug_Fan 2011-05-24
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 yangxie5201314 的回复:]
用C++得了。
[/Quote]
首先这个不是语言的问题。

这个需要用SOCKET端口模型,现在比较流行的是:
1、每个SOCKET开一个线程,类如INDY,每个服务器大概能支持到200-500左右;
2、使用完成端口,这个需要自己编码实现,每个服务器可以支持2000以上,当然具体效率还受限于IO和带宽。
SVIP_ 2011-05-24
  • 打赏
  • 举报
回复
C++ 的资料推荐一个. 谢谢
yangxie5201314 2011-05-24
  • 打赏
  • 举报
回复
用C++得了。
SQLDebug_Fan 2011-05-24
  • 打赏
  • 举报
回复
完成端口也是管理SOCKET句柄的一种机制,如果有线程池,楼主应该尽量避免这种调用
TThreadList.lock;

for i= 0 to count-1 do
begin
sendPack(XXXXXXXXXXXXXXX);
end;

你这样做,就相当于是全串行。
SVIP_ 2011-05-24
  • 打赏
  • 举报
回复
在顶一下

1,593

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 网络通信/分布式开发
社区管理员
  • 网络通信/分布式开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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