c # не может получить доступ к удаленному объекту - PullRequest
7 голосов
/ 09 января 2010

Я делаю приложение сервер / клиент.

Я установил сокет сервера на прослушивание и установил метод BeginAccept (). И когда я закрыл сокет сервера (Socket.Close ()), чтобы отключить сервер, исключение, выброшенное из метода асинхронного обратного вызова метода BeginAccept (). Я проверил исключение, и нашел исключение, сказав мне следующее:

Сообщение "Невозможно получить доступ к удаленному объекту с именем "System.Net.Sockets.Socket". Имя объекта: "System.Net.Sockets.Socket". "String

На мой взгляд, это как раз то: Метод Socket.Close (), но обратный вызов не был выпущен до Розетка закрыта. "

Я выполнил поиск в сети и обнаружил, что это не ошибка, а спроектированное исключение, так как beginaccept было отменено.

мой вопрос, как мне справиться с этим, кроме? какая обработка там должна быть для этого?

Я просто буду воспринимать это как нормальное событие:

      OnNetworkEvents eventArgs = new OnNetworkEvents(false, "Ready", e.Message);
      OnUpdateNetworkStatusMessage(this, eventArgs);

любые комментарии по-прежнему приветствуются.

1 Ответ

6 голосов
/ 09 января 2010

Если вас не волнует исключение (т. Е. Это не «исключение», это обычная рабочая процедура и происходит каждый раз), вы можете просто проигнорировать / подавить его. (До тех пор, пока это не произойдет в ситуации, которая указывает на реальную ошибку)

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

Если вы контролируете оба конца канала связи, то вы можете отправить явное сообщение «shutdown», которое сообщает клиенту, что соединение должно быть закрыто (и это, конечно, может быть применено в обратном вызове, когда сообщение получено).

(Но я бы хотел услышать, нашел ли кто-нибудь еще лучшее решение, поскольку у меня похожая ситуация с реализацией UDP-коммуникаций)

...