89 lines
3.6 KiB
C#
89 lines
3.6 KiB
C#
namespace DTLib.Network;
|
|
|
|
//
|
|
// отправка/получение пакетов
|
|
//
|
|
public static class Package
|
|
{
|
|
// принимает пакет
|
|
public static byte[] GetPackage(this Socket socket)
|
|
{
|
|
int ppackageLength = 0;
|
|
// цикл выполняется пока не пройдёт 2000 мс
|
|
for (ushort s = 0; s < 400; s += 1)
|
|
{
|
|
if (ppackageLength == 0 && socket.Available >= 4)
|
|
{
|
|
byte[] ppackageLengthBytes = new byte[4];
|
|
socket.Receive(ppackageLengthBytes);
|
|
ppackageLength = BitConverter.ToInt32(ppackageLengthBytes, 0);
|
|
}
|
|
else if (ppackageLength != 0 && socket.Available >= ppackageLength)
|
|
{
|
|
var data = new byte[ppackageLength];
|
|
socket.Receive(data);
|
|
return data;
|
|
}
|
|
else Thread.Sleep(5);
|
|
}
|
|
throw new Exception($"GetPackage() error: timeout. socket.Available={socket.Available}");
|
|
}
|
|
public static void GetPackage(this Socket socket, byte[] buffer)
|
|
{
|
|
int packageLength = 0;
|
|
// цикл выполняется пока не пройдёт 2000 мс
|
|
for (ushort s = 0; s < 400; s += 1)
|
|
{
|
|
if (packageLength == 0 && socket.Available >= 4)
|
|
{
|
|
byte[] ppackageLengthBytes = new byte[4];
|
|
socket.Receive(ppackageLengthBytes);
|
|
packageLength = BitConverter.ToInt32(ppackageLengthBytes, 0);
|
|
}
|
|
else if (packageLength != 0 && socket.Available >= packageLength)
|
|
{
|
|
if (buffer.Length < packageLength)
|
|
throw new Exception("buffer length is less than package length");
|
|
socket.Receive(buffer);
|
|
}
|
|
else Thread.Sleep(5);
|
|
}
|
|
throw new Exception($"GetPackage() error: timeout. socket.Available={socket.Available}");
|
|
}
|
|
|
|
// отправляет пакет
|
|
public static void SendPackage(this Socket socket, byte[] data) => SendPackage(socket, data, data.Length);
|
|
public static void SendPackage(this Socket socket, byte[] buffer, int dataLength)
|
|
{
|
|
if (buffer.Length < dataLength)
|
|
throw new Exception($"SendPackage() error: buffer is too small ({buffer.Length} bytes of {dataLength})");
|
|
if (dataLength < 1)
|
|
throw new Exception($"SendPackage() error: package has zero size");
|
|
|
|
byte[] ppackageLength = BitConverter.GetBytes(buffer.Length);
|
|
if (ppackageLength.Length != 4)
|
|
throw new Exception("wrong with int to byte[] conversion");
|
|
socket.Send(ppackageLength);
|
|
socket.Send(buffer, 0, dataLength, SocketFlags.None);
|
|
}
|
|
|
|
public static void SendPackage(this Socket socket, string data)
|
|
=> SendPackage(socket, data.ToBytes());
|
|
|
|
// получает пакет и выбрасывает исключение, если пакет не соответствует образцу
|
|
public static void GetAnswer(this Socket socket, string answer)
|
|
{
|
|
string rec = socket.GetPackage().BytesToString();
|
|
if (rec != answer)
|
|
throw new Exception($"GetAnswer() error: invalid answer: <{rec}>");
|
|
}
|
|
|
|
public static byte[] RequestPackage(this Socket socket, byte[] request)
|
|
{
|
|
socket.SendPackage(request);
|
|
return socket.GetPackage();
|
|
}
|
|
public static byte[] RequestPackage(this Socket socket, string request)
|
|
=> socket.RequestPackage(request.ToBytes());
|
|
}
|