2011-01-07 5 views
3

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) После немного прибегая к помощи, я не могу показаться, чтобы иметь возможность отвязать порт, таким образом, если у меня будет достаточное количество подключающихся клиентов, в конечном итоге у меня не хватит портов для прослушивания.

+0

Что такое «другой вопрос»? – Gabe

ответ

7

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

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

Чтобы «развязать порт», вы захотите закрыть/закрыть сервер разъем.

Update, чтобы очистить некоторую путаницу

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

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

  • Shutdown
  • Закрыть
  • Удалить из списка

Disconnect, а остальные не нужны.

+0

Мне просто интересно, как убить соединение, и освободить порт, когда пользователь невольно отключается или даже отключается. EDIT: сокет, который я хочу закрыть, будет одним из многих клиентских сокетов. ATM У меня есть один сокет, слушающий потенциальных клиентов, тогда клиент получает номер порта для повторного подключения: учитывая, что только один клиент может подключаться к порту/1 гнезду на порт. (Я думаю) – ryan1894

+0

Ваш «один сокет, слушая потенциальных клиентов», имел вызов в .Bind() в какой-то момент, верно? Где вы указали EndPoint (у которого должен был быть связанный с ним порт)? Этот порт - это единственный порт, к которому должны подключаться ваши клиенты (и у вас может быть много клиентских сокетов, подключенных к этому одному порту). То, что вы ** не можете сделать **, запустило ** второй серверный сокет **, прослушивая соединения в том же EndPoint, пока вы не отвязаете свой ** первый ** сервер от него (закрывая этот первый сокет). – Sapph

+0

", пока вы не отвяжете свой первый сервер от него (закрыв этот первый сокет)." Это именно то, что у меня возникают проблемы с .EDIT: Ситуация такова: я слушаю порт 5900. Полученное соединение -> снова подключитесь к 5901. Успех соединения. Клиент отключается, и поэтому я пытаюсь высвободить 5901 ->, затем попытаюсь выполнить повторную проверку -> исключение – ryan1894

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