2009-11-10 2 views
1

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

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

Но когда я называю «привязкой», метод снова, он выходит из строя с ошибкой 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

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

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

Код Модификация в 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); 

Воссоздание сокет.

Смежные вопросы