Никак. Это фундаментальная особенность работы сети. Если не хотите заниматься сборкой пакетов вручную, то найдите того, кто будет делать это за вас. Я не в курсе что предлагает spigot для решения этой проблемы, но видел плагин ProtocolLib. Вероятно, он может помочь.
Тут не в протоколе дело, а в софте, его имплементирующем. Судя по всему, протестированные вами реализации SSH и RDP используют эту же самую функцию для преобразования адреса из char массива в структуру in_addr. Только и всего.
Тем не менее, другие люди будут приходить из гугла и копипастить ваш ответ в свои проекты бездумно, даже не догадываясь о последствиях. Хотя бы добавьте в ответ ремарку о том, что это решение костыльное и небезопасное.
Показателен пример с переопределением Object.equals(Object) - люди часто ошибаются с сигнатурой: class MyClass { public boolean equals(MyClass o) { /* blah-blah */ } }. В итоге определили новый метод, а не переопределили родительский. Причём ошибка может не сразу обнаружиться.
Ладно equals() можно запомнить очень быстро. Базовый метод, как-никак. Часто на слуху. Но в нетривиальных случаях можно неплохо подпортить себе нервы, пытаясь отдебажить проблему, которую можно было переложить на компилятор аннотацией @Override.
Правильный ответ: обе одинаковые. На самом деле тут дело не в передаче объекта по ссылке, а во особенностях работы интерпретатора с памятью. Например, $str = '123'; $str2 = $str; В памяти будет только один объект со строкой '123', $str и $str2 указатели на один и тот же объект. Новый объект для $str2 выделится только во время модификации.
$str = '123';
$str2 = $str;
$str2 .= '4'; // копирование объекта происходит только на этом этапе
print $str.'-'.$str2; // 123-1234