Socket TCP

0

Witam
Mam pewien problem z socketem.
Używam go do odbioru paczki danych (kilkanaście bajtów). Dane są wysyłane co 30 sekund.
Do symulacji użyłem skryptu w node.
Problem jest taki że w momencie kiedy uruchomię skrypt wszystko działa ale kiedy prześlę dane z urządzenia (dane GPS) skrypt PHP odbierze je tylko raz i koniec.
Jeżeli uruchomię klienta + tracker GPS wszystko też działa (pomiędzy danymi ze skryptu otrzymuje dane z Trackera.
Próbowałem też z socketem pod Node ale nie działa skrypt clienta wywala exception więc próbuję pod php ale na razie z marnym skutkiem.

<?php
//////////////////serwer////////////////////////////
echo "OK";

/*************************************/
/********Socket Server*********************/
set_time_limit (0);
// Set the ip and port we will listen on
$address = 'xxxxxx';
$port = 4567;
 
$sock = socket_create(AF_INET, SOCK_STREAM, 0);  
 
socket_bind($sock, 0, $port) or die('Could not bind to address');  //0  
socket_listen($sock);
 
while (true) {
 
$client =  socket_accept($sock);
 
$input =  socket_read($client, 1000); // ????
// Strip all white  spaces from input
echo $input;
    flush();
    ob_flush();
    sleep(1);



 

// Close the master sockets
}
socket_close($sock);


?>
//////////////////////klient/////////////////////////
var net = require('net');
function loop(){

var net = require('net');
 
var HOST = 'thx.atthost24.pl';
var PORT = 4567;
 
var client = new net.Socket();
 
client.connect(PORT, HOST, function() {
    console.log('Client connected to: ' + HOST + ':' + PORT);
    // Write a message to the socket as soon as the client is connected, the server will receive it as message from the client 
    client.write('Hello World!');
 
});
 
client.on('data', function(data) {    
    console.log('Client received: ' + data);
     if (data.toString().endsWith('exit')) {
       client.destroy();
    }
});
 
// Add a 'close' event handler for the client socket
client.on('close', function() {
    console.log('Client closed');
});
 
client.on('error', function(err) {
    console.error(err);
});
}
	setInterval(loop,3000);
0

Zazwyczaj robi się tak, że accept i read są obsługiwane oddzielnie. Domyślnie obie operacje są blokujące. Tzn, że możesz utknąć w czekaniu na jedną z nich. Dlatego używa się gniazd w trybie nie blokującym i sprawdza, czy można coś przeczytać (operacja select, dla accept zwracana wartość).

Ty wprowadziłeś sekwencję: czekaj na połączenie, przeczytaj dane. Jeżeli utknie w oczekiwaniu na dane, to nie zaakceptuję żadnych nowych połączeń. A prawdopodobnie utkwi Ci w tym czytaniu jeżeli nie dostanie równo 1000 bajtów, albo klient nie zamknie połączenia. I w drugą stronę, po przeczytaniu 1000 bajtów skrypt czeka na nowe połączenie. Stare gniazdo zostaje niezamknięte. A przecież mogą się tam jeszcze pojawiać dane. Co gorsza przy następnym akcepcie tracisz całkowicie referencję do starego gniazda.

0

Powiem szczerze że ja tego kompletnie nie ogarniam.
Dałem
$client = socket_accept($sock);
while (true) {

i niby działa ale teraz jak zamkne konsolę to potem mam problem że już jest połączenie zbindowane i nie można tego zrobić ponownie :( i potem czekam pół dnia zanim się zamknie.

1 użytkowników online, w tym zalogowanych: 0, gości: 1