На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
  
> C# UDP Broadcast , Широковещ. запрос и ответ на него
    Имееться:
    Microsoft Visual Studio 2005
    Язык - C#
    Задача:
    Написать класс, который будет создавать UDP сокет - клиент, слать Broadcast сообщения и получать ответ (ответ не Broadcast).
    Трудности:
    Запрос посылается, ответ сервером высылается но я его не могу получить

    Мож чо не так делаю? Подскажите кто знает!!!

    Вот код
    Исходный код

    ExpandedWrap disabled
      EndPoint EP;
      IPEndPoint ipEP;
      private Socket WorkSocket;
             private class StateObject
             {
                 public Socket workSocket = null;
                 public const int BufferSize = 10240;
                 public byte[] buffer = new byte[BufferSize];
                
             }
             StateObject state = new StateObject();
       
      public void Connect()
      {
                    ipEP = new IPEndPoint(IPAddress.Parse("255.255.255.255"), Port);
                    EP = (EndPoint)ipEP;
                    WorkSocket = new Socket(ipEP.Address.AddressFamily, SocketType.Dgram, ProtocolType.Udp);
                    WorkSocket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.Broadcast, 1);
                    WorkSocket.EnableBroadcast = true;
                    WorkSocket.Blocking = false;
                    WorkSocket.BeginConnect(EP, new AsyncCallback(ConnectCallback), WorkSocket);
             }
             private void ConnectCallback(IAsyncResult ar)
             {
                     Socket client = (Socket)ar.AsyncState;
                     client.EndConnect(ar);
                     this.ReceiveThread();//запускаем функцию прослушивания, если она инициализирована или прервана
             }
             private void ReceiveThread()
             {
                     state.workSocket = WorkSocket;
                         this.WorkSocket.BeginReceiveFrom(state.buffer, 0, StateObject.BufferSize, SocketFlags.None, ref EP,
                             new AsyncCallback(ReceiveCallback), state);
             }
             private void ReceiveCallback(IAsyncResult ar)
             {
                     // Retrieve the state object and the client socket
                     // from the asynchronous state object.
                     StateObject state = (StateObject)ar.AsyncState;
                     Socket client = state.workSocket;
                     // Read data from the remote device.
                     int bytesRead;
                         bytesRead = client.EndReceiveFrom(ar, ref EP);
                     if (bytesRead > 0)
                     {
                        
                         this.ReceiveThread();
                     }
             }
             public void SendTo(byte[] Buf, int CountBytes, System.Net.EndPoint EPtmp)
             {
                 WorkSocket.BeginSendTo(Buf, 0, CountBytes, SocketFlags.None, ipEP,
                     new AsyncCallback(SendCallback), WorkSocket);
             }
       
             private void SendCallback(IAsyncResult ar)
             {
                     // Retrieve the socket from the state object.
                     Socket client = (Socket)ar.AsyncState;
       
                     // Complete sending the data to the remote device.
                     int bytesSent = client.EndSend(ar);
             }
      Но вот такая конструкция работает

      ExpandedWrap disabled
                IPEndPoint MyPoint;
                EndPoint RemotePoint;
        // тута инициализация сокета+++
                public cUDP()    
                {
                    MyPoint = new IPEndPoint(IPAddress.Parse("255.255.255.255"), 40000);
                    RemotePoint = (EndPoint)MyPoint;
                    try
                    {
                        WorkSock = new Socket(MyPoint.Address.AddressFamily, SocketType.Dgram, ProtocolType.Udp);
                        WorkSock.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.Broadcast, 1);
                        WorkSock.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReceiveTimeout, 1000);
                    }
                    catch (Exception e)
                    {
                    }
                }
        // тута инициализация сокета---
         
        // функция отправки сообщения и получения ответа
                public void Send(byte[] Buf, int CB)
                {
                    try
                    {
                        WorkSock.SendTo(Buf, CB, SocketFlags.None, MyPoint);
                    }
                    catch (Exception e)
                    {
                        return;
                    }
                    byte[] tmp = new byte[WorkSock.SendBufferSize];
                    try
                    {
                        CB = WorkSock.ReceiveFrom(tmp, ref RemotePoint);
                    }
                    catch (Exception e)
                    {
                        return;
                    }
                }

      Но это "синхронная" реализация, а нужна асинхронная...
      Сообщение отредактировано: letenant -
        Так и пришлось использовать потоки...
        0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
        0 пользователей:


        Рейтинг@Mail.ru
        [ Script execution time: 0,0269 ]   [ 16 queries used ]   [ Generated: 5.05.24, 20:30 GMT ]