Программирование игр, создание игрового движка, OpenGL, DirectX, физика, форум
GameDev.ru / Программирование / Форум / Ложится сервер

Ложится сервер

Поделиться
Car3manПостоялецwww6 дек. 20173:03#0
Есть сервак написан на c#, есть клиент написан на unity + c#
Все построено на сокетах tcp
И возникла небольшая проблема, если отправлять клиентом тестовый запрос (у меня его тип назван ping), серв его читает и отправляет ответ просто с типом реквеста и результатом допустим Ok = 0
Так вот если в структуру ответа отправлять только эти два поля, без кастомных с произвольным набором данных, то все окей, но если мы засунем в ответ инфу которая превышает 2k байт допустим, то на клиенте возникнет ошибка serializationexception unexpected binary element 0

Проверял по размеру отправляемых данных с сервера и принимаемых на клиенте оно одинаковое, десериализация у меня происходит вот так

public static T FromBytesJSON<T> (byte[] arrBytes) {
     return FromString<T>(FromBytes<string>(arrBytes));
}

public static T FromString<T> (string text) {
     return JsonConvert.DeserializeObject<T>(text , GetSettings());
}

public static T FromBytes<T> (byte[] arrBytes) {
     if (arrBytes == null || arrBytes.Length < 1)
     return default(T);

     BinaryFormatter binForm = new BinaryFormatter();
     T obj = (T)binForm.Deserialize(new MemoryStream(arrBytes));

     return obj;
}

Может ли проблема быть связана с тем что читаю я ответы и ивенты с сервера по такой схеме

1)буффер изначально равен 4 байт
2)читаю из потока информацию о количестве байт, которые мне нужно прочитать чтобы принять структуру DataInfo (она нужна чтобы узнать, что мне пришло ивент или респонс, а так же размер оного)
3)буфер равен полученному значению
4)получаю DataInfo
5)буфер равен значению DataInfo.Length, что равняется основной информации, которая передастся в следующий раз
6)буфер равен DataInfo.Length
7)получаю основную информацию разом

Правка: 6 дек. 2017 3:16

=A=L=X=Постоялецwww6 дек. 20173:49#1
Car3man
> получаю основную информацию разом

Я не знаю как именно дела обстоят в той либе на шарпе что ты пишешь, но программирование на сокетах TCP/IP всегда подразумевает, что передаваемые данные могут быть (а при большом размере передаваемых данных должны быть) произвольно подроблены сетевой инфраструктурой на удобные ей блоки. Таким образом гарантируется только правильный порядок поступления таковых в программу, но не размер этих блоков. Даже если ты отправил 10 раз по 100 байт из клиента на сервер может прийти 20 раз по 50 байт или 5 раз по 200 байт, а так же любые другие комбинации.

Car3manПостоялецwww7 дек. 20177:03#2
=A=L=X=
Да проблема была в том что инфа дробилась на несколько частей, а у меня в коде чтение основной информации происходит за раз, и при дроблении я читал не весь поток, спасибо!

Код который я теперь использую для чтения потока

private byte[] ReadStream (NetworkStream stream,int countBytesNeedReed) {
    int readSoFar = 0;

    byte[] msg = new byte[countBytesNeedReed];

    while (readSoFar < countBytesNeedReed) {
      var read = stream.Read(msg,readSoFar,msg.Length - readSoFar);
      readSoFar += read;
      if (read == 0)
        break;
    }

    return msg;
  }

Правка: 7 дек. 2017 7:04

/ Форум / Программирование игр / Сеть

2001—2017 © GameDev.ru — Разработка игр