最近由于工作需要,开发一个网络库,从中发现了一些不可思议的问题!不做不知道一做吓一跳。先介绍一下我库的使用环境。主要在局网内传输大数据!由于上头的人对UDP的执迷,所以第一个版本为UDP版,但最终与要达到的目标相差甚远。广播的传输速度只有1M左右,点对点的传输速度在3M~4M。与每秒9M左右的目标相去甚远。所以最终放弃用UDP来实现大数据的可靠传输,改用TCP来实现。(前期所做的一切就是用UDP来实现一个类似TCP的协议)UDP进行可靠数据传输开发,在UDP每次发送数据前底层的协议是先连接一下远端主机,然后在发送数据,发送完毕在释放所建立的临时连接。因此为了不每次创建临时连接可以先连一次然后用send发送,接收端也可先连然后recv。这种情况下一般会提高UDP传输性能30%以上。并且由于连接的建立,UDP还可收到数据能否到达对应主机的通知,因此在进行UDP传输时最好先连接。TCP版也很快实现了,但对监听端口我使用了非堵塞SOCKET,(WSAWaitForMultipleEvents)在一个监听线程中我等待FD_ACCEPT事件的发生。然后调用accept。在此发现一个奇怪的现象,当客户端请求连接很密结时,有可能收不到FD_ACCEPT事件,我分析可能是由于前一个连接请求还未处理完毕下一个又到达,最终造成FD_ACCEPT事件混乱,可能只有一种状态。如果在两次请求之间间隔一段时间,就能很好的运行。但你不能这样去要求客户。因此我改用堵塞方式。(我想Microsoft事件对象的内部实现可能只有两种状态,TRUE或FASE,因此当多个请求同时到达时就不能很好的记数,以至于造成状态混乱。纯属猜测!)现在在局网内的流速能达到10M左右,基本合乎要求。这是我的一点开发经历,希望对大家有所帮助。如果有不对的地方请指出!(异步方式有很多但我只有了WSAWaitForMultipleEvents ‘事件’)
解决方案 »
- COleStreamFile::CreateStream()具体怎么用的?
- 关于CButtonST类的GetCheck()使用
- VC读取文件内容出乱码
- 在vc中怎样操作Access数据库的记录?
- 我想学关于VC硬件编程,看什么书比较好?
- 请教使用过CSortListCtrl的前辈们~~~急!!
- error C2022: “39033” : 对字符来说太大
- 在Com里面怎么用activex控件?
- 各位,小弟初学c语言,请大家帮忙!
- 请问哪有《Windows程序设计》电子书可以下载?谢谢
- ********薪水定了,税前7000元,大家说在微软做测试开发能学到东西吗。顺便问下,那的测试美女真的多吗,小弟目前光棍,想顺便搞几个
- 如何屏蔽字符
1. udp是面向无连接的协议, 不知道您说的【在UDP每次发送数据前底层的协议是先连接一下远端主机】,这句话的真正含义
2. 你说的【FD_ACCEPT事件混乱】,我认为不是这样的, listen过程中, 能够处理的并发连接数是有一定限制的, 也就是同一时间只能处理的连接数不是无限的,这时候应该提示用户服务器繁忙,我的理解是这样的。
--------------------------------------------
给说这话的仁兄一个提示。
也请各位注意:
udp的socket也可以是面向联机的,我们暂时就叫它虚拟连接吧
::connect(sock,...serverip,serverport);
::send(sock,data,datalengyth,null);
sock是一个udp的sock,这么用没有问题。
但是这种用法好多资料上都没有提供,
但是,其实正如楼主讲的一样,这种用法在发送大数据时,确实效率挺高
这有点像IP层是无连接且是非可靠的,而用上一层TCP实现可靠的面向连接的道理一样
======================================
WINDOWS的事件队列大小有限,若不能够及时取走,是会被WINDOWS丢弃的,消息的情况也差不多accept的响应务必要快速,否则出现堵塞降被丢弃。
我一般是使用缓存队列+线程处理的方式来完成这种工作,
accept仅仅简单的进入缓存队列,队列中的连接状态处理工作则由线程来处理
你好,我现在在pda上用iax协议做一个语音通话的小程序,实现tcp和udp两种方式,我发现用tcp通话时,系统反应还挺迅速;用udp时虽然通话质量高,但想在通话同时做点别的操作_比如说浏览网页,系统反应很慢;我想跟您说的udp connect有一定关系.
我想问下,当我在通话开始时如果跟对端connect(udp)一下的话,后面发送函数是用send还是sendto呢?另外是不是要为语音通道专门开一个端口以避免通话过程中控制帧的干扰呢??
是10M字节/秒。to :danyuhao(诸葛不如) ( ) 信誉:100
连接后就用 send与recv;未连接就用sendto 与 recvfrom。
请问如果使用UDP连接方式是否可以解决广播视频不流畅的问题。
另外还有什么方法可以提高广播视频的流畅程度(除了降低颜色数)