通常每个套接字地址(协议/网络地址/端口)只允许使用一次
项目里面自己把UdpClient封装了一下,有时候会在绑定的时候出现“通常每个套接字地址(协议/网络地址/端口)只允许使用一次”,有时候又不会。
代码贴出来给大家,帮忙找下问题
- C# code
#region 成员变量 string _IP; int _port; byte[] recvBuf = null; string _receiveString; bool _hasReceive; UdpClient receiver = null; IPEndPoint senderEP = null; public string IP { get { return _IP; } set { _IP = value; } } public int port { get { return _port; } set { _port = value; } } public string receiveString { get { hasReceive = false; return _receiveString; } set { _receiveString = value; } } public bool hasReceive { get { return _hasReceive; } set { _hasReceive = value; } } #endregion 成员变量 #region 构造函数 public UdpReceiver(string IP,int port) { _IP = IP; _port = port; IPEndPoint localEP = new IPEndPoint(IPAddress.Parse(_IP), _port); receiver = new UdpClient(localEP); _hasReceive = false; senderEP = new IPEndPoint(IPAddress.Any, 0); } #endregion 构造函数 #region 成员函数 public void receive() { recvBuf = receiver.Receive(ref senderEP); _receiveString = Encoding.Default.GetString(recvBuf); _hasReceive = true; } public void close() { if (receiver != null) receiver.Close(); } #endregion 成员函数
异常是在构造函数里面出现的,而且不是每次都出现,是有时候会有时候不会。我在客户端程序中用一个Timer定期的重新初始化这个套接字,代码如下
- C# code
System.Timers.Timer resetReceiverTimer; double resetInterval = 60 * 1; UdpReceiver receiver = null; private void ResetReceiver(object sender, System.Timers.ElapsedEventArgs e) { receiveThread.Abort(); //接收线程,重新初始化套接字之前先关闭线程 receiver.close(); receiver = new UdpReceiver(IP, 42000); receiveThread = new Thread(new ThreadStart(loopReceive)); receiveThread.Start(); }
我感觉是不是在重新绑定之前,原来的绑定还来不及释放?
这个异常关键是有时候会有,有时候没,不是每次都有,很困惑
[解决办法]