1

我是 C# 和多威胁应用程序的中级专家,我遇到了在应用程序运行时更改端口的问题(我认为最好的方法是销毁旧的 Socket 并打开一个全新的),但我不能这样做。

下面是我的部分代码 - WindowsForm 应用程序:

    private byte[] data = new byte[1024];
    private int size = 1024;
    private Socket server;

    delegate void Delegate();


     public Form1()
    {
        InitializeComponent();
        StartServer(11000);

    }

    public void StartServer(int port)
    {
        server = new Socket(AddressFamily.InterNetwork,
              SocketType.Stream, ProtocolType.Tcp);
        IPEndPoint iep = new IPEndPoint(IPAddress.Any, port);
        server.Bind(iep);
        server.Listen(100);
        server.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);

        server.BeginAccept(new AsyncCallback(AcceptConn), server);
        listbox.Items.Add("[S] Server start...");}));

    }

    void AcceptConn(IAsyncResult iar)
    {   
        Socket oldserver = (Socket)iar.AsyncState;
        Socket client = oldserver.EndAccept(iar);

        client.BeginReceive(data, 0, size, SocketFlags.None,
                          new AsyncCallback(ReceiveData), client);


    }

    void ReceiveData(IAsyncResult iar)
    {
        Socket client = (Socket)iar.AsyncState;
        int recv = client.EndReceive(iar);
        if (recv == 0)
        {
            client.Close();



            server.BeginAccept(new AsyncCallback(AcceptConn), server);
            return;
        }
        string receivedData = Encoding.ASCII.GetString(data, 0, recv);



        byte[] message2 = Encoding.ASCII.GetBytes(receivedData);

        listbox.BeginInvoke(new Delegate(() =>
        { listbox.Items.Add("[S] Rcv: " + receivedData); }));

    }

上面的代码运行良好,但是当我想关闭这个 Socket 并打开一个新的时,我得到了一些错误:

案例1:错误::System.ObjectDisposedException:“无法访问已删除的对象。对象名称:'System.Net.Sockets.Socket'。”

    private void change_button_Click(object sender, EventArgs e)
    {
      server.Close();
    }

案例2:错误:System.Net.Sockets.SocketException:“发送或接收数据的请求已被阻止,因为套接字未连接并且在使用“发送到”调用“通过套接字发送数据报时未指定地址”

    private void change_button_Click(object sender, EventArgs e)
    {
       server.Shutdown(SocketShutdown.Both);


    }

案例3:不是错误,但现在我的应用程序在两个端口上侦听和处理连接,这不是以这种方式工作的。

    private void change_button_Click(object sender, EventArgs e)
    {
       StartServer(22000);
    }

有人可以帮我理解为什么我不能关闭创建的异步 TCP 套接字吗?感谢你!

4

0 回答 0