/ / PHP Webscoekt, Czytanie fragmentarycznych komunikatów o gniazdach - php, websocket

PHP Webscoekt, Odczytywanie wiadomości z fragmentacją gniazda - php, websocket

Mam następujący kod, aby zdemaskować wiadomość wysłaną przez przeglądarkę do serwera za pomocą Websocket. Nie rozumiem zbyt wiele z tego, ale to nie bierze pod uwagę, czy ramka jest ciągła czy ostatnia klatka.

Jak mogę określić, czy ramka jest kontynuowana. Rozumiem, że sposobem na to jest odczytanie pierwszego bitu [FIN] wiadomości, ale nie mogę znaleźć sposobu, aby to zrobić. Proszę pomóż mi.

function unmask($payload) {
$length = ord($payload[1]) & 127;
if($length == 126) {
$masks = substr($payload, 4, 4);
$data = substr($payload, 8);
$firstcode=substr($payload, 1, 1);
}


elseif($length == 127) {
$masks = substr($payload, 10, 4);
$data = substr($payload, 14);
$firstcode=substr($payload, 1, 1);

}
else {
$masks = substr($payload, 2, 4);
$data = substr($payload, 6);
$firstcode=substr($payload, 1, 1);

}
$text = "";
for ($i = 0; $i < strlen($data); ++$i) {
$text .= $data[$i] ^ $masks[$i%4];
}

return $text;
}

Odpowiedzi:

0 dla odpowiedzi № 1

Gdy odbierasz wiadomość z przeglądarki, jestmożliwe, że nie uda ci się uzyskać pakietu tak intensywnie. Po kilku testach. Przeglądarka może wysyłać dane, grupując różne wiadomości lub dzieląc pojedynczą wiadomość na porcje.

Wydaje się, że musimy o tym pamiętać podczas demaskowania danych na końcu serwera. Możesz zanotować następujące punkty.

  1. Upewnij się, że otrzymałeś wszystkie dane, jeśli nie zadzwoń, otrzymaj wniosek wiadomości w kolejności, w jakiej się pojawią.
  2. Zdemaskuj wiadomość, jeśli otrzymałeś wszystkie dane,
  3. Użyj ramki długości ładunku, aby zobaczyć, ile danych jest oczekiwanych.
  4. Możesz również otrzymywać wiele wiadomości razem. W takim razie ty trzeba rozlać dane w mniejszych kawałkach i zdemaskować każdy z nich osobno.

Nie jestem pewien, czy jestem w stanie przekazać moje punkty, ale mam szczerą nadzieję, że to pomoże.