📄 subject_41340.htm
字号:
<p>
序号:41340 发表者:关及 发表日期:2003-05-26 13:55:50
<br>主题:服务器用udp编程有没有监听一说?
<br>内容: 技术内幕IV上见到一个多线程阻塞调用recvfrom()的例子,第一个线程的recvfrom()收到数据返回后,新建一个与自己一样的线程启动新的recvfrom()等待,自己则转去处理收到数据,而后结束本线程。在第一个recvfrom()返回,第二个recvfrom()启动之前,有一小段时间,在高速网络下,服务器在这段时间里可能到达很多udp数据报,那这些数据报是否会被丢弃造成丢包?如果会的话,一般采取什么样的监听方法避免本机丢包呢?
<br><a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p>
<hr size=1>
<blockquote><p>
回复者:关及 回复日期:2003-05-26 13:58:51
<br>内容: 有一种办法,就是收端对到达的每个包回发一个确认包(应用层确认),没有收到确认的,就超时重发,这样或许可以避免本机的监听空隙造成的丢包。但是在请求数比较大的情况下,这么做效率太低了。
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:david (小鱼儿) 回复日期:2003-05-26 16:36:21
<br>内容:为啥不用TCP呢?
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:关及 回复日期:2003-05-26 19:11:23
<br>内容: 数据量小,且格式固定,种类少,传达控制信息,传完就没事了。犯不着用tcp吧。而且,我的问题并不是针对我的代码,而是针对用udp的情形。
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:阿峰 回复日期:2003-05-27 12:01:58
<br>内容:采用UDP方式传输数据不可避免的会掉失部份数据,在编程前就应预<BR>见到这一点。以下方式对你或许有用。<BR>//主程序<BR>for(int i = 0;i<初始线程数;i++)<BR> StartThread();<BR><BR>//线程处理函数<BR>ThreadProc()<BR>{<BR> EnterCriticalSection(&CriticalSection );<BR> WaitUdp();//等待数据。<BR> LeaveCriticalSection(&CriticalSection);<BR> StartThread();//再生一线程,保证随时有一定数量的Udp处理线程在等待中。<BR> ProcessUdp();//处理UDP数据包。<BR>}<BR>如果ProcessUdp()比较耗时就像以上这样再生一线程,切初始线程数应多一点。<BR>否则就不用再生一线程,在处理完后继续等待。<BR>
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:关及 回复日期:2003-05-27 20:23:56
<br>内容:>>..........................<BR> .................<BR> StartThread();//再生一线程,保证随时有一定数量的Udp处理线程在<BR> ~~~~~~~~~<BR> 等待中。<BR> .................<BR>>>..........................<BR>不好意思,我不大明白,怎么是一定数量呢,在一个套接字上进行<BR>recvfrom的线程可以好多个吗,我觉得一个套接字上监听的函数<BR>应该同时只允许一个才对啊。
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
<font color=red>答案被接受</font><br>回复者:阿峰 回复日期:2003-05-28 08:57:15
<br>内容:所以我才用了紧急代码区,它保证随时只有一个线程在使用recvfrom<BR>这里CriticalSection应是一全局变量。<BR>EnterCriticalSection(&CriticalSection );
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -