Esempio n. 1
0
        public void RequestChannelBind(STUNAddress stunAddress)
        {
            lock (_lock)
            {
                MessageSTUN message = CreateMessageSTUN(STUNMethod.ChannelBindRequest);
                // channel number [0x4000 through 0x4FFF](uint)random.Next(0x4001, 0x4FFF);
                uint channelNumber;
                if (!ip2ChannelNumber.ContainsKey(stunAddress.ToString()))
                {
                    GenerateChannelNumberForPeer(stunAddress);
                }
                channelNumber = ip2ChannelNumber[stunAddress.ToString()];
                Console.WriteLine("RequestChannelBind: {0} {1}:{2}", channelNumber, stunAddress.ToString(), stunAddress.port);
                channelNumber = (uint)(channelNumber << 16);
                message.WriteString(STUNAttribute.Username, message.username);
                message.WriteString(STUNAttribute.Realm, message.realm);

                message.WriteUInt(STUNAttribute.ChannelNumber, channelNumber);

                byte[] ret;
                if (stunAddress.IsIPv4)
                {
                    ret    = new byte[8];
                    ret[1] = (byte)(0x01); // family
                }
                else
                {
                    ret    = new byte[16];
                    ret[1] = (byte)(0x02); // family
                }
                ret[0] = (byte)(0x0);

                ret[3]  = (byte)(stunAddress.port & 0xff);
                ret[2]  = (byte)((stunAddress.port >> 8) & 0xff);
                ret[2] ^= transactionID[0];
                ret[3] ^= transactionID[1];

                for (int i = 0; i < stunAddress.address.Length; i++)
                {
                    ret[4 + i] = (byte)(stunAddress.address[i] ^ transactionID[i]);
                }

                message.WriteBytes(STUNAttribute.XorPeerAddress, ret);
                if (nonce != null)
                {
                    message.WriteBytes(STUNAttribute.Nonce, nonce);
                    message.WriteRequestIntegrity();
                }
                byte[] pkg = message.WriteRequest();
                sender.Send(pkg);
            }
        }
Esempio n. 2
0
        public byte[] Translate(STUNAddress peer, string text)
        {
            byte[] utfBytes  = Encoding.UTF8.GetBytes(text);
            string ipaddress = peer.ToString();

            return(Translate(ipaddress, utfBytes));
        }
Esempio n. 3
0
        private uint GenerateChannelNumberForPeer(STUNAddress peer)
        {
            string key = peer.ToString();

            lock (_lock)
            {
                if (ip2ChannelNumber.ContainsKey(key))
                {
                    return(ip2ChannelNumber[key]);
                }
                // channel number [0x4000 through 0x4FFF]
                while (channelNumber2Peer.ContainsKey(channelNumberAvailalbe))
                {
                    AddChannelNumberAvailalbe();
                }
                channelNumber2Peer[channelNumberAvailalbe] = peer;
                uint channelnumber = channelNumberAvailalbe;
                ip2ChannelNumber[key] = channelNumberAvailalbe;
                AddChannelNumberAvailalbe();
                return(channelnumber);
            }
        }
Esempio n. 4
0
        private bool AddPeer(STUNAddress addr)
        {
            lock (_lock)
            {
                if (ip2ChannelNumber.ContainsKey(addr.ToString()))
                {
                    return(false);
                }
            }
            peers.Add(addr);
            var id = GenerateChannelNumberForPeer(addr);

            lock (_lockHeartbeat)
            {
                peerHeartbeat[id] = -2;// (int)((double)lifeTime / (double)STUNClient.HeartbeatAfterConnected + 0.5);
            }

            if (peersInTrashCan.ContainsKey(id))
            {
                peersInTrashCan.Remove(id);
            }
            return(true);
        }
Esempio n. 5
0
 public byte[] Translate(STUNAddress ipaddress, byte[] data)
 {
     return(Translate(ipaddress.ToString(), data));
 }