Возможно кто-то из Вас уже встречался со мной в моих прошлых тредах посвящённых созданию ПО для Java Minecraft на C++. В этом треде я так же прошу у Вас помощи.
Мне нужно сделать так чтобы я мог полностью контролировать передачу данных по своему усмотрению. То есть, иметь возможность в любой момент остановить (с последующим возобновлением) принятие или отправку данных таким образом, чтобы меня не выкинуло с сервера и клиент игры не завершил работу из-за какой-либо ошибки. Или например сделать так, чтобы отправляемые пакеты данных куда-то сохранялись и отправлялись по 10 каждую секунду. В общем, иметь полный контроль над передачей данных.
Что известно
Клиент игры Java Minecraft 1.10 работает на протоколе TCP и использует для принятия и передачи данных функции из библиотеки ws2_32 под названием WSASend и WSARecv.
Если установить ловушку на функцию WSASend и вернуть 0 без вызова оригинальной функции то отправка "заморозится" но игра попытается отправить данные снова. И так будет до тех пор пока данные не будут отправлены. То есть, отправка идти не будет, но игра будет спамить одними и теми же данными в надежде их отправить. Аноны из прошлых тредов подсказали как убрать повторную отправку. Для этого нужно было установить переменной lpNumberOfBytesSent значение из lpBuffers->len. Буфер всегда один. Как я понял, игра проверяла количество отправленных байт. Теперь игра не пытается отправить одни и те же данные повторно. Отправка данных остановлена (успешно игнорируется) и при этом я прекрасно вижу как игроки двигаются, что говорит о том что с принятием данных всё в порядке. Но появляется новая проблема. Либо ошибки которые появляются после отключения игнорирования, либо сервер перестаёт видеть данные и я просто для всех стою на месте.
Есть предположение что эти ошибки появляются из-за того что была отправлена только часть данных и сервер ожидает продолжение, но после "разморозки" получает совершенно другую часть данных и выкидывает с сервера (либо не выкидывает, но не может понять что с ними делать и я для всех просто стою на месте) из-за того что не получилось их корректно сопоставить и прочитать. Есть ли какая-то возможность проверить что текущие данные были отправлены и можно начать игнорировать отправку?
Если установить ловушку на функцию WSARecv и попытаться так-же вернуть 0 то это не сработает как с WSASend. Меня просто моментально выкинет с сервера с надписью "disconnected". На одном из форумов мне подсказали установить ловушку не на WSARecv а на Select и очищать readfds при помощи FD_ZERO. Это вроде как работало и по логике я должен был иметь возможность двигаться, ставить блоки и так далее но не видеть что что-то меняется (так как принятие "приостановлено") Однако в игре все мои действия идут рывками, хотя не должны. Отправку ведь я не трогал. То есть, для других я двигаюсь, ставлю блоки и тому подобное, но это идёт рывками. После прекращения игнорирования входящих данных отлаг идёт около 2 - 3 секунд. То есть, только спустя 2 - 3 секунды игроки начинают снова бегать и так далее.
>>235532070 (OP) Так же у меня есть мысли сделать посредника между клиентом и сервером, чтобы он принимал все данные и решал передать ли их клиенту (если данные отправлял сервер) или отправить их серверу (если данные отправлял клиент). Но я не знаю как это сделать. У меня есть доступ к сокету клиента, есть доступ к функциям WSASend и WSARecv, по логике я должен просто перенаправить на свой сокет но я не знаю как правильно это все написать чтобы работало. Вариант с посредником намного лучше.
>>235539504 Блять я уже второй раз говорю ЭТО НЕ МОД и я НЕ СОБИРАЮСЬ взаимодействовать с ФУНКЦИЯМИ ИГРЫ. Если ты вообще не понял о чем тут речь то от тебя никакого толку не будет, можешь пролистывать тред.
>>235540342 Нахуя отвечать в треде если ты не имеешь знаний / не прочитал полностью инфу? Тот кто имеет знания понимает что WSASend и WSARecv это функции из WinAPI библиотеки ws2_32 ни о каком хукинге java классов речи не шло. Слово java в названии лишь только для того чтобы дать понять что это именно JAVA minecraft а не бедрок например. Съеби нахуй сам.
>>235540545 Во первых я не спал всю ночь, и мягко говоря не был настроен читать всю ту хуйню что ты написал. Поэтому спокойно задал вопрос, на который рассчитывал получить краткий ответ. Во вторых, почему ты, не отвечая на вопросы, хочешь что бы тебе на твой кто то ответил?
Было желание помочь, интересная задача, думал раздуплю глаза перечитаю ещё разок, но щяс хуй те в рот. С отношением как будто тебе кто то что то должен на дваче, не хотел бы когда либо с тобой работать. Бай бай, дура
>>235532070 (OP) > Мне нужно сделать так чтобы я мог полностью контролировать передачу данных по своему усмотрению. То есть, иметь возможность в любой момент остановить (с последующим возобновлением) принятие или отправку данных таким образом, чтобы меня не выкинуло с сервера и клиент игры не завершил работу из-за какой-либо ошибки Лошпед, для чего тебе это надо? Ты хуйню выдумал, назови изначальную задачу