• 全部
  • 问答

网络高手请近,@@@,只要能解决问题,多少分都给阿!高手,救我啊!!!!!!

haha_0_2000_2001 2004-08-11 12:43:04
本人最近写了一个程序,其总包含一个视频包转发功能。
while(dwDataLength > 0)
{
dwAct = Min<DWORD>(m_dwUDPTransMaxLength,dwDataLength);

SOCK_INFO * Pointer = m_SockInfoHead;
for(;Pointer != NULL;Pointer = Pointer->Next)
{
sendto(Pointer->Socket,(const char*)pbuf,dwAct,0,
(SOCKADDR*)&(Pointer->RemoteAddr),sizeof(SOCKADDR));
}
pbuf += dwAct ;
dwDataLength -= dwAct ;
}//end while
刚开始一切运行正常,当有客户端接入时,m_SockInfoHead不为空,则向这个客户端发送视频,可是过了5分钟,出现内存上涨持续的情况。接下来结束客户端的连接,这时m_SockInfoHead为空。内存停止涨动。再接入同样会上涨.....
另一种情况是将Sendto函数屏蔽掉,就让For干循环,这时就不会发生内存上涨的情况。
请问各位大哥高手,难道sendto 有什么问题吗,使用时要注意什么吗?谢谢了,真的多少分都给,不过我还有2000分了,请帮帮我。!!!!跪求!!!!
...全文
308 点赞 收藏 32
写回复
32 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
crazyboy2003 2004-08-29
告诉你,利用TCP/IP协议进行网络通信时,你要考虑你的网络速度,每一次的连接都要经过一系列的通信过程,而这个过程非常耗时,因此,我推荐你不要有了数据就发送,而是使数据包尽量的长一些,你要知道,发送一个字节的数据包用的时间和发送100个字节的数据包用的时间差不多。你虽然用了多个线程,但网络处理的能力(吞吐量)有限的,因此就会发生拥塞现象,最好的办法就是增大数据包的长度,使同样大的数据发送的次数尽量的少,当然也不能过少,否则误码率也是一个制约因素,具体你可以通过调参来实现最大效率。
回复
Fly1980 2004-08-28
你这里是用一个线程不断的发送,
那么你在客户端是不是用一个线程不断的接收吗?
我的意思是说你在接收时是不是被某些操作阻塞了,导致接收赶不上发送的速度.
回复
ldhhp2003 2004-08-27
连续发送的想法是好的,但把网络数据发送想的过于简单了点,如此发送不时简单的Sleep()就能解决的,随着数据量的增大,Sleep的值就变得无法确定。基于此可以考虑用重叠的方式来实现,试着将底层的收发数据量设大点,对每次sendto后的结果进行验证,也许会发现一些问题。
回复
haha_0_2000_2001 2004-08-22
晕啊,都没有人同情同情我啊,
回复
fengge8ylf 2004-08-18
你可以设置套接字让程序不放到缓存区,直接发送
--------------------------------------------------------------

const int nZero = 0;
nRet = setsockopt(m_socListen,
SOL_SOCKET,
SO_SNDBUF,
(char *)&nZero,
sizeof(nZero) );
回复
lwj_dxy 2004-08-18
up
回复
云中飞007 2004-08-17
你可以设置套接字让程序不放到缓存区,直接发送
可以解决延迟问题
回复
haha_0_2000_2001 2004-08-17
楼上的大哥,如何设置啊,给个例子啊
回复
haha_0_2000_2001 2004-08-16
我用单一得Socket进行发送也会产生相同得情况。只是将Sendto去掉就没有问题了。到底问题出在哪里呢?各位高手帮忙啊!
回复
COM_MOC 2004-08-14
是不是你的程序哪里没有内存释放存在问题,我刚才试过如果一直用一个socket进行UDP数据的发送,持续大概有半个小时,内存也没有往上不停的涨啊,只是CPU几乎满负载运行而矣。建议你将问题先分解,再查找原因,比如先用一个socket进行发送,看看是不是也存在这样的问题。把你while()里的for循环语句注掉。//for(;Pointer != NULL;Pointer = Pointer->Next)
回复
haha_0_2000_2001 2004-08-14
我其实是想知道,为什么Sendto会造成核心内存泄漏,这样才可以避免啊!没有人遇到过这种情况吗?上面有位兄台说用Sleep(),可以阿,不过这个也没有一个量性的标准啊,在我的机器上10ms就可以(w2k pro),可是在另外一个就不可以(w2k ser),应该会有其他别的方法吧!
回复
rwdx 2004-08-13
还有,你的这段程序在执行过程中是否有其它线程在修改相关资源
回复
rwdx 2004-08-13
你上面说的是没问题的,如何你用同步模式的话,你出现内存增大的原因应该不在sendto函数那里,是不是有可能sendto执行的速度比较慢或是被阻塞,因为网速的问题,然而其它地方有可能把数据不停的写入链表或是其它之类的,
你可将sendto换成sleep(1000)看看有没有发生内存增大的情况
回复
haha_0_2000_2001 2004-08-13
同步异步都试过了阿!快疯了,4天了,还没解决问题,是不是没有办法啊,对了,我的Socket是在同一进程的不同线程里创建的,应该没有问题吧。帮我顶阿!!!!!
回复
COM_MOC 2004-08-13
如果确实是速率匹配的问题,你可以按下面方法试一试:
你不是说内存呈规律性上涨,且传输可以维持几分钟之后才会出现这样的情况吗,对方接收到的数据一开始也是存放在缓存中,播放的实际速度应该要比接收数据的速度要慢一些吧,这样你完全可以在传输一定数据帧之后,等待对方一个应答,完成同步的功能。
祝你好运!
回复
haha_0_2000_2001 2004-08-13
我的情况是内核内存有规律的上涨,我看过了,根本不是应用程序申请的空间变化,除了Sendto我想不到别的会申请到内核空间的,而且我也有丢包的技术,如果发送的不够快,其余的包就直接丢掉了啊!!!!
回复
rwdx 2004-08-12
楼主使用异步io吗?
回复
haha_0_2000_2001 2004-08-12
谢谢阿,可是这不是简单的内存泄漏,这个会造成内核泄漏,因为Sendto只是简单的复制操作,基本功能就是将要发送的内容拷贝到系统给Socket分配的发送缓冲区,这个发送缓冲区是内核资源,我想应该是发送的频率和接受的频率不匹配造成的,可是没有实际可行的办法阿,各位高手帮我想一想啊,谢谢
对了,在Windows CE上就存在这个系统Bug。可是在Windows2000下面怎么解决阿!
回复
fengge8ylf 2004-08-12
我在For循环后面加了一个Sleep(10),在我的机器上好使了,但在别人的机器上不好使阿。

在其中一个机器上用的Sleep(100)好使了,但是这是视频传输,这样的延时是不允许的阿。

----------------------------------------------------------------------------------
与我分析的正相反 我觉的发送很快的话 UDP缓冲区满了 这时sendto就变慢了 而视频数据还在不停的发过来 我想你的程序是把视频数据先存下来 然后sendto后再删除,当sendto变慢时 积累的视频数据越来越多 内存肯定增长。

以上只是我的推测 可能不对
回复
fengge8ylf 2004-08-12
我在For循环后面加了一个Sleep(10),在我的机器上好使了,但在别人的机器上不好使阿。

在其中一个机器上用的Sleep(100)好使了,但是这是视频传输,这样的延时是不允许的阿。

----------------------------------------------------------------------------------
与我分析的正相反 我觉的发送很快的话 UDP缓冲区慢了 这时sendto就变慢了 而视频数据还在不停的发过来 我想是把视频数据先存下来 然后sendto后再删除,当sendto变慢时 积累的视频数据越来越多 内存肯定增长。

以上只是我的推测 可能不对
回复
发帖
通信技术
创建于2007-08-27

4029

社区成员

通信技术相关讨论
申请成为版主
帖子事件
创建了帖子
2004-08-11 12:43
社区公告
暂无公告