Обрезается строка при передаче через сокет

Передаю длинную строку через сокет:

socket.Send(Encoding.UTF8.GetBytes(msg));

Но строка обрезается:

Прикольно - не доходят последние несколько байт :thinking:
Я подумал, что превышен размер пакета и переписал вот так:

        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;
        }

Как ни странно, но это работает. Но работает так же. То есть, последние байты не передаются :man_shrugging:
Кстати, оно по-разному обрезается. Иногда приходит вот так:

...
        "audioSampleRate": "48000",
        "audioChannels": 2,
        "loudnessDb": -5.25
      }

и всё :man_shrugging:
Попробовал передать строку покороче - нормально доходит :man_shrugging:

Бо ти блин скопипастил код и фиг забил на разобраться.
Сам логику включи.
Если строку передаеш то строку сиимволов и получиш.

Сам хоч читав що написано?

И? Вроде ж это и надо.

:clkolfool3:чилавек немнога многа выпил :rofl:

Короче, хлопцы, я тут перечитав шо накопипастил и пришёл к выводу шо це код работает, если загружать передаваемый текст из файла. Тогда нормально передаётся строка любой длинны.

            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);
            }
        private static string GenerateResponse(int errorCode, string msg, string body)
        {
            string t = $"HTTP/1.1 {errorCode} {msg}\r\n";
            if (!string.IsNullOrEmpty(body))
            {
                t += "Content-Type: application/json\r\n" +
                    "Access-Control-Allow-Origin: *\r\n" +
                    $"Content-Length: {body.Length}\r\n\r\n{body}";
            }
            return t;
        }

Но если получать строку другим способом и тогда передавать, то она обрезается. В данном случае не хватает трёх последних скобок (это примерно 12 байт - точно не считал). Причем, в промежуточном файле test.json всё нормально :man_shrugging:
Это что за прикол? :thinking:

Я тут ещё потыкался и оказалось, что проблема в заголовке

    $"Content-Length: {body.Length}\r\n\r\n{body}";

Это размер не в байтах, а в каких-то непонятных мне попугаях. Если его не передавать, то строка не обрезается.

Если текст из ASCII символов, то должно совпадать. А так да, юникод же. Надо сначала конвертировать в байты, а потом получать размер.

Блин, вот я тупак шакур :man_facepalming: Я же length от строки беру :man_facepalming:

А тут пишут, что в октетах каких-то :thinking: видимо октет это байт