Search Unity

LLAPI how to get sended bytes size

Discussion in 'Multiplayer' started by karmaowner13, Oct 17, 2019.

  1. karmaowner13

    karmaowner13

    Joined:
    Aug 8, 2019
    Posts:
    6
    Hello everyone , firstly sorry for my bad english I have a little questions how to get sended bytes size in client side if bytes is sended from server side ? example :

    I send from server some packet thanks to this function :

    Code (CSharp):
    1. public void sendToClient(NMSG msg, int channelId, int connectionId)
    2.     {
    3.  
    4.         if (!PacketHandler.packets.Contains(msg.GetType()))
    5.         {
    6.             Debug.Log("packet not registered");
    7.             return;
    8.         }
    9.  
    10.         byte error;
    11.         byte[] buffer;
    12.  
    13.  
    14.         MemoryStream stream = new MemoryStream();
    15.         BinaryWriter writer = new BinaryWriter(stream);
    16.         writer.Write(msg.getPacketId());
    17.         writer.Write(msg.getUUID());
    18.         msg.WriteToStream(writer);
    19.  
    20.         if(msg.isPacketWithResult)
    21.         {
    22.             PacketHandler.packetsWithResult.Add(msg.getUUID(),msg);
    23.         }
    24.  
    25.         //Debug.Log(stream.Position + " bytes sended.");
    26.         buffer = stream.ToArray();
    27.         int bufferSize = buffer.Length;
    28.  
    29.         NetworkTransport.Send(hostId, connectionId, channelId, buffer, bufferSize, out error);
    30.     }
    I want to obtain sended packet size in server side :

    Code (CSharp):
    1.  void Update()
    2.     {
    3.         if (!isConnected) return;
    4.  
    5.         int recHostId;
    6.         int connectionId;
    7.         int channelId;
    8.         int dataSize;
    9.         byte[] recBuffer = new byte[//sended packet size];
    10.         int bufferSize = recBuffer.Length;
    11.         byte error;
    12.  
    13.         NetworkEventType recData;
    14.         do
    15.         {
    16.             recData = NetworkTransport.Receive(out recHostId, out connectionId, out channelId, recBuffer, bufferSize, out dataSize, out error);
    17.             recBuffer = new byte[dataSize];
    18.             bufferSize = dataSize;
    19.             switch (recData)
    20.             {
    21.                 case NetworkEventType.Nothing:
    22.                     break;
    23.                 case NetworkEventType.ConnectEvent:
    24.                     this.connectionId = connectionId;
    25.                     LocalUserData localData = Main.instance.localData;
    26.  
    27.                     if (localData.haveSession())
    28.                     {
    29.                         Client client = getClient();
    30.                         client.sendToServer(new NMSG_ConnectAccount(2, localData.getUserId()), client.reliableChannel);
    31.                     }
    32.                     Debug.Log("Connection to server etablished!");
    33.                     break;
    34.  
    35.                 case NetworkEventType.DisconnectEvent:
    36.                     Debug.Log("Disconnected from server!");
    37.                     break;
    38.  
    39.                 case NetworkEventType.DataEvent:
    40.                     StartCoroutine(msgReader(recBuffer));
    41.                     break;
    42.             }
    43.         }
    44.         while (recData != NetworkEventType.Nothing);
    45.      
    46.     }
    because I switch from reliable channel to reliable fragmented channel
    according to the size of bytes sent.

    I need your help.

    Thanks.
     
  2. aabramychev_

    aabramychev_

    Joined:
    May 10, 2019
    Posts:
    16
    NetworkTransport.Receive(out recHostId, out connectionId, out channelId, recBuffer, bufferSize, out dataSize, out error);
    dataSize - how many Fata you have received
    recBuffer - will contain data
    error will return ToLong error if bufferSize < dataSize
     
  3. karmaowner13

    karmaowner13

    Joined:
    Aug 8, 2019
    Posts:
    6
    Ok but I want to declare the byte array "recbuffer" according to the datasize
    it's possible ?
     
  4. aabramychev_

    aabramychev_

    Joined:
    May 10, 2019
    Posts:
    16
    No.
    The schedule is
    check error if error == DataTooLong dataSize will return the buffer size and you should present another buffer
    event = Recv(...dataSize, error);
    if error == TooLong //-> buffer too small
    buffer = new bytes[dataSize] //->allocate new buffer
    Recv( buffer, dataSize, ...); //->call again and grab the long data
    Data won't be dropped, the library will keep them before you will provide buffer long enough...

    Or provide the buffer which is big enough...
     
  5. karmaowner13

    karmaowner13

    Joined:
    Aug 8, 2019
    Posts:
    6
    Thanks I fixed my problem !
     
    aabramychev_ likes this.