Ошибка fsockopen 10053 при записи символов в сокет Java

Верно,

Я пытаюсь написать крошечный скрипт на PHP, который отправит пакет игрового чата в Minecraft.

//Deliberately low timeout
$mc = fsockopen("localhost", 25565, $errno, $err, 3);

Теперь, если это успешно соединяется, я отправляю 2 «пакета».

Один байт с целым числом 3, чтобы сообщить Minecraft, что он должен обрабатывать входящий сетевой трафик как «пакет» Packet3Chat:

fwrite( $mc, strrev( pack( "C", 3 )  ) );

Кажется, это работает отлично**.

Второй необходимый «пакет» — это длина строки в виде подписанный шорт.

$my_string = "Hello World!";
//119 character limit on Minecraft chat messages
$processed_string = substr($my_string, 0, 119);
fwrite($mc, strrev( pack( "s", strlen( $processed_string ) ) ) );

И это также работает A-OK**.

И теперь все, что осталось сделать, это отправить фактическую строку, в виде символов.

Я попытался разделить строку, используя str_split, и отправить каждый символ самостоятельно, используя оба:

//Signed char
fwrite($mc, strrev( pack( "c", $character ) ) );

и

//Unsigned char
fwrite($mc, strrev( pack( "C", $character ) ) );

И я также пытался просто отправить всю строку этими методами, не разбивая ее, однако мне не удалось успешно распечатать символы, полученные readChar() (System.out.println просто печатает пустую строку), и я получаю fwrite error 10053 в какой-то момент во время отправки символов, т. е. readChar() генерирует EOFException.

Я запускаю модифицированный сервер Minecraft в Windows 7 и запускаю PHP 5.x с использованием XAMPP на том же компьютере.

Любые идеи, почему соединение будет «закрыто программным обеспечением»? И почему он закрывается только при отправке символов/строки, а не при отправке байта/шорта?


** Да, я использовал System.out.println для проверки данных, полученных Minecraft.


person Jon    schedule 03.08.2011    source источник


Ответы (2)


10053 — это код ошибки winsock для WSAECONNABORTED.
«Понятное» объяснение этой ошибки можно найти на странице http://www.chilkatsoft.com/p/p_299.asp

person VolkerK    schedule 03.08.2011

попробуйте плагин HTTPConsole и

и используйте такую ​​функцию для выполнения команды:

function exec_shell_command($command) {
$command = urlencode($command);
$url = "http://127.0.0.1:25560/console?command=$command";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

$out = curl_exec($ch);
curl_close($ch);
return $out;
}
$retval = exec_shell_command("say this is a server message");

Я не уверен, что это делает то, что вы хотите, когда вы говорите «отправить сообщение в чате». Это отправляет консольное сообщение на сервер.

person uncovery    schedule 16.08.2011