Прикольно - не доходят последние несколько байт
Я подумал, что превышен размер пакета и переписал вот так:
public static void SendMessage(Socket socket, string msg)
{
byte[] msgBytes = Encoding.UTF8.GetBytes(msg);
int pos = 0;
do
{
byte[] readBuf = ReadBuf(msgBytes, pos, 4096);
if (readBuf == null || readBuf.Length == 0)
{
break;
}
socket.Send(readBuf);
pos += readBuf.Length;
} while (true);
}
private static byte[] ReadBuf(byte[] buffer, int pos, int count)
{
int remaining = buffer.Length - pos;
if (remaining == 0)
{
return null;
}
int size = count >= remaining ? remaining : count;
byte[] buf = new byte[size];
for (int i = 0; i < size; i++)
{
buf[i] = buffer[pos + i];
}
return buf;
}
Как ни странно, но это работает. Но работает так же. То есть, последние байты не передаются
Кстати, оно по-разному обрезается. Иногда приходит вот так:
Короче, хлопцы, я тут перечитав шо накопипастил и пришёл к выводу шо це код работает, если загружать передаваемый текст из файла. Тогда нормально передаётся строка любой длинны.
while (true)
{
Socket client = null;
try
{
client = server.Accept();
Console.WriteLine($"{client.RemoteEndPoint} connected");
byte[] buffer = new byte[1024];
int bytesRead = client.Receive(buffer, 0, buffer.Length, SocketFlags.None);
if (bytesRead == 0)
{
Console.WriteLine($"Zero bytes received from {client.RemoteEndPoint}");
DisconnectClient(client);
continue;
}
string msg = Encoding.UTF8.GetString(buffer, 0, bytesRead);
Console.WriteLine($"{client.RemoteEndPoint} sent: {msg}");
string[] strings = msg.Split('\n');
string[] req = strings[0].Split(' ');
if (req[0] == "GET")
{
if (req[1].StartsWith("/video/"))
{
string fn = "info.json";
string body;
if (File.Exists(fn))
{
body = File.ReadAllText(fn);
}
else
{
YouTubeApi api = new YouTubeApi();
YouTubeVideo video = api.GetVideo(new VideoId("7szcXCT-Oqw"));
body = video?.RawInfo.RawData.ToString();
string fn2 = "test.json";
if (File.Exists(fn2))
{
File.Delete(fn2);
}
File.WriteAllText(fn2, body);
body = null;
body = File.ReadAllText(fn2);
}
string answer = GenerateResponse(200, "OK", body);
SendMessage(client, answer);
}
else
{
SendMessage(client, GenerateResponse(400, "Bad request", null));
}
}
else
{
SendMessage(client, GenerateResponse(400, "Unsupported method", null));
}
}
catch (Exception ex)
{
System.Diagnostics.Debug.WriteLine(ex.Message);
}
DisconnectClient(client);
}
Но если получать строку другим способом и тогда передавать, то она обрезается. В данном случае не хватает трёх последних скобок (это примерно 12 байт - точно не считал). Причем, в промежуточном файле test.json всё нормально
Это что за прикол?