отсоединить сокет соединения C # / python - PullRequest
1 голос
/ 01 июля 2011

Что у меня есть:

  • У меня есть две клиентские программы для сокетов, написанные на C #.
  • У меня есть одна программа сервера сокетов (не написанная мной, но она работает) на Python.

Проблема:

Первый клиент сокетов c #, который я написал, работает нормально и может взаимодействовать с клиентом сервера Python. Я могу отправить данные без проблем. Однако я хотел переписать код, чтобы сделать его более объектно-ориентированным, поэтому я сделал вторую программу, аналогичную первой, с точки зрения того, что сделано.

Проблема в том, что второй не подключится, говоря это:

System.Net.Sockets.SocketException: была сделана попытка получить доступ к сокету запрещенным способом с помощью его прав доступа.

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

Когда я сделал netstat -a, я действительно увидел соединение, и в конце он сказал TIME_WAIT.

Вопрос в том, как мне его отменить? Это на C # / клиентской стороне?

К вашему сведению, я уже пытался закрыть / отключить / выключить сокет, но ничего из этого не получилось. Я также вставил в эту команду

connection.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);

при создании соединения с сокетом, но это тоже не сработало.

Должен ли я что-то делать на стороне сервера, чтобы разорвать соединение?

1 Ответ

0 голосов
/ 02 июля 2011

Я знаю, что вы сказали, что уже звоните, закрываете или отключаете.

Но вы повторно инициализируете переменную сокета.

Например: connection = new System.Net.Sockets.Socket (...

Если вы используете более старую версию .Net, вам также может понадобиться вызвать Dispose () после вызова Close ().

Например:

connection.Close();
connection.Dispose();
connection = new System.Net.Sockets.Socket(...

Убедитесь, чтовсегда работать с сокетами в операторах try, так как любые вызовы для отправки и получения данных или закрытия сокета могут привести к ошибке, на каком этапе вы должны записать ошибку и вызвать Close (), а затем, если применимо, Dispose () в экземпляре сокетадля очистки ресурсов. После этого вы можете повторно инициализировать новый экземпляр сокета, чтобы попытаться установить новое соединение с сервером.

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