读书人

通常每个套接字地址(协议/网络地址/端

发布时间: 2012-04-10 21:03:56 作者: rapoo

通常每个套接字地址(协议/网络地址/端口)只允许使用一次
项目里面自己把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).那么主线程关闭的时候它也会关闭或者如果线程不是设置为后……

读书人网 >C#

热点推荐