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); } }
public byte[] Translate(STUNAddress peer, string text) { byte[] utfBytes = Encoding.UTF8.GetBytes(text); string ipaddress = peer.ToString(); return(Translate(ipaddress, utfBytes)); }
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); } }
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); }
public byte[] Translate(STUNAddress ipaddress, byte[] data) { return(Translate(ipaddress.ToString(), data)); }