qq企业通
在qq企业通中,qq聊天中,如果开启两个窗口就会提示“通常每个套接字地址(协议/网络地址/端口)只允许使用一次。”我也是用C#做的。可能是要多线程才行,我的是单线程而已,如果要多线程,应该怎么写,拜托各位高手帮帮忙了。下面是我创建udp套接口的代码:
  public partial class UDPSocket : Component
     {
         private IPEndPoint ServerEndPoint = null;   //定义网络端点
         private UdpClient UDP_Server = new UdpClient(); //创建网络服务,也就是UDP的Socket
         private System.Threading.Thread thdUdp; //创建一个线程
         public delegate void DataArrivalEventHandler(byte[] Data, IPAddress Ip, int Port);  //定义了一个托管方法
         public event DataArrivalEventHandler DataArrival;   //通过托管理在控件中定义一个事件
         private string localHost = "192.168.137.15";
         [Browsable(true), Category("Local"), Description("本地IP地址")]   //在“属性”窗口中显示localHost属性
         public string LocalHost
         {
             get { return localHost; }
             set { localHost = value; }
         }
         private int localPort = 11000;
         [Browsable(true), Category("Local"), Description("本地端口号")] //在“属性”窗口中显示localPort属性
         public int LocalPort
         {
             get { return localPort; }
             set { localPort = value; }
         }
         private bool active = false;
         [Browsable(true), Category("Local"), Description("激活监听")]   //在“属性”窗口中显示active属性
         public bool Active
         {
             get { return active; }   
             set //该属性读取值
             {  
                 active = value;
                 if (active) //当值为True时
                 {
                     OpenSocket();   //打开监听
                 }
                 else
                 {
                     CloseSocket();  //关闭监听
                 }
             }
         }
         public UDPSocket()
         {
             InitializeComponent();
         }
         public UDPSocket(IContainer container)
         {
             container.Add(this);
             InitializeComponent();
         }
         protected void Listener()   //监听
         {
             ServerEndPoint = new IPEndPoint(IPAddress.Any,localPort);   //将IP地址和端口号以网络端点存储
             if (UDP_Server != null)
                 UDP_Server.Close();
             UDP_Server = new UdpClient(localPort);  //创建一个新的端口号
             UDP_Server.Client.ReceiveBufferSize = 1000000000;   //接收缓冲区大小
             UDP_Server.Client.SendBufferSize = 1000000000;  //发送缓冲区大小              
             try
             {
                 thdUdp = new Thread(new ThreadStart(GetUDPData));   //创建一个线程
                 thdUdp.Start(); //执行当前线程
             }
             catch (Exception e)
             {
                 MessageBox.Show(e.ToString());  //显示线程的错误信息
             }
         }
         private void GetUDPData()   //获取当前接收的消息
         {
             while (active)
             {
                 try
                 {
                     byte[] Data = UDP_Server.Receive(ref ServerEndPoint);   //将获取的远程消息转换成二进制流
                     if (DataArrival != null)    //如果当前正在托管
                     {
                         DataArrival(Data, ServerEndPoint.Address, ServerEndPoint.Port);//利用当前控件的DataArrival事件将消息发给远程计算机
                     }