我有一段代码如下:
// 转发收到的消息
try
{
AfxSocketInit();
CSocket sckUDP;
sckUDP.Create(NULL, SOCK_DGRAM, NULL);
sckUDP.SendTo(buffer, nReceived, unTransferPort, sTransferIP, NULL);
}
catch(CException *e)
{
e->Delete();
}
但由于指定的UDP监听不一定存在,程序运行一段时间后就会弹出Visual C++ Runtime的错误,说是Buffer overrun detected!
我屏蔽了这段代码后就不会出现这个故障,问题应该是在这里。我分析是因为UDP监听不存在,所以SendTo的东西全部积累在了系统的Buffer中,最终导致了Overrun。
请教各位大大如何才能清空系统的这个Buffer啊?
我的想法是如果UDP监听存在就转发,不存在就丢弃。
谢谢了!问题解决立刻结帖!

解决方案 »

  1.   

    应该是你的code问题,你要每次create socket吗,每次init lib?
      

  2.   

    我不知道是不是需要每次都用AfxInitSocket,只是以前记得没用时可能会出错,用了也没报错,所以我就在这个前面加了一个了。全部的代码如下:
    void CSocketUDPListen::OnReceive(int nErrorCode)
    {
    // TODO: 在此添加专用代码和/或调用基类
    char buffer[BUFFER_SIZE]; // 接收指令
    int nReceived=Receive(buffer,BUFFER_SIZE,0);
    buffer[nReceived]=0; // 转发收到的消息
    try
    {
    AfxSocketInit();
    CSocket sckUDP;
    sckUDP.Create(NULL, SOCK_DGRAM, NULL);
    sckUDP.SendTo(buffer, nReceived, unTransferPort, sTransferIP, NULL);
    }
    catch(CException *e)
    {
    e->Delete();
    } CSocket::OnReceive(nErrorCode);
    }
    我是直接把转发代码放在了OnReceive的代码中
      

  3.   

    Buffer的大小不能超过UDP一次所能处理的报文大小限制
      

  4.   

    是啊,如果Receive失败,那nReceived的值就可能会超出UDP的上限
    要考虑接收失败
      

  5.   

    你sendto都不判断返回值,那怎么行啊?
    你的容错处理要做好.
      

  6.   

    一个udp包内数据最大65507 (WinXp+sp2)