вы путаете понятия нулевой байт с...даже не знаю как это назвать.
Вобщем, нулевой байт - это байт с кодом ноль �. У вас в логе он расположен самым последним символом, сразу после "<policy-file-request/>" в той же строке.
А вторая надпись в логе " -- Client said:" -- это никакой не нулевой байт, это вообще не байт, там пустой буфер. Если вы там сделаете echo strlen($data), то получите 0.
А если вы еще и распечатете там часики, то увидите, что клиент дропает сокет не сразу, а по истечении таймаута.
это наводит на мысль, что можно попытаться отдавать полиси нуль-терминированным. Попробуйте.
то есть после присвоения прицепляете в конец ноль:
$crossdomain .= "\0";
и потом уже с ним работаете. c XMLSocket только так и работает.
кстати, у вас кроссдомейн странный.
нате вам мой, с уже прцепленным нулем:

PHP код:
$xmlpolicy="<?xml version=\"1.0\"?><cross-domain-policy><allow-access-from domain=\"*\" to-ports=\"$port\" /></cross-domain-policy>\0";
так, тут его форум маленечко обрезает... вобщем перед каждой двойной кавычкой, которая должны пойти в контент, ставите обратный слешь. То есть после version= идет обратный слешь, а только потом кавычка.
когда заработает будете последовательными приближениям приближать к своему варианту и так найдете где он там спотыкается.