Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Распределённые приложения и сеть > Рестарт Udp Сервера


Автор: DenwerD 25.2.2009, 16:28
Доброго времени суток.
Пишу Udp сервер(UdpServer) принимающей частью служет System.Net.UdpClient - создаётся он в конструкторе UdpServer.  Даннные на UdpClient принимается асинхронно.

У UdpServer есть метод Start() который запускает метод UdpClient.BeginReceive
Так же у UdpServer есть метод Restart который должен если произошли изминения (например порт сменился) должен пересоздать UdpClent

Вот метод Restart
Код

        try
             {
                
                this.udpClient.Client.Shutdown(System.Net.Sockets.SocketShutdown.Both);
                this.udpClient.Close();
                
                this.udpClient = new System.Net.Sockets.UdpClient(this.localEndPoint);

                this.udpClient.BeginReceive(new AsyncCallback(this.udpReceiveMessageCallback), null);
                
            }
            catch (System.Net.Sockets.SocketException se)
            {
                this.OnSocketError(se);
            }
            catch (Exception e)
            {
                this.OnServerError(e);
            }

 
В результате его вызова генерируется исключение в следующем методе
Код

private void udpReceiveMessageCallback(IAsyncResult aResult)
        {

            try
            {
                  //здесь возникает исключение
                 //Объект IAsyncResult не был возвращен соответствующим
// асинхронным методом данного  класса.   Имя параметра: asyncResult
                 
                  Byte[] receivedBytes = this.udpClient.EndReceive(aResult, ref this.remoteEndPoint);

                string receiveString = Encoding.ASCII.GetString(receivedBytes);

            }
            catch (System.Net.Sockets.SocketException se)
            {
                //генерируем событие об ошибке сокета
                this.OnSocketError(se);
            }
            catch (Exception e)
            {
                //генерируем событие об ошибке 
                this.OnServerError(e);
            }

          
        }


Подскажите как можно этого избежать. Нормально закрыть сокет. А потом создать новый но уже на другом порту или адресе. Или есть другие способы пересадить UdpClient на другой адрес или порт?

Заранее спасибо

Автор: jonie 26.2.2009, 09:18
перед рестартом привести всё в синхронизированное состояние - EndRecive вызвать имхо, а уже потом только "глушить" сервер и пересаздовать...

Автор: DenwerD 26.2.2009, 10:07
Цитата(jonie @ 26.2.2009,  09:18)
перед рестартом привести всё в синхронизированное состояние - EndRecive вызвать имхо, а уже потом только "глушить" сервер и пересаздовать...

EndReceive конечно хорошо и правильно, но вот только вызывать его надо в методе  (udpReceiveMessageCallback) переданный в  BeginReceive в качестве коллбэка и передавать ему (EndReceive -у) в качестве аргумента результат асинхронной операции, а где же я его возьму  если  рестарт у меня в другом методе.

Вот такой вот геморой. 

Может кто нибудь знает как заглушить асинхронную операцию не из  коллбэка а из другого метода

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)