Hello, I am trying to send a text of approximately 15 KB in fragmented pipeline, but it is not sent. It works in local mode and offline, but when I take it to the vps server, it is not sent.
But a small amount is sent
Do I need to make special settings in the vps server?
My vps properties
Window 10
Cpu 4
Ram 4
Worked an send 15 kb string in local mode
Ip 127.0.0.1
But not work and not send in vps
But a small amount is sent
Must be sent reliably
By default the fragmentation pipeline is limited to 4KB payloads. See this part of the documentation for an example of how to change this value. Note that you need to configure the new value on both the server and the client.
Why does it only send the first chunk? If I send a 15KB message, it should be split into four smaller chunks and then sent, but it only sends the first chunk.
Why does it work locally but not in the vps?
hi The problem is how to solve it
ArgumentException: FixedString4096Bytes: Truncation while copying “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”
Unity.Collections.FixedString4096Bytes.CheckCopyError (Unity.Collections.CopyError error, System.String source) (at Library/PackageCache/com.unity.collections@1.2.4/Unity.Collections/FixedString.gen.cs:6881)
Unity.Collections.FixedString4096Bytes…ctor (System.String source) (at Library/PackageCache/com.unity.collections@1.2.4/Unity.Collections/FixedString.gen.cs:6291)
Unity.Collections.FixedString4096Bytes.op_Implicit (System.String b) (at Library/PackageCache/com.unity.collections@1.2.4/Unity.Collections/FixedString.gen.cs:6807)
ServerCode.SendFragmentedDatatoClient (Netmsg_Min msg, Unity.Networking.Transport.NetworkConnection nc) (at Assets/Scripts/ServerCode.cs:2581)
Mongo.SendProfileComplate (System.String userID, Unity.Networking.Transport.NetworkConnection nc) (at Assets/Scripts/Mongo.cs:872)
ServerCode.userManager (Net_userinformation msg7, Unity.Networking.Transport.NetworkConnection nc) (at Assets/Scripts/ServerCode.cs:1808)
ServerCode.OnDataClient (System.String datastring, Unity.Networking.Transport.NetworkConnection nc) (at Assets/Scripts/ServerCode.cs:900)
ServerCode.Update () (at Assets/Scripts/ServerCode.cs:866)
As the name of the type indicates, FixedString4096Bytes
can only hold 4096 bytes of data. It appears that you’re trying to copy a string longer than that in there. And keep in mind that those 4096 bytes also include things like the length and a null terminator for the string, so it’s actually slightly less than 4096 ASCII characters that can fit in the type.
Please help me to solve it in another way. I can’t add blank character. The game is published and I don’t have access to the client.
You could try creating a NativeArray<byte>
of the length of your string, copying the string into that native array, and then writing the array to the data stream writer with WriteBytes
. Or more direct but less efficient, you could write the string to the data stream writer one character at a time with WriteByte
. Assuming you’ve configured the fragmentation pipeline to allow a payload of that size, that should work.
Thank you very much, it is solved. But one question, how do you know if the received data is a string or a byte array? new client send byte array old client send string
I made a mistake, it’s not solved, when the size should be higher than 4096, it won’t be sent, even when I converted it to bytes.
What is payload capacity, is it the capacity of each part or the total capacity of Array?
client
void Start()
{
InitializeClient();
}
void InitializeClient()
{
m_clientDrive = NetworkDriver.Create();
_fragmentedPipeline = m_clientDrive.CreatePipeline(typeof(FragmentationPipelineStage), typeof(ReliableSequencedPipelineStage));
m_Connection = default(NetworkConnection);
if (serverData.ConnectToVps)
{
serverEndPoint = NetworkEndPoint.Parse(serverData.server_VPS_IP, serverData.ServerPort);
}
else if (!serverData.ConnectToVps)
{
serverEndPoint = NetworkEndPoint.Parse(serverData.server_Local_IP, serverData.ServerPort);
}
m_clientToServerConnection = m_clientDrive.Connect(serverEndPoint);
}
void Update()
{
////////// menu manager
if (serverEndPoint.IsValid && m_clientToServerConnection.IsCreated == false)
{
m_clientToServerConnection = m_clientDrive.Connect(serverEndPoint);
}
DataStreamReader strm; // zarf nagah darande data karbar
NetworkEvent.Type cmd; // diss ,conect ,model conecting
while ((cmd = m_clientToServerConnection.PopEvent(m_clientDrive, out strm)) != NetworkEvent.Type.Empty)
{
if (cmd == NetworkEvent.Type.Connect)
{
print(“connnect”);
connectedtoserver = true;
setuserinformation();
}
else if (cmd == NetworkEvent.Type.Disconnect)
{
print(“clientdisconect”);
connectiontype = “reconect”;
connectedtoserver = false;
ConecctetComplet = false;
DissconnectFromServer();
m_Connection = default(NetworkConnection);
return;
}
else if (cmd == NetworkEvent.Type.Data)
{
NativeArray nab = new NativeArray(strm.ReadInt(), Allocator.Temp);
strm.ReadBytes(nab);
byte[ ] ba = new byte[0];
ba = nab.ToArray();
OnDataServer(ba);
}
}
}
/////////// server
void Start()
{
InitializeServer();
}
void InitializeServer()
{
m_serverDrive = NetworkDriver.Create();
_unreliblePipeline = m_serverDrive.CreatePipeline(typeof(ReliableSequencedPipelineStage));
_fragmentedPipeline = m_serverDrive.CreatePipeline(typeof(FragmentationPipelineStage), typeof(ReliableSequencedPipelineStage));
var addr = NetworkEndPoint.AnyIpv4;
addr.Port = serverData.ServerPort;
if (m_serverDrive.Bind(addr) != 0)
{
//////print(“filue bind”);
}
else
{
//////print(“server start”);
m_serverDrive.Listen();
}
m_connecsions = new NativeList(serverData.ccu, Allocator.Persistent);
}
void Update()
{
m_serverDrive.ScheduleUpdate().Complete();
while (true)
{
NetworkConnection com = m_serverDrive.Accept();
if (!com.IsCreated)
break;
m_connecsions.Add(com);
connecsionscID.Add(com);
}
for (int i = 0; i < m_connecsions.Length; i++)
{
DataStreamReader strm; // zarf nagah darande data karbar
NetworkEvent.Type cmd; // diss ,conect ,model conecting
while ((cmd = m_serverDrive.PopEventForConnection(m_connecsions*, out strm)) != NetworkEvent.Type.Empty)*
{
if (cmd == NetworkEvent.Type.Connect)
{
StartCoroutine(AiRoom());
}
else if (cmd == NetworkEvent.Type.Disconnect)
{
print(“diiiiiiiiiiisc”);
AfterDisConnection(connecsionscID*, 0);*
m_connecsions.RemoveAtSwapBack(i);
connecsionscID.RemoveAtSwapBack(i);
}
else if (cmd == NetworkEvent.Type.Data)
{
NativeArray nab = new NativeArray(strm.ReadInt(), Allocator.Temp);
strm.ReadBytes(nab);
byte[ ] ba = new byte[0];
ba = nab.ToArray();
OnDataClient(ba);
}
}
}
}
public void SendFragmentedDatatoClientList(byte[ ] bn, List UserList)
{
NativeArray nb = new NativeArray(bn, Allocator.Temp);
foreach (var item in UserList)
{
if (m_serverDrive.BeginSend(_fragmentedPipeline, ncShoter(item), out var senddata) == 0)
{
senddata.WriteInt(bn.Length);
senddata.WriteBytes(nb);
print("befor send " + bn.Length);
m_serverDrive.EndSend(senddata);
}
}
}
Where is the problem, why does it not send if the array size exceeds 4096?
I’m pretty sure I already answered this question before in one of your other threads. If you need to send more than 4096 bytes on a fragmented pipeline, you need to configure its maximum payload size accordingly. This is documented here.