我有一段代码如下:
// 转发收到的消息
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监听存在就转发,不存在就丢弃。
谢谢了!问题解决立刻结帖!
// 转发收到的消息
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监听存在就转发,不存在就丢弃。
谢谢了!问题解决立刻结帖!
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的代码中
要考虑接收失败
你的容错处理要做好.