UDP通信的问题

问题描述:

       用UDP通信的时候有这个一个问题,假设有A,B两个进程,B向先A发消息,A收到消息以后,开2个线程,一个向B发消息,一个从B收消息,此时如果关掉B进程,A的接收线程就会不阻塞,错误码为10054。

原因:

看了很多资料,原来是winsock的bug,具体原因是:http://support.microsoft.com/kb/263823/

If sending a datagram using the sendto function results in an "ICMP port unreachable" response and the select function is set for readfds, the program returns 1 and the subsequent call to the recvfrom function does not work with a WSAECONNRESET (10054) error response. In Microsoft Windows NT 4.0, this situation causes the select function to block or time out.

解决:

A进程在创建SOCKET后,加入如下的代码:

DWORD dwBytesReturned = 0;
BOOL bNewBehavior = FALSE;
DWORD status;

#define SIO_UDP_CONNRESET _WSAIOW(IOC_VENDOR,12)
// disable  new behavior using
// IOCTL: SIO_UDP_CONNRESET
status = WSAIoctl(m_ClientSocket, 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);
 }
}


 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

山西茄子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值