@Meezmo
Python, C# programmer

Почему некорректно получаются данные по сокету?

Делаю программу для трансляции экрана, но столкнулся с проблемой, что фото или размер фото не получаються корректно. Если это рассинхрон, тогда как его убрать?
Код сервера:
private void StreamScreen()
        {
            Socket listener = new(IpAddress.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
            listener.Bind(streamScreenEndPoint);
            listener.Listen(10);
            while (true)
            {
                Socket handler = listener.Accept();
                Console.WriteLine("Connected");
                while (handler.Connected)
                {
                    try
                    {
                        byte[] buffer = Screenshot.MakeScreenshot();
                        handler.Send(Encoding.ASCII.GetBytes(buffer.Length.ToString()));
                        handler.Send(buffer, buffer.Length, SocketFlags.None);
                    }
                    catch (SocketException)
                    {
                        handler.Shutdown(SocketShutdown.Both);
                        Console.WriteLine("Connection aborted");
                    }
                    catch (Exception e)
                    {
                        Console.WriteLine($"ERROR: {e}");
                        byte[] msg = Encoding.UTF8.GetBytes("ERROR");
                        handler.Send(msg);
                    }
                }
                handler.Close();
            }
        }

Код клиента:
static void Main()
        {
            IPAddress ipAddress = Dns.GetHostEntry("localhost").AddressList[1];
            IPEndPoint endpoint = new IPEndPoint(ipAddress, 50006);
            Socket socketSender = new Socket(ipAddress.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
            socketSender.Connect(endpoint);
            for (int i = 0; i <= 500; i++)
            {
                byte[] size = new byte[1024];
                int received = socketSender.Receive(size);
                ulong screenshotSize = ulong.Parse(Encoding.UTF8.GetString(size));
                byte[] screenshot = new byte[screenshotSize];
                received = socketSender.Receive(screenshot);
                File.WriteAllBytes($"D:\\file.jpeg", screenshot);
            }
        }

Для теста просто записывает в файл, в приложении на WPF эта проблема тоже появляеться.
  • Вопрос задан
  • 53 просмотра
Решения вопроса 1
@rPman
кто тебе надоумил отсылать в сокет СТРОЧНОЕ представление размера?
Encoding.ASCII.GetBytes(buffer.Length.ToString())
ulong.Parse(Encoding.UTF8.GetString(size))а потом пытаться его отпарсить из UTF8! строки длиной 1024 байта, что там у тебя после твоих циферок будет лежать, одному богу известно, будет похоже на число - приплюсуется к размеру

отправлять надо фиксированное колчичество байт (даже считать не надо, отправляешь int размером sizeof(int) и столько же читаешь прямо в int
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы