Как я могу закрыть и снова открыть asyn c TCP-сокет в C#? - PullRequest
0 голосов
/ 27 марта 2020

У меня средний опыт в 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); }));

    }

Над кодом работает отлично, но когда я хочу закрыть этот сокет и открыть новый, я получаю некоторые ошибки :

case 1: Error :: System.ObjectDisposedException: «Невозможно получить доступ к удаленному объекту. Имя объекта: 'System. Net .Sockets.Socket'."

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

case 2 : ОШИБКА: System. Net .Sockets.SocketException: «Запрос на отправку или получение данных был заблокирован, поскольку сокет не подключен, и не был указан адрес при отправке дейтаграммы через сокет с использованием вызова« send to »»

    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);
    }

Может кто-нибудь помочь мне понять, почему я не могу закрыть созданный asyn c TCP Socket? Спасибо тебе!

...