用mfc基于tcp写的聊天软件性能改进求助。

ithzhang
博客专家认证
2011-11-05 10:55:26
这几天一直在写一个聊天程序。基于tcp的,原来打算用udp,后来觉得无连接的不靠谱,就写了个基于tcp的。分为客户端和服务器端,服务器负责处理客户端的请求。

开始时服务器绑定一个ip监听一个端口,在mfc定义了一个WM_SOCKET消息,一旦有消息进来,OnSocket函数会被调用。它里面处理连接进入和连接关闭,以及有内容发送进来。这三个消息。

当有新连接进入,服务器将接受它的连接,并把它添加到当前在线用户列表中。并将当前列表的内容发给所有客户端,让们更新好友列表。

当有连接断开,服务器将断开的连接从当前列表删除,并将当前列表的内容发给所有客户端,让他们更新好友列表。

当服务器收到客户端发来的内容时,如果是要转发给其他客户端,服务器会提取出转发的目的地址和转发的内容,然后将消息转发出。
我在自己的机器上试验了很多次,也开了好几个客户端,反应都很快。无论是转发消息还是通知各客户端更新列表。

当我在局域网内的其他机器上也试验下,其他机器的客户端给我机器上的客户端发消息时每次都有很大的延迟,一旦消息发的快了还会丢收不到。但反过来就没有问题。

采用了几种改进方法:
1,新建线程,使用事件对象。在InitInstance时创建线程,
while(1)
{
WaitForSingleObject(hEvent....);
执行动作。
}
然后要转发的消息到来时,SetEvent();

2:采用线程池。由系统对各线程进行管理。

两种方法都试过,都是跟原来没有区别。不知道这么回事。求前辈指教。谢谢。
...全文
218 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
ithzhang 2011-12-02
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 anonymous911 的回复:]
改成UDP的吧。另外建议楼主看一些异步IO的东西。
[/Quote]我已经改成UDP的了。好像好多了。谢谢。可以加你为好友吗。
anonymous911 2011-12-02
  • 打赏
  • 举报
回复
改成UDP的吧。另外建议楼主看一些异步IO的东西。
ithzhang 2011-11-06
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 qq120848369 的回复:]
聊天软件是实时的,转发速度快,很轻量的数据处理.

如果你把这个程序写成多线程的,不管是每个线程I/O复用若干个socket还是每个线程只服务一个socket(弱爆了),都避免不了一个问题就是加锁访问共享哈希表实现消息转发与加锁跨传递消息给其他线程.

楼主还是需要学习一下I/O复用那些API了.
[/Quote]可以说的更详细点儿吗。非常感谢。
ithzhang 2011-11-06
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 taodm 的回复:]
同时几个客户端啊?
[/Quote]语句里有个限制最多可以连接2个各客户端。但是我一般测试的时候只是开个两三个。都存在想同一局域网内的其他机器上的客户端发消息使得延迟。本台机器上相互发则没有问题。
qq120848369 2011-11-06
  • 打赏
  • 举报
回复
聊天软件是实时的,转发速度快,很轻量的数据处理.

如果你把这个程序写成多线程的,不管是每个线程I/O复用若干个socket还是每个线程只服务一个socket(弱爆了),都避免不了一个问题就是加锁访问共享哈希表实现消息转发与加锁跨传递消息给其他线程.

楼主还是需要学习一下I/O复用那些API了.
ithzhang 2011-11-06
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 ithzhang 的回复:]
引用 1 楼 taodm 的回复:
同时几个客户端啊?
语句里有个限制最多可以连接2个各客户端。但是我一般测试的时候只是开个两三个。都存在想同一局域网内的其他机器上的客户端发消息使得延迟。本台机器上相互发则没有问题。
[/Quote]是20个,写错了。不好意思。
kangyuanxun 2011-11-05
  • 打赏
  • 举报
回复
聊天的程序还是用UDP比较快,建议LZ用UDP socket试一下,我用QT写过,很快的不会有延迟
taodm 2011-11-05
  • 打赏
  • 举报
回复
同时几个客户端啊?

64,652

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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