Задать вопрос

Как развернуть tcp сервер и оптимизировать?

Нароооод, всем добрейшего денька) У меня встала проблема, а точнее у меня не принимаются пакеты с сервера, если он не на localhost. Суть ошибки в том, что клиент не может подключиться к серверу с IPv4:... Я тут сижу недоумеваю, так ещё и во время отладки заметил, что сервер потребляет от ГБ и больше ОЗУ! (Мне кажется, что дело здесь в буфере, но я его очищал и ничего).
p.s. Создаю прогу для захвата экрана юзера с использованием Window Duplicate и костылей, ниже приведу код сервера/клиента (будет работать только, если ip=127.0.0.1). Заранее спасибо тем, кто решит в этом покопаться) И да, firewall вырублен
p.s. без niggaтива, пожалуйста. Я знаю, что дурень :)

Код сервера

using System;
using System.Net.Sockets;
using System.Net;
using System.Windows;
using System.Threading.Tasks;
using System.Windows.Threading;
using System.Collections.Generic;
using System.Text.RegularExpressions;

namespace TheTomas
{
    class DataSender
    {
        public static TcpListener SERV;

        const int PORT = 19152;

        public static void Start()
        {
            DispatcherTimer waitForSend = new DispatcherTimer();
            waitForSend.Start();
            waitForSend.Interval = TimeSpan.FromMilliseconds(60);
            waitForSend.Tick += new EventHandler(async (object s, EventArgs e) => {
                byte[] data = CaptureScreen.GetFrame();
                bool isSend = await _sendScreen(data);

                if (!isSend) Console.WriteLine("BULLSHIT!");
            });
        }

        private static async Task<bool> _sendScreen(byte[] imgData)
        {
            try
            {
                if (SERV is null)
                {
                    IPEndPoint ipEndPoint = new IPEndPoint(IPAddress.Any, PORT); // Ставлю тут, чтобы принимало все ip-шники и не работает, даже если так же буду к 127.0.0.1 коннектиться

                    // Init network
                    SERV = new TcpListener(ipEndPoint);
                }

                // Start server
                SERV.Start();

                // Send client
                TcpClient client = await SERV.AcceptTcpClientAsync().ConfigureAwait(false);
                if (client != null)
                {
                    int result = await client.Client.SendAsync(imgData, SocketFlags.Truncated);

                    if (result > 0)
                    {
                        client.Dispose();
                        client.Close();
                        SERV.Stop();

                        GC.Collect();
                    }
                } else
                {
                    client.Close();
                    SERV.Stop();

                    GC.Collect();
                }

                return client != null;
            }
            catch (Exception e)
            {
                MessageBox.Show($"Some error accure {e.Message}");
                return false;
            }
        }

        private static string _getIP()
        {
            WebClient wc = new WebClient();
            string strIP = wc.DownloadString("http://checkip.dyndns.org");
            strIP = (new Regex(@"\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b")).Match(strIP).Value;
            wc.Dispose();
            return strIP;
        }
    }
}



Код клиента

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO;
using System.Net.Sockets;
using System.Net;
using System.Runtime.InteropServices;

namespace GayAppClient
{
    public partial class Client : Form
    {
        const uint SRCCOPY = 0x00CC0020;
        const int PORT = 19152;
        public static string IP = "127.0.0.1";

        public Client()
        {
            InitializeComponent();
        }

        private void demoPause_Tick(object sender, EventArgs e)
        {
            try
            {
                _getIP(); // - Получаем IP сервера(моего роутера т.е)

                TcpClient tcp = new TcpClient(IP, PORT); // IP тут 127.0.0.1; когда пишу ipv4 роутера, к которому подключен ПК(сервер) - ошибка

                NetworkStream stream = tcp.GetStream();

                captureView.Image = Image.FromStream(stream);
                captureView.SizeMode = PictureBoxSizeMode.StretchImage;

                GC.Collect();
            } catch (Exception ex)
            {
                demoPause.Stop();

                DialogResult ans = MessageBox.Show(ex.Message);
                if (ans == DialogResult.OK)
                {
                    Application.Exit();
                }
            }
        }

        private static void _getIP()
        {
            WebClient wc = new WebClient();
            string strIP = wc.DownloadString("http://checkip.dyndns.org");
            strIP = (new Regex(@"\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b")).Match(strIP).Value;
            wc.Dispose();
            IP = strIP;
        }
    }
}

  • Вопрос задан
  • 343 просмотра
Подписаться 2 Простой Комментировать
Пригласить эксперта
Ответы на вопрос 1
@temnij52
Хм.
Мне кажется, сервер для GayApp нужно запускать не на паблик ip, а на 0.0.0.0 или IpAddres.Any. По крайней мере, у меня так работает.
И ещё, по-моему, перед захватом экрана, если тебе не нужна консоль, можно делать так:
const int SW_HIDE = 0;
        const int SW_SHOW = 5;
        const int SW_Min = 2;
        const int SW_Max = 3;
        const int SW_Norm = 4;
 
        [DllImport("kernel32.dll")]
        static extern IntPtr GetConsoleWindow();
 
        [DllImport("user32.dll")]
        static extern bool ShowWindow(IntPtr hWnd, int nCmdShow); 
 
        [STAThread]
        static void Main(string[] args)
        {
            var handle = GetConsoleWindow();
 
            // спрятать консоль
            ShowWindow(handle, SW_HIDE);
            // скриншот
            // показать консоль 
            ShowWindow(handle, SW_SHOW);
 
            Console.WriteLine("Press enter...");
            Console.Read();
        }
Ответ написан
Ваш ответ на вопрос

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

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