LLAPI how to get sended bytes size

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 :

public void sendToClient(NMSG msg, int channelId, int connectionId)
    {

        if (!PacketHandler.packets.Contains(msg.GetType()))
        {
            Debug.Log("packet not registered");
            return;
        }

        byte error;
        byte[] buffer;


        MemoryStream stream = new MemoryStream();
        BinaryWriter writer = new BinaryWriter(stream);
        writer.Write(msg.getPacketId());
        writer.Write(msg.getUUID());
        msg.WriteToStream(writer);

        if(msg.isPacketWithResult)
        {
            PacketHandler.packetsWithResult.Add(msg.getUUID(),msg);
        }

        //Debug.Log(stream.Position + " bytes sended.");
        buffer = stream.ToArray();
        int bufferSize = buffer.Length;

        NetworkTransport.Send(hostId, connectionId, channelId, buffer, bufferSize, out error);
    }

I want to obtain sended packet size in server side :

 void Update()
    {
        if (!isConnected) return;

        int recHostId;
        int connectionId;
        int channelId;
        int dataSize;
        byte[] recBuffer = new byte[//sended packet size];
        int bufferSize = recBuffer.Length;
        byte error;

        NetworkEventType recData;
        do
        {
            recData = NetworkTransport.Receive(out recHostId, out connectionId, out channelId, recBuffer, bufferSize, out dataSize, out error);
            recBuffer = new byte[dataSize];
            bufferSize = dataSize;
            switch (recData)
            {
                case NetworkEventType.Nothing:
                    break;
                case NetworkEventType.ConnectEvent:
                    this.connectionId = connectionId;
                    LocalUserData localData = Main.instance.localData;

                    if (localData.haveSession())
                    {
                        Client client = getClient();
                        client.sendToServer(new NMSG_ConnectAccount(2, localData.getUserId()), client.reliableChannel);
                    }
                    Debug.Log("Connection to server etablished!");
                    break;

                case NetworkEventType.DisconnectEvent:
                    Debug.Log("Disconnected from server!");
                    break;

                case NetworkEventType.DataEvent:
                    StartCoroutine(msgReader(recBuffer)); 
                    break;
            }
        }
        while (recData != NetworkEventType.Nothing);
     
    }

because I switch from reliable channel to reliable fragmented channel
according to the size of bytes sent.

I need your help.

Thanks.

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

Ok but I want to declare the byte array “recbuffer” according to the datasize
it’s possible ?

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…

Thanks I fixed my problem !

1 Like