用C#做了一个游戏控制界面,点击菜单项时将打开用unity3d小游戏,控制界面(服务器)与游戏(客户端)通过TCP协议进行通讯,控制界面(服务器)这边以异步方式工作,现在碰到的问题时,关闭游戏控制窗口时,再次点击菜单项进入游戏控制窗口,就会出现“通常每个套接字地址(协议、网络地址、端口)只运行使用一次”的错误提示,于是我在关闭窗口之前把侦听器也关闭,结果在socketMSG = new SocketMSG(listener .AcceptTcpClient ())这个地方出错,错误提示“一个封锁操作被对 WSACancelBlockingCall 的调用中断。”
 class SocketListener
    {
        const int port = 500;
        string host;//IP地址
        IPAddress localAdd;
        TcpListener listener;//TCP侦听器
        SocketMSG socketMSG;
        
        public SocketListener()
        {
            host = "127.0.0.1";
            localAdd = IPAddress.Parse(host);
            listener = new TcpListener(localAdd ,port );
        }        public void startListener()
        {
            listener.Start();
            //循环接受客户端的连接请求
            while (true)
            {
                 socketMSG = new SocketMSG(listener .AcceptTcpClient ());               
            }
        }        public void sendMSG(string msg)
        {
            socketMSG.Broadcast(msg );
        }
        public void endListener()
        {
            socketMSG.endClient();
            listener.Stop();
        }
    }
 class SocketMSG
    {
        public static Hashtable AllClients = new Hashtable();//客户列表
        private TcpClient _client;//客户端实体
        private string _clientIP;//客户端IP
        private bool ReceiveNick = true;        private byte[] data;//消息数据        public SocketMSG(TcpClient client)
        {
            this._client = client;
            this._clientIP = client.Client.RemoteEndPoint.ToString();
            //把当前客户端实例添加到客户列表当中
            AllClients.Add(this._clientIP, this);
            data = new byte[this._client.ReceiveBufferSize];            //从客户端获取消息
            client.GetStream().BeginRead(data ,0,System .Convert .ToInt32 (this._client .ReceiveBufferSize ),ReceiveMessage,null );
        }
        //从客户端获取消息
        public void ReceiveMessage(IAsyncResult ar)
        {
            int bytesRead;
            try
            { 
             lock (this._client.GetStream())
                {
                    bytesRead = this._client.GetStream().EndRead(ar);                }
                if (bytesRead < 1)
                {
                    AllClients.Remove(this._clientIP);
                    //Broadcast(this._clientNick + "has left the chat");                    return;
                }
                else
                {
                    string messageReceived = System.Text.Encoding.ASCII.GetString(data, 0, bytesRead);
                    if (ReceiveNick)
                    {
                        //this._clientNick = messageReceived;
                        //Broadcast(this._clientNick + " has joined the chat.");
                        if (messageReceived == "hello")
                        {
                            Broadcast("start");
                            ReceiveNick = false;
                        }
                        
                        
                    }
                    else
                    {
                        //Broadcast("hello");
                        //Broadcast(this._clientNick + ">" + messageReceived);
                    }
                }
                lock (this._client.GetStream())
                {
                    this._client.GetStream().BeginRead(data, 0, System.Convert.ToInt32(this._client.ReceiveBufferSize), ReceiveMessage, null);
                }
                
            }
            catch 
            {
                AllClients.Remove(this._clientIP);
                Broadcast("END");
            }            }
       
       //向客户端发送消息
        public void sendMessage(string message)
        {
            try
            {
                NetworkStream ns;
                lock (this._client.GetStream())
                {
                    ns = this._client.GetStream();
                }
                //对信息进行编码
                byte[] bytesToSend = System.Text.Encoding.ASCII.GetBytes(message);
                ns.Write(bytesToSend, 0, bytesToSend.Length);
                ns.Flush();
                ns.Close();
            }
            finally 
            { 
            
            }
        }
        //向客户端广播消息
        public void Broadcast(string message)
        {
            //Console.WriteLine(message);            //if (ReceiveNick)
            //{
                //Console.WriteLine(message.Length.ToString());
                foreach (DictionaryEntry c in AllClients)
                {
                    ((SocketMSG )(c.Value)).sendMessage(message );                }  
        }
        public void endClient()
        {
            _client.Close();
        }
    }
}