Ошибка сокета C # 10022 - PullRequest
       13

Ошибка сокета C # 10022

1 голос
/ 10 ноября 2009

У меня ошибка 10022 в приложении, использующем сокеты в C # .NET3.5.

В своем коде я привязываю сокет к локальному IP-адресу. Когда мне это больше не нужно, я просто отключаю его (reader.socket.Disconnect (true);) с "true", чтобы иметь возможность использовать его снова.

Но когда я снова вызываю метод bind, он вылетает с ошибкой 10022 (неверный аргумент).

Если я задаю строку с этим методом в качестве комментария, она падает на строку «прослушать», говоря, что соединение уже установлено (хотя я назвал отключение!)

Есть идеи?

Спасибо


Вот часть кода, которая не работает:

public void WaitConnexion(IPEndPoint localEP)
        {
            if (localEP.Port != 9000)
            {
                MessageBox.Show("Le port doit être 9000");
                return;
            }
            LocalEndPoint = localEP;

            if (reader.socket.Connected)
            {
                MessageBox.Show("Vous êtes déjà connecté", "Conflit de connexion", MessageBoxButton.OK, MessageBoxImage.Exclamation);
                return;
            }

            // on bind le socket avec le endpoint local, et on le met en attente de connexion asynchrone

          //  reader.socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);


            reader.socket.Bind(localEP);

            reader.socket.Listen(1);

            reader.socket.BeginAccept(new AsyncCallback(WaitConnexionCallBack), reader.socket);
        }

а вот метод diconnect с его обратным вызовом:

 public void Disconnect()
        {
            if (!reader.socket.Connected)
                return;


            reader.socket.BeginDisconnect(true, new AsyncCallback(DisconnectCallBack), reader.socket);


        }

       private void DisconnectCallBack(IAsyncResult result)
        {
            reader.socket = (result.AsyncState as Socket);
            reader.socket.EndDisconnect(result);


            if (Disconnected != null)
                Disconnected(this, EventArgs.Empty);



        }

1 Ответ

1 голос
/ 14 ноября 2009

Я нашел решение.

Похоже, что сборщик мусора не был вызван достаточно быстро, что позволило сохранить в памяти значение сокета, которое фактически было удалено.

Модификация кода в DisconnectedCallBack:

   reader.socket = (result.AsyncState as Socket);
   reader.socket.EndDisconnect(result);
   reader.socket.close(0);
   GC.Collect();  // call garbage collector to clean the socket

Изменение кода в WaitConnexion:

 reader.socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

Повторное создание сокета.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...