[Risolto] [PHP] Socket access null

Linguaggi di programmazione: php, perl, python, C, bash e tutti gli altri.
perseoclub
Prode Principiante
Messaggi: 152
Iscrizione: giovedì 12 novembre 2009, 0:38

[Risolto] [PHP] Socket access null

Messaggio da perseoclub »

Buongiorno ragazzi,

dopo aver risolto il problema del networking, nell'apposita sezione grazie al mitico Thece, anche su suo consiglio chiedo chiarimenti su un problema.

Lo scenario è:
A) macchinario aziendale sul cui PC è installato Windows10 → IP = 192.168.1.19
b) server aziendale, con Ubuntu 16.04 → IP = 192.168.1.106

Il macchinario tramite la porta 8888 invia/riceve messaggi col protocollo TCP/IP.

Sul server faccio girare questo script PHP per ricevere il tracciato dal macchinario:

Codice: Seleziona tutto

<?php

error_reporting(E_ALL);
/* Si indica allo script di non uscire mentre attende una connessione */
set_time_limit(0);
/* Abilita lo scarico dell'output così si è in grado di vedere cosa passa
 * non appena arrivano i dati al server. */
ob_implicit_flush();

$dt = date('d/m/Y H:i:s');

$address = '192.168.1.106';

$port = 8888;

$timeout = 20;

$cmp = array();

// Create a TCP Stream socket
$sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($sock === false) {
    $errorcode = socket_last_error();
    $errormsg = socket_strerror($errorcode);
    die("socket_create [$errorcode] $errormsg");
}

// after 20 seconds socket will destroy the connection. Also you can set and uses
if ( !socket_set_option($sock, SOL_SOCKET, SO_RCVTIMEO, array( "sec"=>$timeout, "usec"=>0 ) ) ) {
	echo socket_strerror(socket_last_error($sock));
	exit;
}

// Lega il socket alla porta $port sul server $host 
$result = socket_bind($sock, $address, $port) or die("Fallito inizializzazione porta su socket. Datetime: ". $dt);

// Inizio ascolto sulla connessione
$result = socket_listen($sock, 3) or die("Start ascolto socket fallito. Datetime: ". $dt);

// Attende l'arrivo di una connessione client
$client = socket_accept($sock) or die("Inizializzazione connessione con client fallita. Datetime: ". $dt);

// Legge Client input
$input = socket_read($client, 2048) or die("Errore Non riesco a leggere l'input. Datetime: ". $dt);

$cmp[] = $input;

socket_close($client);
socket_close($sock);

Lo script termina con: "Inizializzazione connessione con client fallita. Datetime: ..."
poiché socket_accept() non riceve nulla... nonostante dal macchinario abbiamo cliccato il tasto "INVIA TRACCIATO"... Mi potreste aiutare a capire il problema?

Grazie in anticipo!
Ultima modifica di perseoclub il mercoledì 2 ottobre 2024, 21:08, modificato 3 volte in totale.
Avatar utente
thece
Tenace Tecnocrate
Tenace Tecnocrate
Messaggi: 13719
Iscrizione: lunedì 23 aprile 2007, 14:16
Distribuzione: Debian 12 (Bookworm) - KDE

Re: [PHP] Socket access null

Messaggio da thece »

:ciao:

già che c'ero una letta l'ho data ...

Questo (fatto) che hai scritto è sicuramente sbagliato.
perseoclub ha scritto:
lunedì 30 settembre 2024, 17:25
...
Il macchinario tramite la porta 8888 invia/riceve messaggi col protocollo TCP/IP.
...
L'host Windows (192.168.1.19) sta agendo da server, il servizio (???) è in ascolto sulla porta 8888/TCP.
Quindi l'host Ubuntu (192.168.1.106) , ossia la pagina PHP, deve agire da client, cioè deve iniziare lui la connessione verso il server, effettuare la richiesta, attendere la risposta e chiudere la connessione.
I'm #1 so why not try: sudo rm -rf / ?
perseoclub
Prode Principiante
Messaggi: 152
Iscrizione: giovedì 12 novembre 2009, 0:38

Re: [PHP] Socket access null

Messaggio da perseoclub »

Scusa Thece, probabilmente mi esprimo male, o forse non ho capito io gli attori...

A) macchinario aziendale, sul cui PC è installato Windows10 → IP = 192.168.1.19
Su questo PC abbiamo aperto la porta "8888", e gira un software proprietario che mi permette di settare il numero di porta da utilizzare nella connessione TCP/IP → che di default è appunto la "8888".
Questo software inoltre mi permette di inviare i tracciati, premendo il tasto "invio tracciato".

b) server aziendale, con Ubuntu 16.04 → IP = 192.168.1.106
Su questo PC faccio girare lo script PHP, settando HOST ADDRESS = 192.168.1.106 e PORT = 8888.

Io ero convinto che:
Ubuntu si mette in ascolto sulla porta 8888, in attesa del messaggio (ossia del tracciato) che gli manda Windows, quando premo il tasto "invia tracciato" sul software di windows.


Ho capito male... e/o devo modificare il mio script php?
Avatar utente
thece
Tenace Tecnocrate
Tenace Tecnocrate
Messaggi: 13719
Iscrizione: lunedì 23 aprile 2007, 14:16
Distribuzione: Debian 12 (Bookworm) - KDE

Re: [PHP] Socket access null

Messaggio da thece »

I concetti di Client e Server sono concetti relativi e uno stesso attore può assumere entrambe le parti in momenti diversi del suo funzionamento.

Sistema Client / Server

Il Client è la parte che sottopone al Server una determinata richiesta per una determinata risorsa.
Il Server è la parte che riceve la richiesta dal Client, elabora un risultato e lo rimanda indietro al Client come risposta.

Io certezze non ne ho perchè:
- non ho le mani sul tuo ambiente
- non conosco il funzionamento dettagliato del macchinario
- non conosco le specifiche della funzione che permette di inviare i tracciati


Per quello che ho capito, il software proprietario del macchinario, sull'host Windows, sta agendo come Server ed è in ascolto sulla porta 8888/TCP. (**)
E' in ascolto di che cosa? Delle richieste che possono arrivare dai Client, nel tuo caso la pagina PHP ospitata (ahimè) sul Server Web (*) che gira sull'host Ubuntu.

La pagina PHP (Client) richiede al servizio (Server) un tracciato. Il software proprietario (Server) elabora una risposta (il tracciato) e lo rimanda indietro alla pagina PHP (Client)



(*) Il client del tuo Server Web è il browser

(**) Ti ho anche chiesto di verificarlo sull'host Windows con il comando

Codice: Seleziona tutto

netstat -ano | findstr /c:8888
I'm #1 so why not try: sudo rm -rf / ?
perseoclub
Prode Principiante
Messaggi: 152
Iscrizione: giovedì 12 novembre 2009, 0:38

Re: [PHP] Socket access null

Messaggio da perseoclub »

Ho riletto attentamente il manuale del macchinario (un analizzatore).

Immagine

Quindi, se ho capito bene:

1) dopo aver creato il canale di comunicazione (il socket)

2) il mio CLIENT (Ubuntu, PHP) deve mandare al SERVER (Windows) una richiesta di INIZIO → che equivale al carattere ascii <STX>

3) se tutto è corretto, il SERVER (Windows) risponde con il carattere ascii <ACK> → diciamo che da l'ok alla trasmissione dei dati...

4) da qui... il CLIENT può inviare altri comandi (che terminano con <EOT>), per ricevere risposta dal SERVER.


Quindi, al momento non ricevo nulla → perché il mio script PHP NON INVIA NESSUNA RICHIESTA al SERVER (in ascolto)!!! Spero di aver capito...
Avatar utente
thece
Tenace Tecnocrate
Tenace Tecnocrate
Messaggi: 13719
Iscrizione: lunedì 23 aprile 2007, 14:16
Distribuzione: Debian 12 (Bookworm) - KDE

Re: [PHP] Socket access null

Messaggio da thece »

Direi di si.
I'm #1 so why not try: sudo rm -rf / ?
perseoclub
Prode Principiante
Messaggi: 152
Iscrizione: giovedì 12 novembre 2009, 0:38

Re: [PHP] Socket access null

Messaggio da perseoclub »

Purtroppo il mio codice PHP si arena al comando socket_read().

Posto il codice utilizzato:

Codice: Seleziona tutto

<?php

error_reporting(E_ALL);
/* Si indica allo script di non uscire mentre attende una connessione */
set_time_limit(0);
/* Abilita lo scarico dell'output così si è in grado di vedere cosa passa
 * non appena arrivano i dati al server. */
ob_implicit_flush();


$dt = date('d/m/Y H:i:s');

//$address = '192.168.1.106';   //  SERVER
$address = '192.168.1.19';      //  MACCHINARIO

$port = 8888;

$timeout = 30;

$stx = 0x02;    //  <STX>
$ack = 0x06;    //  <ACK>
$eot = 0x04;    //  <EOT>

error_log("CREATING SOCKET...");
// Create a TCP Stream socket
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket === false) {
    $errorcode = socket_last_error();
    $errormsg = socket_strerror($errorcode);
    die("socket_create [$errorcode] $errormsg");
}

error_log("CREATING OPTION of SOCKET...");
// after $timeout seconds socket will destroy the connection. Also you can set and uses
if ( !socket_set_option($socket, SOL_SOCKET, SO_RCVTIMEO, array( "sec"=>$timeout, "usec"=>0 ) ) ) {  
    $errorcode = socket_last_error();
    $errormsg = socket_strerror($errorcode);
    die("socket_create_option [$errorcode] $errormsg");
}

// connect to server
$result = socket_connect($socket, $address, $port) or die("Could not connect to server. Datetime: ". $dt ); 
error_log("CONNECT to SERVER...");
//

// send string to server
/** /
$result = socket_send($socket, $stx, strlen($stx), 0) or die("Could not send data to server. Datetime: ". $dt );
error_log("SEND to SERVER...");
/**/
socket_write($socket, $stx, strlen($stx)) or die("Could not write data to server. Datetime: ". $dt );
error_log("WRITE to SERVER...");
//

/**/
// get server response
$result = socket_read($socket, 1024) or die("Could not read server response. Datetime: ". $dt );
error_log("RECEIVE from SERVER...");
//

if ( $result === $ack ) {
    error_log("RESULT = ACK");
    $req = "R". $eot;
    $result = socket_write($socket, $req, strlen($req)) or die("Could not send data to server. Datetime: ". $dt );
    $ref = socket_read ($socket, 1024) or die("Could not read server response. Datetime: ". $dt );
    echo "REF: ". $ref;
}

// close socket
socket_close($socket);
error_log("CLOSE SOCKET...");
//

echo "OPERAZIONE CONCLUSA: ". $dt;
perseoclub
Prode Principiante
Messaggi: 152
Iscrizione: giovedì 12 novembre 2009, 0:38

Re: [PHP] Socket access null

Messaggio da perseoclub »

Volevo informare chi segue il post che ho risolto!

Un ringraziamento sincero va a Thece, il cui aiuto è stato prezioso, determinante ed essenziale, sia per il networking sia per la comprensione del codice PHP.

Il problema era il formato del carattere di inizio comunicazione → <STX> (0x02), che il server "richiede" in ascii ( → lenght = 1): in PHP equivale ad inviare => chr(2);

Per il resto sono andato a tentativi, con il mio spaghetti-code! Ma funziona!!! Sono strafelice.
Scrivi risposta

Ritorna a “Programmazione”

Chi c’è in linea

Visualizzano questa sezione: 0 utenti iscritti e 1 ospite