C # Threading с сокетами - PullRequest
       5

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

0 голосов
/ 06 мая 2018

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

Я делаю ботов для игры на 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);
            }

        }
    }

Ответы [ 2 ]

0 голосов
/ 09 мая 2018

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

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

0 голосов
/ 06 мая 2018

Требуется значительное время, чтобы нить раскрутилась, поэтому к тому моменту, когда вы завершите цикл 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();
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...