C# Threading с сокетами

Это еще одна проблема с сокетами.

Я делаю ботов для игры на C#, пока я могу заставить их подключаться и все в этом роде, но это просто подключение нескольких учетных записей одновременно к одному сокету. Я подумал, что могу сделать это, распределяя функцию, которая включает функцию socket.connect (), а затем отправляет пакеты на серверы. Я даже просмотрел предыдущий скрипт на Python, и он в основном делал то же самое.

Вот пример кода Python:

if bots["loaded"] < b0ts:

                    bots["accounts"][acc[0]] = acc[1].replace("\n", "")

                    bot_thread = threading.Thread(target=self.verify_bot, args=(acc[0],))

                    bot_thread.start()

По сути, я собирался попытаться преобразовать это в C#, полагая, что это сработает. Но с другой стороны, практически все функции могут отличаться практически на каждом языке программирования.

Вот код, который у меня есть на C# для части потоковой передачи, я по какой-то причине использовал фонового рабочего, но я также не думал, что это может быть причиной того, что он не работает, так почему бы и нет.

Thread t;                                                             
    private void backgroundWorker2_DoWork(object sender, DoWorkEventArgs e)
    {
        for(int i = 0; i <= acc.Items.Count - 1; i++)
        {
            if (backgroundWorker2.CancellationPending == true)
            {
                e.Cancel = true;
                break;
            }
            else
            {
                t = new Thread(() => verify_bots(acc.Items[i].ToString().Split(':')[0], acc.Items[i].ToString().Split(':')[1]));
                t.Start();
            }
        }
    }

Между прочим, разбиения предназначены для имен пользователей и паролей, на случай, если кто-то запутался с этим. В любом случае, при всем том, что только 1 бот все еще подключается, я получаю сообщение об ошибке из сокета либо потому, что он уже был подключен ранее одним подключением, либо что-то в этом роде, я думаю, или что-то еще.

Вот где моя проблема, потому что он отлично работает на python, и обычно вещи, которые я пытаюсь преобразовать в C#, работают. Вот функция verify_bots, чтобы кому-то было проще в ней разобраться.

private void verify_bots(string username, string password)
    {
        CheckForIllegalCrossThreadCalls = false;

        string login_data = string.Format("userID = {0}&password = {1}", username, password);
        ASCIIEncoding encoding = new ASCIIEncoding();
        byte[] data = encoding.GetBytes(login_data);

        HttpWebRequest request;

        request = (HttpWebRequest)WebRequest.Create("https://www.binweevils.com/login");

        getTick(request); // getting cookies

        request.Method = "POST";
        request.KeepAlive = true;
        request.UserAgent = "1337JjsHd";
        request.CookieContainer = logincookie;
        request.ContentType = "application/x-www-form-urlencoded";
        request.ContentLength = data.Length;

        Stream stream;

        stream = request.GetRequestStream();
        stream.Write(data, 0, data.Length);
        stream.Close();

        HttpWebResponse response;

        response = request.GetResponse() as HttpWebResponse;

        StreamReader responsereader;

        responsereader = new StreamReader(response.GetResponseStream());

        string final = responsereader.ReadToEnd();

        if (final.Contains("register.php"))
        {
            console.Text = console.Text + username+" Failed!\n";
        }
        else
        {
            string post = "";
            ASCIIEncoding encoding1 = new ASCIIEncoding();
            byte[] data1 = encoding1.GetBytes(post);

            request = (HttpWebRequest)WebRequest.Create("https://lb.binweevils.com/php2/weevil/get-login-details.php");
            request.Method = "POST";
            request.KeepAlive = true;
            request.UserAgent = "1337JjsHd";
            request.CookieContainer = logincookie;
            request.ContentType = "application/x-www-form-urlencoded";
            request.ContentLength = data1.Length;

            stream = request.GetRequestStream();
            stream.Write(data1, 0, data1.Length);
            stream.Close();

            response = request.GetResponse() as HttpWebResponse;

            responsereader = new StreamReader(response.GetResponseStream());

            final = responsereader.ReadToEnd();

            try
            {
                string[] a = new string[] { "loginKey = " };
                var aa = final.Split(a, StringSplitOptions.None);
                logkey = aa[1].ToString();
                gethash(@"C:\Python27\hash.py", logkey);
            }
            catch(Exception)
            {
                console.Text = console.Text + "Failed to get loginkey.\n";
            }

            sock.Connect(ip, port);

            byte[] recv = new byte[2048];

            sendRawPackets(sock, "<policy-file-request/>");
            sock.Receive(recv);
            sendRawPackets(sock, "<msg t='sys'><body action='verChk' r='0'><ver v='154' /></body></msg>");
            sock.Receive(recv);
            if (ip.Contains("sfs1"))
            {
                sendRawPackets(sock, "<msg t='sys'><body action='login' r='0'><login z='Grime'><nick><![CDATA[" + username + "]]></nick><pword><![CDATA["+logkey+"]]></pword></login></body></msg>");
            }
            else
            {
                sendRawPackets(sock, "<msg t='sys'><body action='login' r='0'><login z='Slime'><nick><![CDATA[" + username + "]]></nick><pword><![CDATA[" + logkey + "]]></pword></login></body></msg>");
            }
            sock.Receive(recv);

            sendRawPackets(sock, "%xt%login%1#2%-2");
            sock.Receive(recv);
            sendRawPackets(sock, "%xt%login%2#6%-1%");
            sock.Receive(recv);
            sendRawPackets(sock, "%xt%login%2#7%17610%69%0,-255,190%");
            sock.Receive(recv);
            sendRawPackets(sock, "%xt%login%2#4%3150%FlumsFountain%52.9941101744771%0%989.1726320236921%-180%0%190%");
            sock.Receive(recv);

            string[] move = { "%xt%login%2#1%23%-62%892%66%", "%xt%login%2#1%23%-28%1102%146%", "%xt%login%2#1%23%133%924%-48%", "%xt%login%2#1%23%-39%882%57%", "%xt%login%2#1%23%-39%882%57%", "%xt%login%12#2%23%", "%xt%login%12#2%23%", "%xt%login%2#1%23%54%1002%137%", "%xt%login%2#1%23%-28%934%84%", "%xt%login%2#1%23%144%994%-126%", "%xt%login%2#1%23%84%1118%-177%", "%xt%login%2#1%23%-85%1032%110%", "%xt%login%2#1%23%-34%941%70%", "%xt%login%2#1%23%20%876%17%", "%xt%login%2#1%23%76%951%-79%", "%xt%login%2#1%23%92%999%-133%", "%xt%login%2#1%23%-52%1108%142%", "%xt%login%2#1%23%-92%1045%116%", "%xt%login%2#1%23%19%893%13%", "%xt%login%2#1%23%-84%914%64%", "%xt%login%2#1%23%-19%859%23%", "%xt%login%2#1%23%136%1061%-139%", "%xt%login%2#1%23%91%966%-117%", "%xt%login%2#1%23%63%1086%-156%", "%xt%login%2#1%23%120%1060%-139%", "%xt%login%2#1%23%110%938%-107%", "%xt%login%2#1%23%-84%872%69%", "%xt%login%2#1%23%-117%1045%141%", "%xt%login%2#1%23%-36%961%151%", "%xt%login%2#1%23%72%920%-97%", "%xt%login%2#1%23%117%894%-82%", "%xt%login%2#1%23%32%865%-29%", "%xt%login%2#1%23%-45%889%80%", "%xt%login%2#1%23%-122%1068%141%", "%xt%login%2#1%23%15%1093%-178%", "%xt%login%2#1%23%72%1098%-161%", "%xt%login%2#1%23%83%994%-135%" };

            while(true)
            {
                sendRawPackets(sock, move[new Random().Next(0, move.Length)]); // making bot move around in area
                sock.Receive(recv);
                Thread.Sleep(5000);
            }

        }
    }

Где ты хоть розетку закрываешь? Как вы ожидаете, что один и тот же сокет будет использоваться всеми этими потоками, которые вы создаете? И, кстати, прочтите инструкции using, рекомендации HttpClient и StackOverflow по размещению минимального фрагмента кода, иллюстрирующего проблему. Ни один код веб-запроса не имеет отношения к вашему вопросу.

Ian Mercer 06.05.2018 09:59

Хорошо, я сделаю это, но также, чтобы ответить на главный вопрос, я сказал, что просматриваю прошлый скрипт Python и в основном делаю то, что в нем. Дерьмо с веб-запросами должно было использоваться для проверки правильности паролей учетных записей, а затем для хеширования предоставленного ключа, а затем для отправки пакетов на игровые серверы, чтобы фактически подключить их к игре.

HD. 06.05.2018 14:39
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
2
99
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Для раскрутки потока требуется значительное время, поэтому к тому времени, когда он завершится, ваш цикл for будет завершен, а i == acc.Items.Count - 1 будет завершен. Это означает, что каждый поток использует acc.Items[acc.Items.Count - 1] и, таким образом, «подключает несколько учетных записей одновременно к одному сокету».

Вот простое исправление:

    for(int i = 0; i <= acc.Items.Count - 1; i++)
    {
        if (backgroundWorker2.CancellationPending == true)
        {
            e.Cancel = true;
            break;
        }
        else
        {
            int a_copy_of_i = i;
            t = new Thread(() => verify_bots(acc.Items[a_copy_of_i].ToString().Split(':')[0], acc.Items[a_copy_of_i].ToString().Split(':')[1]));
            t.Start();
        }
    }

к сожалению, это ничего не решило с сокетом, я все еще получаю эту ошибку из сокета каждый раз, prntscr.com/jea643/direct <- скриншот

HD. 06.05.2018 04:34

@HD. - Похоже, это совершенно другая ошибка, чем та, о которой вы спрашиваете в своем вопросе?

Enigmativity 06.05.2018 05:09

Я сказал, что либо выдаются ошибки о слишком большом количестве подключений, либо что-то еще. Я использовал код ur, и у меня не было никаких дополнительных ошибок подключения или чего-то еще, но теперь, возвращаясь к дополнительным ошибкам, не понимаю.

HD. 06.05.2018 14:35

@HD. - Значит, мой ответ кое-что решил, но теперь у вас есть эти другие ошибки?

Enigmativity 06.05.2018 15:55

Сначала это было так, но потом оно снова начало выдавать мне то же самое, вместе с той другой ошибкой.

HD. 06.05.2018 16:14
Ответ принят как подходящий

Уже во всем разобрался. Кажется, каждый раз, когда я на чем-то зацикливаюсь с проектом, я рано или поздно сам разбираюсь в этом :))))

В любом случае спасибо.

Было бы полезно, если бы вы могли рассказать, где вы обнаружили проблему и каков ваш подход к ее решению.

yoger 09.05.2018 07:47

в основном я вставляю «IPAddress remote = IPAddress.Parse (ip); IPEndPoint re = new IPEndPoint (remote, port);» затем я выполнил функцию using () с сокетом и подключил сокет с помощью IPEndPoint, а затем сделал все остальное, что ему нужно было сделать

HD. 10.05.2018 23:41

Другие вопросы по теме