首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ Builder >

UDP 向一个异常端口发送数据后就没法接受数据了

2012-02-03 
UDP 向一个错误端口发送数据后就没法接受数据了。假设第一次客户端发送时的设定信息如下:-----------------

UDP 向一个错误端口发送数据后就没法接受数据了。
假设第一次客户端发送时的设定信息如下:
-----------------------
服务器受信端口号:50004(实际正确的服务器端口号为50002)
本地受信端口号 :50011
-----------------------
发送后当然服务器是接受不到数据的,
可是服务器再向客户端送信时客户端也接受不到数据了。
服务器送信的设定信息如下:
-----------------------
客户端端口号:50011
-----------------------

很让人郁闷,如果本地想要受信成功就必须把SOCKET清除再生成(BIND)一次。
我感觉是本地向一个未知端口(非正确的服务器端口)发送数据后会将自己的端口(50011)或是线程什么的锁住,
从而无法继续接受数据了。但是UDP是非连接的协议啊。怎么也会有这种现象呢?请大家指教!谢谢。

[解决办法]
SIO_UDP_CONNRESET (opcode setting: I, T==3)
Windows XP: Controls whether UDP PORT_UNREACHABLE messages are reported. Set to TRUE to enable reporting. Set to FALSE to disable reporting
http://support.microsoft.com/kb/263823
[解决办法]
下面的代码段演示一技术,可使用 SIO_UDP_CONNRESET 控制代码,以获取原始的 Windows NT 4.0 行为调用 WSAIoctl 
DWORDdwBytesReturned = 0;
BOOLbNewBehavior = FALSE;
DWORDstatus;

// disable new behavior using
// IOCTL: SIO_UDP_CONNRESET
status = WSAIoctl(sd, SIO_UDP_CONNRESET,
&bNewBehavior, sizeof(bNewBehavior),
NULL, 0, &dwBytesReturned,
NULL, NULL);

if (SOCKET_ERROR == status)
{
DWORD dwErr = WSAGetLastError();
if (WSAEWOULDBLOCK == dwErr)
{
// nothing to do
return(FALSE);
}
else
{
printf("WSAIoctl(SIO_UDP_CONNRESET) Error: %d\n", dwErr);
return(FALSE);
}
}


到能够编译此代码,您需要将包括 SIO_UDP_CONNRESET 的定义在最新 Mswsock.h 或将它的直接在您的代码的定义下面 
// MS Transport Provider IOCTL to control
// reporting PORT_UNREACHABLE messages
// on UDP sockets via recv/WSARecv/etc.
// Path TRUE in input buffer to enable (default if supported),
// FALSE to disable.
#defineSIO_UDP_CONNRESET_WSAIOW(IOC_VENDOR,12)

热点排行