利用socket实现一个服务器给多个客户端不停的发送数据的问题

blackdantex 2014-07-31 03:43:00
利用VC、socket实现一个服务器给多个客户端不停的发送数据,每连接一个客户端就建立一个发送线程,每个发送线程每Sleep(10)发送一次。(本机测试)
问题:
1、连接的客户端越多,客户端接收的数据就越慢,4个客户端时基本已经慢的很,照理说线程之间不是应该互不干扰吗,又没有用到共享数据?
2、如果我实现的方法不对,这种一发多的情况,利用多线程是怎么实现高效率发送的?


...全文
461 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
阿源是少年 2014-08-01
  • 打赏
  • 举报
回复
正常处理模式就是一个客户端一个线程,甚至是2个线程,一个收,一个发,这个是没有任何问题的,之前四川省的电信服务器,就是这种模式做的,而且还是用的阻塞套接字模型
xian_wwq 2014-08-01
  • 打赏
  • 举报
回复
一个客户端开一个工作线程,这种模式有问题呀 建议搜下“socket五种IO模型”
阿源是少年 2014-08-01
  • 打赏
  • 举报
回复
1.先建立一个全局缓冲区,把视频流数据放入其中,然后创建临界区CRITICAL_SECTION g_cs 2.在你程序初始化时初始化临界区变量g_cs ,InitializeCriticalSection(&cs) 可以放在InitialDialog()或InitInstance()里 3.之后在你每个客户端发送线程的send()函数前加EnterCriticalSection(&cs) ;//加锁,发送逻辑完毕后在send()后加 LeaveCriticalSection(&cs);//解锁,这样就可以保证当一个客户端线程在访问全局视频流缓冲时,其他线程均处于等待状态,一旦 某个线程释放了锁,其他线程就会立刻得到这把锁,然后开始send(),相比之下,这种同步方式其实和SetEvent差不多,只是逻辑会 比较清晰一些 4.由于你只是读取数据进行发送,不会修改全局缓冲的值,这样的话不用线程同步也是可以的,所有线程可以同时发送,这样效率会高很多
blackdantex 2014-08-01
  • 打赏
  • 举报
回复
谢谢大家的回答,第一个问题已经解决了,是因为客户端和服务器都在本地,放在不同的电脑上就好了。 现在是第二个问题,比如来了一个视频流,如何同时发送给多个客户端,发送中需要队列。我用线程之间用了一些信号量,还是不行,而且很多人说用太多信号量和锁会导致程序效率底下。那大家在这种情况下一般是怎么做的,请高手指教? 还有,怎么给大家问题点数分呢?
阿源是少年 2014-07-31
  • 打赏
  • 举报
回复
贴代码看看,口说无凭,或许你哪里处理不当,按理说不会出现上述情况的,4个线程很少
  • 打赏
  • 举报
回复
每连接一个客户端就建立一个发送线程 你的机器是否很高配?
1、本课程是一个干货课程,主要讲解如何封装服务器底层,使用Tcp/ip长连接,IDE使用vs2019 c++开发以及使用c++11的一些标准,跨平台windows和linux,服务器性能高效,单服务器压力测试上万无压力,服务器框架是经历过上线产品的验证,框架简单明了,不熟悉底层封装的人,半个小时就能完全掌握服务器框架上手写业务逻辑。2、本课程是一个底层服务器框架教程,主要是教会学员在windows或linux下如何封装一个高效的,避免踩坑的商业级框架,服务器底层使用初始化即开辟内存的技术,使用内存池,服务器运行期间内存不会溢出,非常稳定,同时服务器使用自定义哈希hashContainer,在处理新的连接,新的数据,新的封包,以及解包,发包,粘包的过程,哈希容器性能非常高效,增、删、查、改永远不会随着连接人数的上升而降低性能,增、删、查、改的复杂度永远都是恒定的O(1)。3、服务器底层封装没有使用任何第三方网络库以及任何第三方插件,自由度非常的高,出了任何BUG,你都有办法去修改,查找问题也非常方便,在windows下使用iocp,linux下使用epoll.4、讲解c++纯客户,主要用于服务器之间通信,也就是说你想搭建多层结构的服务器服务器服务器之间使用socket通信。还可以使用c++客户做压力测试,开辟多线程连接服务器,教程提供了压力测试,学员可以自己做压力测试服务器性能。5、赠送ue4和unity3d通信底层框架以及多人交互demo,登录,注册,玩家离开,同步主要是教会学员服务器客户如何交互。6、赠送c++连接mysql数据库框架demo,登录,注册,玩家离开数据持久化.7、服务器教程使用自定义通信协议,同时也支持protobuf,选择权在开发者自己手里,想用什么协议都可以,自由度高。8、服务器教程使用手动敲代码逐句讲解的方式开展教学课程。非喜勿喷,谢谢大家。9、服务器教程提供源码,大家可以在平台提供的地址下载或者联系我,服务器使用c++11部分标准,std::thread,条件变量,线程锁,智能指针等,需要学员具备一定c++知识,购买前请慎重考虑。

18,355

社区成员

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

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