Exemplo n.º 1
0
        private Atom CreatePCPHelo()
        {
            var helo = new AtomCollection();

            helo.SetHeloAgent(PeerCast.AgentName);
            helo.SetHeloSessionID(PeerCast.SessionID);
            switch (PeerCast.GetPortStatus(Channel.NetworkAddressFamily))
            {
            case PortStatus.Open:
            {
                var listener = PeerCast.FindListener(
                    connection.RemoteEndPoint.Address,
                    OutputStreamType.Relay | OutputStreamType.Metadata);
                helo.SetHeloPort(listener.LocalEndPoint.Port);
            }
            break;

            case PortStatus.Firewalled:
                break;

            case PortStatus.Unknown:
            {
                var listener = PeerCast.FindListener(
                    connection.RemoteEndPoint.Address,
                    OutputStreamType.Relay | OutputStreamType.Metadata);
                if (listener != null)
                {
                    helo.SetHeloPing(listener.LocalEndPoint.Port);
                }
            }
            break;
            }
            PCPVersion.SetHeloVersion(helo);
            return(new Atom(Atom.PCP_HELO, helo));
        }
Exemplo n.º 2
0
        /// <summary>
        /// 現在のチャンネルとPeerCastの状態からHostパケットを作ります
        /// </summary>
        /// <returns>作ったPCP_HOSTパケット</returns>
        private Atom CreatePCPHOST()
        {
            var host = new AtomCollection();

            host.SetHostChannelID(Channel.ChannelID);
            host.SetHostSessionID(PeerCast.SessionID);
            var globalendpoint =
                PeerCast.GetGlobalEndPoint(
                    connection.RemoteEndPoint.AddressFamily,
                    OutputStreamType.Relay);

            if (globalendpoint != null)
            {
                host.AddHostIP(globalendpoint.Address);
                host.AddHostPort(globalendpoint.Port);
            }
            var localendpoint =
                PeerCast.GetLocalEndPoint(
                    connection.RemoteEndPoint.AddressFamily,
                    OutputStreamType.Relay);

            if (localendpoint != null)
            {
                host.AddHostIP(localendpoint.Address);
                host.AddHostPort(localendpoint.Port);
            }
            host.SetHostNumListeners(Channel.LocalDirects);
            host.SetHostNumRelays(Channel.LocalRelays);
            host.SetHostUptime(Channel.Uptime);
            if (Channel.Contents.Count > 0)
            {
                host.SetHostOldPos((uint)(Channel.Contents.Oldest.Position & 0xFFFFFFFFU));
                host.SetHostNewPos((uint)(Channel.Contents.Newest.Position & 0xFFFFFFFFU));
            }
            PCPVersion.SetHostVersion(host);
            host.SetHostFlags1(
                (PeerCast.AccessController.IsChannelRelayable(Channel) ? PCPHostFlags1.Relay : 0) |
                (PeerCast.AccessController.IsChannelPlayable(Channel) ? PCPHostFlags1.Direct : 0) |
                ((PeerCast.GetPortStatus(connection.RemoteEndPoint.AddressFamily) != PortStatus.Open) ? PCPHostFlags1.Firewalled : 0) |
                (RecvRate > 0 ? PCPHostFlags1.Receiving : 0));
            host.SetHostUphostIP(connection.RemoteEndPoint.Address);
            host.SetHostUphostPort(connection.RemoteEndPoint.Port);
            return(new Atom(Atom.PCP_HOST, host));
        }