C # Форма зависает при получении байтов после отправки пакетов - PullRequest
0 голосов
/ 03 мая 2018

Хорошо, некоторые из вас, ребята, могут не понять из названия, но я пытаюсь что-то поработать над игрой в C #. Он включает в себя подключение к сокету, чтобы я мог отправлять пакеты на сервер и все работало.

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

private void sendRawPackets(Socket s, string packet)
    {
        byte[] data = Encoding.ASCII.GetBytes(string.Format("{0}\0", packet));
        s.Send(data);
    }

    private void gethash(string cmd, string args)
    {
        ProcessStartInfo start = new ProcessStartInfo();
        start.FileName = @"C:\Python27\python.exe";
        start.Arguments = string.Format("{0} {1}", cmd, args);
        start.UseShellExecute = false;
        start.RedirectStandardOutput = true;
        using (Process process = Process.Start(start))
        {
            using (StreamReader reader = process.StandardOutput)
            {
                string result = reader.ReadLine();
                logkey = "";
                logkey = result;
            }
        }
        connect();
    }

    private void connect()
    {
        byte[] bytes = new byte[2024];
        Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
        sock.Connect(ip, port);

        sendRawPackets(sock, "<policy-file-request/>");
        sock.Receive(bytes);
        sendRawPackets(sock, "<msg t='sys'><body action='verChk' r='0'><ver v='154' /></body></msg>");
        sock.Receive(bytes);
        sendRawPackets(sock, "<msg t='sys'><body action='login' r='0'><login z='Slime'><nick><![CDATA["+user.Text+"]]></nick><pword><![CDATA["+logkey+"]]></pword></login></body></msg>");
        sock.Receive(bytes);
        sendRawPackets(sock, "%xt%login%1#2%-2");
        sock.Receive(bytes);
        sendRawPackets(sock, "%xt%login%2#6%-1%");
        sock.Receive(bytes);
        sendRawPackets(sock, "%xt%login%2#7%17610%69%0,-255,190%");
        sock.Receive(bytes);
        sendRawPackets(sock, "%xt%login%2#4%3150%FlumsFountain%52.9941101744771%0%989.1726320236921%-180%0%190%");
        sock.Receive(bytes);
    }

Но в любом случае в функции connect () именно туда отправляются пакеты с помощью функции sendRawPackets (). Но по какой-то причине, когда я пытаюсь получить байты после отправки пакетов, программа снова просто зависает и не продолжается.

Мне было интересно, есть ли способ решить эту проблему ?? Действительно помогло бы, если бы кто-то знал ответ. :)

РЕДАКТИРОВАТЬ В основном пытаюсь использовать этот код Python и преобразовать его в код C #, но у меня не получается.

self.sendRawPacket(s, "<policy-file-request/>")
            s.recv(2024)
            self.sendRawPacket(s, "<msg t='sys'><body action='verChk' r='0'><ver v='154' /></body></msg>")

Ответы [ 2 ]

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

разобрался в проблеме. Поскольку я пытаюсь отправить пакеты, я делаю это, используя UDP и Dgram для типа сокета.

Но мне действительно нужно было изменить тип протокола на Tcp, а SocketType - на поток

прости за все.

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

Попробуйте, если вы не хотите, чтобы ваш поток пользовательского интерфейса зависал

using System.ComponentModel;


private void connect()
{
    using(BackgroundWorker bw = new BackgroundWorker())
    {
        Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
        sock.Connect(ip, port);
        bw.DoWork += (o, e) => {
            sendRawPackets(sock, "<policy-file-request/>");
            Thread.Sleep(600);
            sendRawPackets(sock, "<msg t='sys'><body action='verChk' r='0'><ver v='154' /></body></msg>");
            Thread.Sleep(600);
            sendRawPackets(sock, "<msg t='sys'><body action='login' r='0'><login z='Slime'><nick><![CDATA[" + user.Text + "]]></nick><pword><![CDATA[" + logkey + "]]></pword></login></body></msg>");
            Thread.Sleep(600);
            sendRawPackets(sock, "%xt%login%1#2%-2");
            Thread.Sleep(600);
            sendRawPackets(sock, "%xt%login%2#6%-1%");
            Thread.Sleep(600);
            sendRawPackets(sock, "%xt%login%2#7%17610%69%0,-255,190%");
            Thread.Sleep(600);
            sendRawPackets(sock, "%xt%login%2#4%3150%FlumsFountain%52.9941101744771%0%989.1726320236921%-180%0%190%");
            Thread.Sleep(600);
        }

        bw.RunWorkerCompleted += (o, e) => {
            //When all the work is finished
        }

        //Runs the background worker
        bw.RunWorkerAsync();
    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...