日期:2014-05-18  浏览次数:21284 次

通常每个套接字地址(协议/网络地址/端口)只允许使用一次
项目里面自己把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();
        }


我感觉是不是在重新绑定之前,原来的绑定还来不及释放?
这个异常关键是有时候会有,有时候没,不是每次都有,很困惑

------解决方案--------------------
探讨
引用:

引用:
引用:

就是一个网络阻塞的问题


能说得详细点么?谢谢

就是你的程序没有关闭掉 导致你的端口被占用了

在建立线程的时候指定这个线程是后台线程(.IsBackground属性为true).那么主线程关闭的时候它也会关闭或者如果线程不是设置为后……