Dzieki, pomoglo.
Pogoooglowalem i ... :
32 bitowa liczba posiada 4 oktety (4*8 = 32).
64 bitowa liczba ma owych oktetów 8 (8*8 = 64).
Offset w pakiecie to numer oktetu po ktorym doklejamy kolejne dane.
I tak:
Kod
0 64-bit integer connection_id 0x41727101980
8 32-bit integer action 0
12 32-bit integer transaction_id
16
(Liczymy od zera, tak jak w tablicach)
Od 0 do 7 - osiem oktetow, liczba 64 bitowa
8 - 11 cztery oktety liczby 32 bitowej
12 - 15 kolejne cztery oktety.
Dla pozostalych, ktorzy tez poszerzaja wiedze na ten temat - oktet to np: 1001 1001 1001 1001 1001 1001 1001 1001, razem 32 bity.
Kazda cyfra w HEX (szesnastkowa, 0 - F) reprezentuje 4 bity.
I tak: 1001 = 0x9 a ten dlugi ciag wczesniej: 0x99999999.
Mam 32 bitowa wersje PHP wiec 64-bitowa liczba 0x41727101980 (8 znakow - za duzo na 32 bit - max to 8) nie bedzie dzialac, rozdzielam ja wiec na dwie 32-bitowe:
0x417, 0x27101980 (po prostu rozdzielam, nie robie zadnych dzialan matematycznych).
Nastepnie pakujemy dane. W specyfikacji pisze, ze liczby sa w formacie big endian (najwazniejszy bajt pierwszy (bajt = 8 bitow (oktet))).
Nalezy wziac to pod uwage przy funkcji PACK:
$binString = pack('N4', 0x41727
, 0x101980
, 0
, $transId);
Wyjasnienie "N3" - N oznacza, ze pierwszy parametr powinien zostac zakodowany jako:
unsigned long (always 32 bit, big endian byte order)
"4" oznacza, ze nalezy zastosowac to do 4 kolejnych argumentow zaczynajac od aktualnego.
2 pierwsze argumenty to nasz podzielony, 64 bitowy integer, ktorego moje php nie ogarnia :-)
Ok i pozniej lecimy:
$fp = stream_socket_client($uri, $errNo, $errStr, $timeout);
if (!$fp) {
echo "ERROR: $errNo - $errStr<br />\n"; }else{
$r = fread($fp, 255
); // oczekiwane 16 }
... i kupa. fwrite zwraca 16, czyli jest GIT. $fp jest OK - polaczenia nawiazane, var dump z fread natomiast zwraca string o zerowej dlugosci. Nie dostaje zadnej odpowiedzi.
Bede dalej probowal, natomiast tych bardziej doswiadczonych prosil bym o ewentualne sugestie. Moze jest cos o czym nie wiem. Wg. dokumentacji powinienem teraz dostac odpowiedz o dlugosci min. 16 bajtow.