private void ReadQueryPacketsAsync(object parameter) { Socket udpListener = parameter as Socket; EndPoint remoteEP; FixMemoryStream recvBufferStream = new FixMemoryStream(BUFFER_MAX_SIZE); FixMemoryStream sendBufferStream = new FixMemoryStream(BUFFER_MAX_SIZE); int bytesRecv; if (udpListener.AddressFamily == AddressFamily.InterNetwork) { remoteEP = new IPEndPoint(IPAddress.Any, 0); } else { remoteEP = new IPEndPoint(IPAddress.IPv6Any, 0); } try { while (true) { bytesRecv = udpListener.ReceiveFrom(recvBufferStream.Buffer, ref remoteEP); if (bytesRecv > 0) { recvBufferStream.Position = 0; recvBufferStream.SetLength(bytesRecv); IPEndPoint remoteNodeEP = remoteEP as IPEndPoint; if (NetUtilities.IsIPv4MappedIPv6Address(remoteNodeEP.Address)) { remoteNodeEP = new IPEndPoint(NetUtilities.ConvertFromIPv4MappedIPv6Address(remoteNodeEP.Address), remoteNodeEP.Port); } try { DhtRpcPacket request = new DhtRpcPacket(recvBufferStream, remoteNodeEP.Address); DhtRpcPacket response = ProcessPacket(request); //send response if (response != null) { sendBufferStream.Position = 0; response.WriteTo(sendBufferStream); udpListener.SendTo(sendBufferStream.Buffer, 0, (int)sendBufferStream.Position, SocketFlags.None, remoteEP); } //if contact doesnt exists then add contact else update last seen time KBucket closestBucket = _routingTable.FindClosestBucket(request.SourceNode.NodeID); NodeContact contact = closestBucket.FindContactInCurrentBucket(request.SourceNode.NodeID); if (contact == null) { //check if the closest bucket can accomodate another contact if (!closestBucket.IsCurrentBucketFull(true)) { ThreadPool.QueueUserWorkItem(AddContactAfterPingAsync, request.SourceNode); } } else { contact.UpdateLastSeenTime(); } } catch { } } } } catch (Exception ex) { Debug.Write("DhtClient.ReadQueryPacketsAsync", ex); } }