public void Initialize()
            {
                var networkInterfaces = NetworkInterface.GetAllNetworkInterfaces();

                foreach (var networkInterface in networkInterfaces)
                {
                    logger.Info("Found network interface: " + networkInterface.Name);

                    if (!networkInterface.SupportsMulticast ||
                        networkInterface.OperationalStatus != OperationalStatus.Up ||
                        networkInterface.IsReceiveOnly)
                    {
                        continue;
                    }

                    var ipProperties   = networkInterface.GetIPProperties();
                    var ipv4Properties = ipProperties.GetIPv4Properties();

                    if (ipv4Properties != null)
                    {
                        var innerContext = new PerInterfaceNetworkContextImpl(
                            udpCourierNetwork,
                            networkingProxy,
                            configuration,
                            endpoint);
                        innerContext.DataArrived += InvokeDataArrived;
                        innerContext.Initialize(networkInterface);
                        interfaceNetworkContexts.Add(innerContext);
                    }
                }
            }
                public ReceiveState(PerInterfaceNetworkContextImpl networkContext, Socket socket, IPEndPoint remoteEndPoint)
                {
                    this.networkContext = networkContext;
                    this.socket         = socket;

                    this.socketEventArgs = new SocketAsyncEventArgs();
                    this.socketEventArgs.AcceptSocket   = socket;
                    this.socketEventArgs.UserToken      = this;
                    this.socketEventArgs.RemoteEndPoint = remoteEndPoint;
                    this.socketEventArgs.SetBuffer(buffer, 0, buffer.Length);
                    this.socketEventArgs.Completed += HandleReceiveCompleted;
                }