Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 当客户端断开连接时关闭套接字,以便可以重用它#_C#_Arrays_Winforms_Sockets - Fatal编程技术网

C# 当客户端断开连接时关闭套接字,以便可以重用它#

C# 当客户端断开连接时关闭套接字,以便可以重用它#,c#,arrays,winforms,sockets,C#,Arrays,Winforms,Sockets,我有一个聊天室应用程序,它可以正常工作,但是当客户端断开连接时,套接字保持打开状态,很快30个套接字就被填满了,因此没有更多的客户端可以连接,我曾经在黑暗中尝试寻找每个套接字客户机的索引ip,当调用disconnect按钮时,这些套接字客户机连接到断开连接,但我不知道如何实际执行此操作,因为它存储在套接字数组中,而不是数组中 这是我服务器上要断开套接字/客户端连接的部分 public AsyncCallback pfnWorkerCallBack; private Socket

我有一个聊天室应用程序,它可以正常工作,但是当客户端断开连接时,套接字保持打开状态,很快30个套接字就被填满了,因此没有更多的客户端可以连接,我曾经在黑暗中尝试寻找每个套接字客户机的索引ip,当调用disconnect按钮时,这些套接字客户机连接到断开连接,但我不知道如何实际执行此操作,因为它存储在套接字数组中,而不是数组中

这是我服务器上要断开套接字/客户端连接的部分

 public AsyncCallback pfnWorkerCallBack;
        private Socket m_mainSocket;
        private Socket[] m_workerSocket = new Socket[30];
        private int m_clientCount = 0;
        public System.Net.Sockets.Socket m_currentSocket;
        public byte[] dataBuffer = new byte[1024];
        string NickName;

public void OnDataReceived(IAsyncResult asyn)
    {
        try
        {

            SocketPacket socketData = (SocketPacket)asyn.AsyncState;
            int iRx = 0;
            // Complete the BeginReceive() asynchronous call by EndReceive() method
            // which will return the number of characters written to the stream 
            // by the client
            iRx = socketData.m_currentSocket.EndReceive(asyn);
            char[] chars = new char[iRx + 1];
            System.Text.Decoder d = System.Text.Encoding.UTF8.GetDecoder();
            int charLen = d.GetChars(socketData.dataBuffer,
                                     0, iRx, chars, 0);
            System.String szData = new System.String(chars);
            string text = (szData);

            string temp = szData.Substring(0, 10);

            if (temp == "Disconnect")
            {

                int bum = szData.Length-12;
               temp = szData.Substring(11, bum);

               int no = // find the index of the ip 

                m_clientCount --;
               ArrayList temparray = new ArrayList();
               temparray.AddRange(m_workerSocket.ToArray());

                temparray.RemoveAt(no);
                temparray.Add(null);

               int i = 0;
               foreach (Socket content in temparray)
                {
                  m_workerSocket[i] = content;
                  i++;
                }

            }
            else
            {
                Object objData = text;
                byte[] byData = System.Text.Encoding.ASCII.GetBytes(objData.ToString());
                for (int i = 0; i < m_clientCount; i++)
                {

                    if (m_workerSocket[i] != null)
                    {
                        if (m_workerSocket[i].Connected)
                        {
                            m_workerSocket[i].Send(byData);
                        }
                    }
                }
                Invoke(new Action(() => richTextBoxSendMsg.AppendText(szData)));
                Invoke(new Action(() => richTextBoxSendMsg.AppendText(Environment.NewLine)));
                // Continue the waiting for data on the Socket
                WaitForData(socketData.m_currentSocket);
            }
        }
        catch (ObjectDisposedException)
        {
            System.Diagnostics.Debugger.Log(0, "1", "\nOnDataReceived: Socket has been closed\n");
        }


        catch (SocketException se)
        {
            MessageBox.Show(se.Message);
        }

    }
我希望这是足够的信息,因为我真的知道如何做到这一点。。 感谢您提供的所有意见/建设性的批评。

试试这个:

var clientSocket = (Socket)asyn.AsyncState;
for (int i = 0; i < m_workerSocket.Count(); i++)
{
    if (m_workerSocket[i] == clientSocket)
    {
        var sockets = new List<Socket>(m_workerSocket);
        sockets.RemoveAt(i);
        m_workerSocket = sockets.ToArray();
        break;
    }
}
clientSocket.Close()
var clientSocket=(Socket)asyn.AsyncState;
对于(int i=0;i
我已经实现了您建议的代码,但返回时出现了两个错误。第一个错误是错误2“System.Array”不包含“RemoteAt”的定义,并且找不到接受类型为“System.Array”的第一个参数的扩展方法“RemoteAt”。错误1接线员“对不起,有几个打字错误。。。我编辑了代码来修复它们编辑修复了一个问题,但它仍然声称。RemoveAt不是系统的定义。数组很糟糕,但这比以前更接近于完成我的聊天室。我明白了,忘记了我使用了RemoveAt的扩展方法。太棒了,新编辑成功了。非常感谢您抽出时间,非常感谢。
var clientSocket = (Socket)asyn.AsyncState;
for (int i = 0; i < m_workerSocket.Count(); i++)
{
    if (m_workerSocket[i] == clientSocket)
    {
        var sockets = new List<Socket>(m_workerSocket);
        sockets.RemoveAt(i);
        m_workerSocket = sockets.ToArray();
        break;
    }
}
clientSocket.Close()