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





Для раскрутки потока требуется значительное время, поэтому к тому времени, когда он завершится, ваш цикл 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. - Похоже, это совершенно другая ошибка, чем та, о которой вы спрашиваете в своем вопросе?
Я сказал, что либо выдаются ошибки о слишком большом количестве подключений, либо что-то еще. Я использовал код ur, и у меня не было никаких дополнительных ошибок подключения или чего-то еще, но теперь, возвращаясь к дополнительным ошибкам, не понимаю.
@HD. - Значит, мой ответ кое-что решил, но теперь у вас есть эти другие ошибки?
Сначала это было так, но потом оно снова начало выдавать мне то же самое, вместе с той другой ошибкой.
Уже во всем разобрался. Кажется, каждый раз, когда я на чем-то зацикливаюсь с проектом, я рано или поздно сам разбираюсь в этом :))))
В любом случае спасибо.
Было бы полезно, если бы вы могли рассказать, где вы обнаружили проблему и каков ваш подход к ее решению.
в основном я вставляю «IPAddress remote = IPAddress.Parse (ip); IPEndPoint re = new IPEndPoint (remote, port);» затем я выполнил функцию using () с сокетом и подключил сокет с помощью IPEndPoint, а затем сделал все остальное, что ему нужно было сделать
Где ты хоть розетку закрываешь? Как вы ожидаете, что один и тот же сокет будет использоваться всеми этими потоками, которые вы создаете? И, кстати, прочтите инструкции
using, рекомендацииHttpClientи StackOverflow по размещению минимального фрагмента кода, иллюстрирующего проблему. Ни один код веб-запроса не имеет отношения к вашему вопросу.