コード例 #1
0
ファイル: UdpEndpoint.cs プロジェクト: xinyitian/SimpleUdp
        /// <summary>
        /// Start the server to receive datagrams.  Before calling this method, set the 'DatagramReceived' event.
        /// </summary>
        public void StartServer()
        {
            State state = new State(_MaxDatagramSize);

            _Socket.BeginReceiveFrom(state.Buffer, 0, _MaxDatagramSize, SocketFlags.None, ref _Endpoint, _ReceiveCallback = (ar) =>
            {
                State so = (State)ar.AsyncState;
                _Socket.BeginReceiveFrom(so.Buffer, 0, _MaxDatagramSize, SocketFlags.None, ref _Endpoint, _ReceiveCallback, so);
                int bytes = _Socket.EndReceiveFrom(ar, ref _Endpoint);

                string ipPort = _Endpoint.ToString();
                string ip     = null;
                int port      = 0;
                Common.ParseIpPort(ipPort, out ip, out port);

                if (!_RemoteSockets.Contains(ipPort))
                {
                    _RemoteSockets.AddReplace(ipPort, _Socket);
                    EndpointDetected?.Invoke(this, new EndpointMetadata(ip, port));
                }

                if (bytes == so.Buffer.Length)
                {
                    DatagramReceived?.Invoke(this, new Datagram(ip, port, so.Buffer));
                }
                else
                {
                    byte[] buffer = new byte[bytes];
                    Buffer.BlockCopy(so.Buffer, 0, buffer, 0, bytes);
                    DatagramReceived?.Invoke(this, new Datagram(ip, port, buffer));
                }
            }, state);
        }
コード例 #2
0
 public void ProcessTask( )
 {
     while (IsRunning)
     {
         if (ReceiveQueue.TryDequeue(out ReceiveDatagram datagram))
         {
             DatagramReceived? .Invoke(this, new ReceiveDatagramEventArgs ( datagram ));
         }
         else
         {
             Thread.Sleep(20);
         }
     }
 }
コード例 #3
0
 private async void Listen()
 {
     await Task.Run(async() =>
     {
         var wait = new SpinWait();
         while (IsActive)
         {
             var receiveResult = await _client.ReceiveAsync();
             var eventArgs     = new DatagramReceivedArgs(receiveResult.Buffer, receiveResult.RemoteEndPoint);
             DatagramReceived?.Invoke(this, eventArgs);
             if (eventArgs.Reply != null)
             {
                 await _client.SendAsync(eventArgs.Reply, eventArgs.Reply.Length, eventArgs.RemoteEndpoint);
             }
             wait.SpinOnce();
         }
     });
 }
コード例 #4
0
 public void ExecuteUdpListenerLoop()
 {
     while (true)
     {
         try
         {
             var remoteEndPoint = new IPEndPoint(IPAddress.Any, 0);
             var data           = _udpListener.Receive(ref remoteEndPoint);
             DatagramReceived?.Invoke(this, new DataGramReceivedArgs
             {
                 Data   = data,
                 Sender = remoteEndPoint,
             });
         }
         catch (Exception e)
         {
         }
     }
 }
コード例 #5
0
 private async void Listen()
 {
     await Task.Run(async() =>
     {
         using (var client = new UdpClient(Port))
         {
             while (IsActive)
             {
                 var receiveResult = await client.ReceiveAsync();
                 var eventArgs     = new DatagramReceivedArgs(receiveResult.Buffer, receiveResult.RemoteEndPoint);
                 DatagramReceived?.Invoke(this, eventArgs);
                 if (eventArgs.Reply != null)
                 {
                     await client.SendAsync(eventArgs.Reply, eventArgs.Reply.Length, eventArgs.RemoteEndpoint);
                 }
             }
         }
     });
 }
コード例 #6
0
ファイル: AsyncTcpServer.cs プロジェクト: xdpcxq/WCS
 /// <summary>
 /// 接收到数据报文事件
 /// </summary>
 /// <param name="sender"></param>
 /// <param name="datagram"></param>
 private void RaiseDatagramReceived(TcpClient sender, byte[] datagram)
 {
     DatagramReceived?.Invoke(this, new TcpDatagramReceivedEventArgs <byte[]>(sender, datagram));
 }
コード例 #7
0
 /// <summary>
 /// 接收数据报文事件
 /// </summary>
 /// <param name="sender"></param>
 /// <param name="datagram"></param>
 private void OnDatagramReceived(AsyncTCPClient sender, byte[] datagram)
 {
     DatagramReceived?.Invoke(this, new TCPDatagramReceiveEventArgs <byte[]>(sender, datagram));
 }
コード例 #8
0
 private void RaiseDatagramReceived(TcpClient tcpClient, byte[] receivedBytes)
 {
     DatagramReceived?.Invoke(this, new TcpDatagramReceivedEventArgs <byte[]>(tcpClient, receivedBytes));
 }