用CSocket接收2k的UDP包时出错,请问如何改正?
用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
-
相关文章
2秒记住本站域名
玩过泡泡龙吗?Readygo?Go! 再加上.Com.Cn的后缀,那就是大名小顶的ReadyGo.com.cn
