Клиент UDP - Исключение при создании сокета. Обычно разрешено только одно использование каждого адреса сокета (протокол / сетевой адрес / порт) - PullRequest
3 голосов
/ 28 июля 2011

Я создаю UDP-клиент в моем приложении на c #.

labelEP = new System.Net.IPEndPoint(tempAdd, ethPortAddress);
recvMIUCmndsSocket = new UdpClient(labelEP);
Socket temp = recvMIUCmndsSocket.Client;
 //Allow broadcasts
temp.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.Broadcast, 1);

Всякий раз, когда я запускаю свое приложение, оно работает нормально. Если в моем приложении есть какие-либо проблемы, приложение перезапускается само по себе. Иногда, когда приложение перезапускается, я сталкиваюсь с исключением:

"Only one usage of each socket address (protocol/network address/port) is normally permitted "

Кажется, сборщик мусора не освободил предыдущий экземпляр сокета udpclient. Может ли это случиться?

С уважением Раджу

Ответы [ 2 ]

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

Я не совсем знаком с C #, но недавно я выполнял аналогичную работу на Java и обнаружил три вещи.

Во-первых, вам необходимо закрыть соединения, даже после возникновения ошибок.Это может немного запутать, поскольку (по крайней мере, в Java) некоторые вызовы для очистки после себя могут генерировать исключения.

Во-вторых, это явное закрытие соединений позволяет сборщику мусора лучше выполнять свою работу.Однако вы на самом деле не контролируете, когда работает GC, поэтому вы не можете ожидать, что соединение будет очищено и сокет сразу же снова будет готов к использованию.Если вы немедленно попытаетесь открыть соединение, сокет может быть еще не готов.

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

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

Сборщик мусора позаботится об утилизации управляемых объектов. Согласно моему базовому пониманию, сокеты являются объектами Windows, и .net предоставляет управляемые оболочки вокруг них. Также однажды мой архитектор сказал мне, что когда мы закрываем порт или сокет, окнам требуется некоторое время, чтобы закрыть его. Я думаю, что вы столкнулись с этой проблемой из-за такого поведения оконных сокетов.

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