Как программно «развязать» сокет? - PullRequest
3 голосов
/ 07 января 2011

1) Сокет не отсоединяется от LocalEndPoint до тех пор, пока процесс не завершится.
2) Я попробовал решения из другого вопроса, а также попытался подождать минуту - безрезультатно.
3) На данный момент я попробовал следующее, чтобы избавиться от сокета и его соединений:

public static void killUser(User victim)  
    {  
        LingerOption lo = new LingerOption(false, 0);  
victim.connectedSocket.SetSocketOption(SocketOptionLevel.Socket,SocketOptionName.Linger,     lo);  
        victim.connectedSocket.Shutdown(SocketShutdown.Both);  
        victim.connectedSocket.Disconnect(true);  
        victim.connectedSocket.Close();  
        clients.RemoveAt(victim.ID);  
    }  

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

1 Ответ

8 голосов
/ 07 января 2011

Я подозреваю, что вы путаете сокеты подключенных клиентов с сокетом вашего сервера.

Ваш серверный сокет прослушивает входящие соединения через определенный порт. Сокет, который вы закрываете в этой функции, является вашим каналом для одного из (потенциально многих) удаленных подключений.

Чтобы «отсоединить порт», вам нужно выключить / закрыть сервер сокет.

Обновление для устранения путаницы

У вас должен быть «серверный» сокет, для которого вы сделали вызов .Bind (EndPoint), а затем вызов .Listen (). Это сокет, который вы хотите отключить / закрыть, чтобы «отсоединить» и освободить порт для дальнейшего использования.

Затем у вас есть несколько «клиентских» сокетов, на которые вы получаете ссылки всякий раз, когда ваш «серверный» сокет принимает новое соединение. Все они могут быть связаны с одним и тем же портом без проблем. Чтобы закрыть одно из этих соединений и отключить клиента, сделайте то, что вы делаете сейчас. Вы можете урезать метод до:

  • Shutdown
  • Закрыть
  • Удалить из вашего списка

Отключить, а остальные не нужны.

...