private void establishUDP(int uniqueID, IPEndPoint serverEndPoint) { if (udpConnection != null) { return; } udpConnection = new UDPConnection(); udpConnection.PacketRecievedAsync += new Common.Networking.BaseConnection.PacketRecievedAsyncEventHandler(udpConnection_PacketRecievedAsync); // TODO: optimize var mem = new MemoryStream(); var bw = new BinaryWriter(mem); bw.Write((byte)InternalPacketType.ClientUDPID); bw.Write(uniqueID); udpIPEndPoint = serverEndPoint; udpConnection.SendPacket(mem.ToArray(), serverEndPoint); udpConnection.Receiving = true; }
/*public ClientPacketTransporterNetworked<T> GetPacketTransporter<T>() where T : INetworkPacket * { * return packetInfos[ typeof( T ) ] as ClientPacketTransporterNetworked<T>; * }*/ /* * /// <summary> * /// This function sends a packet over the network. Currently this functions should return immediately * /// THIS FUNCTION IS THREAD-SAFE WARNING: check this! * /// </summary> * /// <typeparam name="T"></typeparam> * /// <param name="packet"></param> * public void SendPacket<T>( T packet ) where T : INetworkPacket * { * ClientPacketTransporterNetworked<T> transporter = packetTransportersMap[ typeof( T ) ] as ClientPacketTransporterNetworked<T>; * * SendPacket( transporter, packet ); * * }*/ /// <summary> /// This function sends a packet over the network. Currently this functions should return immediately /// This is faster than without the packetinfo, since the lookup is omitted. /// THIS FUNCTION IS THREAD-SAFE WARNING: check this! /// </summary> /// <typeparam name="T"></typeparam> /// <param name="info"></param> /// <param name="packet"></param> internal void SendPacket <T>(ClientPacketTransporterNetworked <T> transporter, T packet) where T : INetworkPacket { if (!IsReady) { throw new InvalidOperationException("This ClientPacketManager is not ready for sending yet!"); } if (transporter.NetworkID == -1) { throw new InvalidOperationException("No networkID was assigned to this packet type!"); } //TODO: WARNING: NEED SERIOUS OPTIMIZATION!!!! USE A BUFFER FOR THIS INSTEAD OF MASSIVE INSTANCE SPAWNING!!! MemoryStream strm = new MemoryStream(); BinaryWriter bw = new BinaryWriter(strm); bw.Write(transporter.NetworkID); transporter.Factory.ToStream(bw, packet); if ((transporter.Flags & PacketFlags.TCP) != PacketFlags.None) { tcpConnection.SendPacket(strm.ToArray(), TCPPacketBuilder.TCPPacketFlags.None); } else if ((transporter.Flags & PacketFlags.UDP) != PacketFlags.None) { if (udpConnection == null) { Console.WriteLine("Send UDP packet discared because UDP is not yet initialized!"); } else { udpConnection.SendPacket(strm.ToArray(), udpIPEndPoint); } } else { throw new InvalidOperationException( "The transporter flags do not contain an TCP or UDP part!! Unable to send packets"); } }
private void SendPacket(byte[] bytes, GenericChannel channel, IPAddress ip, int port) { _connection.SendPacket(ArrayUtils.AddByteToArray(bytes, _channelNumbers[channel]), ip, port); }