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:我记得我以前是可以的,那是半年前的事情,现在代码改变了,无法恢复原样)
...全文
421 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字节的数据就会出现延迟。。

18,356

社区成员

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

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