| 
		
	
	
	
		
	Сообщений: 538 
	Тем: 76 
	Зарегистрирован: Aug 2012
	
 Репутация: 
7 
	
	
		Programmator не мог бы ты еще немного помочь. 
Я начал писать подключение к БД и возник вопрос. 
После отправки пакета PROTOCOL_LOGIN_ACK, мне надо что то вызывать чтобы подключиться к БД и пошла загрузка инф из БД в PROTOCOL_BASE_GET_USER_INFO_ACK?
 
И не мог бы подсказать что нужно для написание BattleServer с UDP 3?
 
Ошибка так и осталась, хоть я и изменил
 
			ClientConnection 
public void BeginRead(IAsyncResult asyncResult){
 try
 {
 int received = Stream.EndRead(asyncResult);
 if (received != 0)
 {
 while (received >= 6)
 {
 int length = BitConverter.ToUInt16(buffer, 0) & 0x7FFF;
 
 byte[] temp = new byte[length + 2];
 Array.Copy(buffer, 2, temp, 0, temp.Length);
 
 int bits = Id % 7 + 1;
 BitShift.Unshift(temp, bits);
 
 byte[] opcode = new byte[] { temp[0], temp[1] };
 RecvOpcode packet = (RecvOpcode)BitConverter.ToUInt16(opcode, 0);
 Type t = Type.GetType("PiercingBlow.Login.Network.Recv." + packet.ToString());
 
 if (t != null)
 {
 ClientPacket clientpacket = (ClientPacket)Activator.CreateInstance(t);
 clientpacket.Client = this;
 clientpacket.Process(temp);
 }
 else
 {
 Log.Info("PacketId = {0}", BitConverter.ToUInt16(opcode, 0), buffer.Length);
 Log.Trace(temp.ToHex());
 }
 received -= length + 4;
 Array.Copy(buffer, length + 4, buffer, 0, received);
 }
 Stream.BeginRead(buffer, 0, buffer.Length, BeginRead, Stream);
 }
 else
 {
 OnDisconnected(this);
 }
 }
 catch (IOException)
 {
 OnDisconnected(this);
 }
 catch (Exception ex)
 {
 OnDisconnected(this);
 
 Log.Error("Disconnect",ex);
 }
 }
 
 
 ![[Изображение: pW9PeEHaIqs.jpg]](https://pp.vk.me/c636228/v636228434/68e9/pW9PeEHaIqs.jpg)  
	
	
	
		
	Сообщений: 322 
	Тем: 6 
	Зарегистрирован: Nov 2015
	
 Репутация: 
505 
	
	
		Boris2105, Для udp3  сервера надо, 
Пакет подключения игрока, вот Connect 
Пакет о комнате,  
Пакет о состояние боя, 
И структуру динамического боя.  
Это все есть тут 
______________________________
 Boris2105 Написал:Programmator не мог бы ты еще немного помочь.Я начал писать подключение к БД и возник вопрос.
 После отправки пакета PROTOCOL_LOGIN_ACK, мне надо что то вызывать чтобы подключиться к БД и пошла загрузка инф из БД в PROTOCOL_BASE_GET_USER_INFO_ACK?
 
А что там такого? 
 
Пишешь коннектор, создаешь таблицу и указываешь аккаунт ид. 
потом потом ее кидаешь в цикл, получится типо такого
 
private Player player; 
player = PlayerTable.Players[account.AccountID];
	 
	
	
	
		
	Сообщений: 6,450 
	Тем: 262 
	Зарегистрирован: Nov 2007
	
 Репутация: 
44,165 
	
	
		Boris2105, предположу, что MySQL? Через NuGet ставишь MySql.Data, и по примеру Awiion  пишешь примерно следующее:
 
[SRC="csharp"]using (var reader = MySqlHelper.ExecuteReader(ConnectionString, "SELECT * FROM `accounts`")) 
{ 
	while (reader.Read()) 
	{ 
		var account = new Account() 
		{ 
			Id = reader.GetUInt64("Id"), 
			Name = reader.GetString("Name"), 
			Password = reader.GetString("Password"), 
			Email = reader.GetString("Email"), 
			// ... 
		};
 
		accounts.Add(account); 
	} 
} 
[/SRC]
 
Или доставить ещё Dapper и тогда можно так:
 
[SRC="csharp"]using (var connection = Cached.GetConnection) // connection = MySqlConnection 
{ 
    var accounts = SqlMapper.Query<AccountModel>(connection, "SELECT * FROM `accounts`");
 
    return accounts; 
} 
[/SRC]
 
И выбираешь при авторизации по логину (токену если нужно):
 
[SRC="csharp"]var account = accounts.FirstOrDefault(x => x.Login == login); 
[/SRC]
 
ConnectionString имеет следующий вид:
 Код: $"server={server};port={port};database={database};Character Set={encoding};User Id={user};password={password}"
 
	
	
	
		
	Сообщений: 538 
	Тем: 76 
	Зарегистрирован: Aug 2012
	
 Репутация: 
7 
	
	
		PROGRAMMATOR Написал:Boris2105, предположу, что MySQL? Через NuGet ставишь MySql.Data, и по примеру Awiion пишешь примерно следующее:
 [SRC="csharp"]using (var reader = MySqlHelper.ExecuteReader(ConnectionString, "SELECT * FROM `accounts`"))
 {
 while (reader.Read())
 {
 var account = new Account()
 {
 Id = reader.GetUInt64("Id"),
 Name = reader.GetString("Name"),
 Password = reader.GetString("Password"),
 Email = reader.GetString("Email"),
 // ...
 };
 
 accounts.Add(account);
 }
 }
 [/SRC]
 
 
 Или доставить ещё Dapper и тогда можно так:
 
 [SRC="csharp"]using (var connection = Cached.GetConnection) // connection = MySqlConnection
 {
 var accounts = SqlMapper.Query<AccountModel>(connection, "SELECT * FROM `accounts`");
 
 return accounts;
 }
 [/SRC]
 
 
 И выбираешь при авторизации по логину (токену если нужно):
 
 [SRC="csharp"]var account = accounts.FirstOrDefault(x => x.Login == login);
 [/SRC]
 
 
 ConnectionString имеет следующий вид:
 
 
 Код: $"server={server};port={port};database={database};Character Set={encoding};User Id={user};password={password}"
 
Спасибо , а вот на счет этого?
 Цитата:Ошибка так и осталась, хоть я и изменил
 
			ClientConnection 
public void BeginRead(IAsyncResult asyncResult){
 try
 {
 int received = Stream.EndRead(asyncResult);
 if (received != 0)
 {
 while (received >= 6)
 {
 int length = BitConverter.ToUInt16(buffer, 0) & 0x7FFF;
 
 byte[] temp = new byte[length + 2];
 Array.Copy(buffer, 2, temp, 0, temp.Length);
 
 int bits = Id % 7 + 1;
 BitShift.Unshift(temp, bits);
 
 byte[] opcode = new byte[] { temp[0], temp[1] };
 RecvOpcode packet = (RecvOpcode)BitConverter.ToUInt16(opcode, 0);
 Type t = Type.GetType("PiercingBlow.Login.Network.Recv." + packet.ToString());
 
 if (t != null)
 {
 ClientPacket clientpacket = (ClientPacket)Activator.CreateInstance(t);
 clientpacket.Client = this;
 clientpacket.Process(temp);
 }
 else
 {
 Log.Info("PacketId = {0}", BitConverter.ToUInt16(opcode, 0), buffer.Length);
 Log.Trace(temp.ToHex());
 }
 received -= length + 4;
 Array.Copy(buffer, length + 4, buffer, 0, received);
 }
 Stream.BeginRead(buffer, 0, buffer.Length, BeginRead, Stream);
 }
 else
 {
 OnDisconnected(this);
 }
 }
 catch (IOException)
 {
 OnDisconnected(this);
 }
 catch (Exception ex)
 {
 OnDisconnected(this);
 
 Log.Error("Disconnect",ex);
 }
 }
 
 
 ![[Изображение: pW9PeEHaIqs.jpg]](https://pp.vk.me/c636228/v636228434/68e9/pW9PeEHaIqs.jpg) 
	
	
	
		
	Сообщений: 6,450 
	Тем: 262 
	Зарегистрирован: Nov 2007
	
 Репутация: 
44,165 
	
	
		Тебе виднее, я же не вижу, как себя ведёт клиент.Может после подключения он валится от какой-то ошибки.
 
	
	
	
		
	Сообщений: 538 
	Тем: 76 
	Зарегистрирован: Aug 2012
	
 Репутация: 
7 
	
	
		При попытке войти , клиент сразу отключает.
![[Изображение: BX3yBMagVbI.jpg]](https://pp.vk.me/c636817/v636817434/a2cf/BX3yBMagVbI.jpg)  
			ClientPacket 
public string ReadS(int length){
 string text = "";
 try
 {
 text = Encoding.Default.GetString(_buffer, _offset, length);
 int _length = text.IndexOf(char.MinValue);
 if (_length != -1)
 {
 text = text.Substring(0, _length);
 }
 _offset += length;
 }
 catch (Exception e)
 {
 Log.Error(e.ToString());
 }
 return text;
 }
 
 
			PROTOCOL_LOGIN_REQ 
public override void ReadImpl(){
 ReadB(100);
 PasswordLength = ReadC();
 Password = ReadS(PasswordLength);
 LoginLength = ReadC();
 Login = ReadS(LoginLength);
 }
 
 public override void RunImpl()
 {
 var manager = AccountManager.Instance;
 Client.Account = manager.GetAccount(Login);
 Client.SendPacket(new PROTOCOL_LOGIN_ACK(manager.IsValidAccount(Login, Password), Client.Account));
 }
 
 
			PROTOCOL_LOGIN_ACK 
            WriteB(new byte[15]);string id = account.Id.ToString();
 WriteC(0);
 WriteS(id, id.Length);
 WriteC(0);
 WriteC(account.Login.Length);
 WriteS(account.Login);
 WriteQ(account.Id);
 WriteD((int)state);
 
 
	
	
	
		
	Сообщений: 6,450 
	Тем: 262 
	Зарегистрирован: Nov 2007
	
 Репутация: 
44,165 
	
	
		Открой для себя BinaryReader и BinaryWriter и не нужно будет париться об офсетах. Код: int _length = text.IndexOf(char.MinValue);if (_length != -1)
 {
 text = text.Substring(0, _length);
 }
Это не длина, а индекс (IndexOf как бы намекает).
 
[SRC="csharp"]int index = text.IndexOf('\0');
 
if (index != -1) 
{ 
    text = text.Remove(index); 
} 
[/SRC]
 
P.S. Незачем новую тему создавать, ты же пару дней назад с таким же названием создал.
	 
	
	
	
		
	Сообщений: 538 
	Тем: 76 
	Зарегистрирован: Aug 2012
	
 Репутация: 
7 
	
	
		PROGRAMMATOR Написал:Открой для себя BinaryReader и BinaryWriter и не нужно будет париться об офсетах.
 
 Код: int _length = text.IndexOf(char.MinValue);if (_length != -1)
 {
 text = text.Substring(0, _length);
 }
Это не длина, а индекс (IndexOf как бы намекает).
 
 [SRC="csharp"]int index = text.IndexOf('\0');
 
 if (index != -1)
 {
 text = text.Remove(index);
 }
 [/SRC]
 
 
 P.S. Незачем новую тему создавать, ты же пару дней назад с таким же названием создал.
 
ты имеешь ввиду что-то типа такого?
 Код: private BinaryReader reader;private byte[] _buffer;
 private int _offset;
 public int Remaining { get { return (int)(_buffer - _offset); } }
 public int ReadInt()
 {
 if (Remaining < 4)
 throw new IndexOutOfRangeException();
 return reader.ReadInt32();
 }
 
	
	
	
		
	Сообщений: 6,450 
	Тем: 262 
	Зарегистрирован: Nov 2007
	
 Репутация: 
44,165 
	
	
		Типа такого:
 [SRC="csharp"]public class PacketReader
 {
 MemoryStream stream;
 BinaryReader reader;
 
 /// <summary>
 ///
 /// </summary>
 /// <param name="buffer"></param>
 public void Init(byte[] buffer)
 {
 stream = new MemoryStream(buffer);
 reader = new BinaryReader(stream);
 }
 
 /// <summary>
 ///
 /// </summary>
 /// <returns></returns>
 protected int ReadInt() => reader.ReadInt();
 
 /// ...
 }
 [/SRC]
 
	
	
	
		
	Сообщений: 538 
	Тем: 76 
	Зарегистрирован: Aug 2012
	
 Репутация: 
7 
	
	
		то есть вместо ReadD будет использоваться protected int ReadInt() => reader.ReadInt(); ?
	 |