如何定时发送大量udp数据?

dqxian 2008-07-25 04:19:57
目的:客户端定时发送4MB/s的UDP数据到服务器。
小弟的做法:用timeSetEvent()每1ms调用一次回调函数,然后在回调函数中用SendTo()发送4kB的数据(4kB/1ms = 4MB/s)。

timeSetEvent(1,1,SendProc,...);

SendProc()
{
char sendBuf[4096];
...
nBytesSend = SendTo(...);
if(nBytesSend == SOCKET_ERROR)
{
TRACE("...%d\n",GetLastError());
...
}
}

但是程序出现异常退出,如果改成5ms以上调用一次SendProc()就不会出现异常退出,也没见GetLastError()打印出什么错误信息。
UDP的SendTo()是不是工作在异步模式下面呀,是不是因为SendTo()来不及发送玩4kB的数据,就调用下一个SendTo(),造成阻塞
中断?
各位大侠有什么好的解决方案?谢谢了
...全文
476 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
taosiming 2008-07-30
  • 打赏
  • 举报
回复
不要用CSocket
fierygnu 2008-07-29
  • 打赏
  • 举报
回复
应该是处理能力问题,导致信号处理函数重入,出现错误。
4MB/s意味着近50Mbps
dqxian 2008-07-28
  • 打赏
  • 举报
回复
对了,忘记说明,以上的数据量单位都是字节/s(MB/s)
dqxian 2008-07-28
  • 打赏
  • 举报
回复
timeSetEvent()函数可以达到1ms的定时,我测试过了。我定时发送2M/s的数据量也没问题。
我也用nBytesSend = SendTo();来统计发送出了多少字节,在定时发送2M/s的发送量时没
问题。而当数据量达到4M/s时,运行时就弹出了“Debug Assertiong Fail!"那个错误异常
错误提示框,我中断进去,到了CSocket类的PumpMessage()函数中,ASSERT(pState->m_hSocketWindow!=NULL);这里
触发了断点。所以我认为是windows的发送缓冲区所能支持的大小问题,当发送数据量太大时候,
会造成系统崩溃...我的认为,但我觉得 4M/s的数据发送量也不算大噻!
zsj_vchelp 2008-07-27
  • 打赏
  • 举报
回复
判断下sendto返回值,如果没有发送完,就接着法,确保发送完再出去。但你程序报错,可能有其他原因哈。
zclever 2008-07-25
  • 打赏
  • 举报
回复
mark。明天再来关注
dqxian 2008-07-25
  • 打赏
  • 举报
回复
我觉得应该是windows的发送缓冲问题,我改成2M/s以下的发送速率后,就没问题。2M/s以上的发送
速率可能大了些,前面的数据还没发送出去,后面的数据跟上来了。
rageliu 2008-07-25
  • 打赏
  • 举报
回复
Timer的1ms和5ms基本没什么区别,会有线程切换,基本都是在15ms左右,估计错误不在这里

4,356

社区成员

发帖
与我相关
我的任务
社区描述
通信技术相关讨论
社区管理员
  • 网络通信
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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