tempad
ReadyGo!技术成就梦想 >>ASP技术 >> 用CSocket接收2k的UDP包时出错,请问如何改正?

用CSocket接收2k的UDP包时出错,请问如何改正?

ReadyGo!技术成就梦想 网络搜索 efish 2008-1-14 6:26:18

用CSocket接收2k的UDP包时出错,请问如何改正?

楼主yiyiyaya(咿咿呀呀)2002-05-14 14:41:56 在 VC/MFC / 基础类 提问

查了原来的一些贴子,UDP最大可以发送64k   byte。  
  我的程序中一次发送2k数据。发送方正确,但接收方出错,如果将数据包大小改为1k,均正常。  
  使用CSocket的sendto   ,receivefrom。接收方的buffer足够大,10k。  
   
  请问这是怎么回事?需要设置什么?谢谢。 问题点数:50、回复次数:10Top

1 楼z_sky()回复于 2002-05-14 14:51:42 得分 5

UDP最大可以发送64k   byte?有这么大吗?IP包大小是有系统低层决定的,一般也就1~2k之间。   你可以看看sendto()返回的实际发送字节数。建议不要一个包太大。Top

2 楼fang_jb(寂寞如雪)回复于 2002-05-14 15:00:00 得分 0

同意楼上的,  
  另外,接收的代码贴着看一下Top

3 楼yiyiyaya(咿咿呀呀)回复于 2002-05-16 20:07:24 得分 0

udp包大小的问题我看到得是以下两篇文章:  
  http://www.csdn.net/expert/topic/467/467477.xml?temp=.9744226  
  http://www.csdn.net/expert/topic/338/338944.xml?temp=.7130396  
   
  接收代码如下:  
   
  void   CClientSocket::OnReceive(int   nErrorCode)    
  {  
  int   iRcv   =   ReceiveFrom(m_RcvBuffer,   10240,   m_szTgtIP,   m_nTgtPort,   0);  
  if(iRcv)  
  {  
  m_nCount++;  
  TRACE("****NO.   %d   Package:   Received   %d   byte.********\n",   m_nCount,iRcv);  
  }  
  CSocket::OnReceive(nErrorCode);  
  }  
   
   
  其中 BYTE   m_RcvBuffer;  
   
   
  谢谢二位Top

4 楼vtable9999(肝肝肝肝)回复于 2002-05-19 13:36:20 得分 10

UDP包的大小和缓存有关。  
  你现在的10240不是socket缓存。用SetSockOpt把缓存设大一点看有没有效果Top

5 楼yiyiyaya(咿咿呀呀)回复于 2002-05-20 09:53:03 得分 0

还是不行啊,我是这么设的,不知道对不对?  
  int   iRcvBufSize   =   1024*10;  
  ClientSocket.SetSockOpt(SO_RCVBUF,   &iRcvBufSize,   sizeof(iRcvBufSize),   SOL_SOCKET);  
  Top

6 楼fang_jb(寂寞如雪)回复于 2002-05-25 09:55:04 得分 0

把winsock的错误解释打出来看一下,  
  出的是什么错?Top

7 楼yiyiyaya(咿咿呀呀)回复于 2002-05-25 15:48:55 得分 0

第一次运行Debug,接收一个包后:  
  弹出错误警告:User   breakpoint   called   from   code   at   0x77f9eea9  
  Output   区显示:  
  HEAP:Invalid   heap   signature   for   heap   at   130000,passed   to   RtlAllocateHeap  
   
   
  重新运行Debug,服务器端再发一个包后:  
  弹出错误警告:Unhandled   exception   in   TestClient.exe:0x0000005:Access   Violation  
  GetLastError:   0x000000B6,   用Error   LookUp   查出是“操作系统无法运行1%"  
   
  程序中已无自定义的断点  
   
  谢谢。  
   
  Top

8 楼fang_jb(寂寞如雪)回复于 2002-05-25 17:17:29 得分 20

程序内存操作有问题,检查字符串和string类型的变量的操作。  
  Top

9 楼admireO(再接再厉)回复于 2002-05-25 17:41:41 得分 10

你的程序有内存访问非法错误,可能是访问了没有申请内存的指针。Top

10 楼zyoujie()回复于 2002-05-25 17:52:16 得分 5

同意楼上观点Top

责任编辑: efish 参与评论 查找更多:
相关文章
VC客户端调用服务器端组件代码?? VC客户端调用服务器端组件代码??
在服务器端的一个函数中怎样执行另一个页面再返回该… 在服务器端的一个函数中怎样执行另一个页面再返回该函数?
自己写的浏览器的两个问题 自己写的浏览器的两个问题
可执行程序的图标怎么不对啦? 可执行程序的图标怎么不对啦?
请大家看看我的问题,会者不难啊 请大家看看我的问题,会者不难啊
关于ssl 关于ssl
我用CFile类进行文件的读写,怎样判断文件的结束呢? 我用CFile类进行文件的读写,怎样判断文件的结束呢?
关于VB调用DES加密算法的问题 关于VB调用DES加密算法的问题
请问如何在程序里把word文档、网页文件等格式转换为… 请问如何在程序里把word文档、网页文件等格式转换为纯文本格式?
to suyman(存在即合理): to suyman(存在即合理):
2秒记住本站域名

玩过泡泡龙吗?Readygo?Go! 再加上.Com.Cn的后缀,那就是大名小顶的ReadyGo.com.cn

分类导航
ReadyGo!技术成就梦想