TCP 一秒发送30帧,出现sockcore line 947断言错误?

kooyou68 2013-04-14 09:43:46
在开发一个远程监控应用,用到tcp来传输数据,数据比较大,一秒传输30帧,每帧5K到200K不等。使用下面的发送和接收代码:
发送代码如下:
//配置socket
int nZero=0;
m_socket.SetSockOpt(SO_SNDBUF,(char *)&nZero,sizeof(nZero));
//连接客户端
Accept(m_socket);
......
//发送数据
//首先发送数据包长度
m_socket.Send(INTBuf,sizeof(int));
//数据过大,分次发送,每次<=1024
int len=0;
int one=1024;
do
{
if ( bufLen-len > 1024 )
one=1024;
else
one=bufLen-len;
m_socket.Send(pBuf,one);
len += one;
pBuf += one;
}while ( len < bufLen ) ;



客户端接收代码如下:
//接收长度为Len的数据包
int revlen=0;
while(revlen<Len)
{
revlen+=Receive(revBuf+revlen,Len-revlen);
}

上面的两段代码就是开发中用到的,可是在服务端发送数据总是出现问题:
1、在Debug模式下,CSoccket的成员函数Send会出现异常,大概是:sockcore.cpp line 947 出现断言错误。
2、在Releae模式下,不会出现上面提到的异常,不过总是不能按照计时器设定的时间每33ms发送一帧,而且发送的频率越来越慢。(PS:我记得我以前是可以的,那是半年前的事情,现在代码改变了,无法恢复原样)
...全文
554 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
菜牛 2013-04-15
  • 打赏
  • 举报
回复
恕我眼拙,你是用监听端口直接发送数据? 另外,你的“桢”是什么概念?为什么不直接发送还自己分开来发,Socket本来自己就会分开发的啊……对了,你还把缓冲区设为0了,看不懂,你确定你的MTU是1024么?
kooyou68 2013-04-15
  • 打赏
  • 举报
回复
引用 2 楼 Mackz 的回复:
恕我眼拙,你是用监听端口直接发送数据? 另外,你的“桢”是什么概念?为什么不直接发送还自己分开来发,Socket本来自己就会分开发的啊……对了,你还把缓冲区设为0了,看不懂,你确定你的MTU是1024么?
先谢谢前辈的回复。 下面是的解答和问题的进展: 1、我不是用侦听端口直接发送数据的。现在的设计是一个客户端连接就是一个线程,当然也对应一个通信socket。 2、关于“帧”的问题,怪我没说清楚:我现在做的是远程监控,“帧”其实就代表发送一次数据来刷新屏幕,说白了就是发送多张图片数据。一秒要发送30次,也就是一秒要发送30帧。 3、为什么不直接发送还自己分开来发:是因为有时候一次要发送的数据比较大,达到500K以上,所以就分开来发。这个做法我也是参考网上的提议。具体的原理我也说不上,让你见笑了。 4、至于将SNDBUF设置为0,是因为这样做可以让数据不经过系统缓冲区,直接发送到网络。设置这个参数也是因为socket发送数据包有问题才试试的。之前我是设计socket的SNDBUF为32*1024,没起效果。 问题的进展: 1、今天我终于在弄出了些眉头,我去机房尝试用不同系统电脑来测试,结果发现在XP上运行我上面的程序,那是完全能达到我预想的功能。数据包能按时发生,不阻塞。客户端也可以顺利接收。而且运行半小时也不出现延时等现象。 2、可是到了win7系统,问题就出现了。无论是发送端的socket和接收端的socket都出现了问题。具体的问题如下: a:在xp系统运行服务端来发送数据,win7系统上的客户端无法正常接收数据。可是xp系统上的客户端却可以正常接收数据。所以从这里可以看出,xp系统上运行的服务端和客户端都是没有问题的,问题出在win7系统的客户端。 b:在win7系统运行服务端来发送数据,在xp系统上运行客户端。可是客户端无法正常接收数据。这里也可以表明,win7上的服务端无法正常工作。 所以总结的问题结果是:在xp上运行服务端和客户端都是完全没有问题的。在win7上运行却是都会出现socket无法正常发送和接收的问题。 请问这会不会关系win7的网络设置问题呢?
菜牛 2013-04-15
  • 打赏
  • 举报
回复
1 你明明Accept(m_socket)了,那就是监听端口。 2 你可以初始化Socket的时候,用AfxSocketInit查询发送包的大小,然后这么发送: do { one=m_socket.Send(pBuf, packetSize); len += one; pBuf += one; }while ( len < bufLen ) ; 3 Win7下面检查一下防火墙设置,可能你的端口没开吧。
kooyou68 2013-04-14
  • 打赏
  • 举报
回复
为什么发送超过2048字节的数据就会出现延迟。。
打开链接下载源码: https://pan.quark.cn/s/64cfd9352cf7 VLC播放器是一款备受青睐的跨平台开源多媒体播放软件,其3.0.11版本在继承既有卓越功能的同时,显著优化了对特定音视频编码格式的兼容性,尤其着重于对AVS+和DRA这两种源自中国的编码标准的支持。这一改进使得VLC不仅能够处理国际上通行的H264和H265视频编码,以及AC3音频编码,更能契合国内用户的播放需求,流畅播放采用AVS+和DRA编码的多媒体资料。1. **AVS+(Advanced Video Coding Plus)**:AVS+是中国自主设计的一种高效视频编码规范,其核心目标在于提升编码效能,减少带宽占用,特别适用于高清及超高清视频的传输。相较于早期的AVS技术,AVS+在编码效能、图像质量和实现难度上取得了更优的均衡,为国内的电视广播、IPTV、网络视频等领域提供了定制化的解决方案。2. **DRA(Digital Radio Audio)**:DRA是一种基于数字音频广播的高保真音频编码技术,由中国独立研发而成。该技术支持多样化的码率和声道布局,确保提供卓越的音频体验,同时具备优异的网络适应性及低延迟表现,适用于广播、互联网音频传输等多种使用场景。3. **H264(亦称AVC)**:H264是一种高效视频压缩规范,广泛应用于在线视频、流媒体服务、蓝光光盘等领域,其显著优势在于能够在较低的码率下呈现高清晰度的视频画面。4. **H265(亦称HEVC)**:作为H264的升级版标准,H265在压缩效率上实现了进一步突破,相同画质下可将文件大小减半,这对4K、8K等超高清视频的传输和存储尤为关键。5. **AC3(Dolby Digital)**:AC3是...

18,357

社区成员

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

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