Torbins написав:Протокол TCP не гарантує, що дані не склеяться, або не надійдуть шматками. Ваша програма має це враховувати. Тому, перед передачею даних чергового класу, треба передавати їх розмір.
шматками - це як? типу я пишу
byte[] buff = new byte[20];
socket.Send(buff);
і на сервер приходить спочатку 5, а потім 15 байт, наприклад?
ось метод відправки даних
private static void Send_1(ClientData data)
{
try
{
MemoryStream memoryStream = new MemoryStream();
Serializer.Serialize(memoryStream, data);
client.bufferSend = new byte[memoryStream.ToArray().Length+2];
BitConverter.GetBytes((ushort)client.bufferSend.Length-2).CopyTo(client.bufferSend,0);
memoryStream.ToArray().CopyTo(client.bufferSend,2);
client.socket.BeginSend(client.bufferSend, 0, client.bufferSend.Length, SocketFlags.None, //отправка данных
new AsyncCallback(SendCallback), client);
Debug.Log("sent: " + client.bufferSend.Length + " bytes");
}
catch (Exception e)
{
Debug.LogWarning(e.Message);
}
}
а ось їхнє прийняття, працює файно, і помилок ніяких поки що немає
private void ReceiveCallback(IAsyncResult result)
{
try
{
Client client = (Client) result.AsyncState;
int nBytes = client.socket.EndReceive(result);
SystemMessage("Received: " + nBytes + " bytes");
if (nBytes > 0)
{
lock (clients)
{
int fullLength = 0, dataLength = 0;
int startIndex = 0;
do
{
dataLength = BitConverter.ToUInt16(client.bufferReceive, startIndex);
byte[] arr = new byte[dataLength];
Buffer.BlockCopy(client.bufferReceive, fullLength+2, arr, 0, dataLength);
ClientData command = Serializer.Deserialize<ClientData>(new MemoryStream(arr));
ServerData result1 = new SuperExecutor(clients, client, timer).Executor(command);
switch (result1.SendingMode())
{
case SelectSending.SendToSelf:
SendToSelf(client, result1);
break;
case SelectSending.SendToOthers:
SendToOthers(client, result1);
break;
case SelectSending.SendToClient:
SendToClient(result1);
break;
case SelectSending.NoSend:
break;
}
fullLength += dataLength + 2;
startIndex += fullLength;
} while (fullLength < nBytes);
}
}
if (nBytes == 0)
{
client.socket.Close();
lock (clients)
{
clients.Remove(client);
SystemMessage("Client has been removed");
}
}
if(clients.Contains(client))
client.socket.BeginReceive(client.bufferReceive, 0, client.bufferReceive.Length, SocketFlags.None,
new AsyncCallback(ReceiveCallback), client);
}
catch (SocketException e)
{
SystemMessage(e.Message + " ErrorCode: " + e.ErrorCode.ToString());
}
catch (Exception e)
{
SystemMessage(e.Message+" | ReceiveCallback");
}
}
Є якісь суперзауваження або негативні емоції?