Visualizzazione dei risultati da 1 a 10 su 10

Discussione: PHP e TCP

  1. #1

    PHP e TCP

    Salve a tutti,

    sono tornato ad eseguire una procedura che pensavo, onestamente, fosse più semplice.
    Voglio semplicemente usare php per ricevere delle stringhe inviati tramite socket con protocollo TCP.

    Ora, dopo aver scritto un pò di codice, anche con l'aiuto della rete, mi sono imbattuto in un problema di cui anche in rete non ho trovato traccia.

    Quando faccio utilizzo la funzione socket_bind, mi viene restituito l'errore "Could not bind to socket: Protocol not supported"

    C'è qualcuno che potrebbe aiutarmi sul dove mettere le mani o cosa potrei verificare?

    Di seguito due righe di codice per dare un'idea più chiara.

    Codice PHP:
    $socket socket_create(AF_INETSOCK_STREAM0) or die(mysql_query("INSERT INTO `test`(`query`) VALUES ('Could not create socket')")); 
    $errorcode socket_last_error();
    $errormsg socket_strerror($errorcode); 
    $result socket_bind($socket$host$port) or die(mysql_query("INSERT INTO `test_gprs`(`query`) VALUES ('Could not bind to socket: ".$errormsg."')")); 
    Inserisco gli errori direttamente in db per tenerne traccia più facilmente.

    p.s. se qualcuno conosce un metodo più semplice/migliore per ricevere dai tramite socket...sono aperto a qualsiasi soluzione
    Grazie a tutti.

  2. #2
    Utente di HTML.it L'avatar di marco_c
    Registrato dal
    Jun 2004
    Messaggi
    1,047
    firewall?
    Gli uomini si dividono in due categorie: i geni e quelli che dicono di esserlo. Io sono un genio.

  3. #3
    Intanto grazie per la risposta.

    C'è qualche impostazione particolare che devo settare? Lo script viene lanciato direttamente sulla porta che mi interessa, per cui in teoria non dovrebbe non partire proprio se fosse attivo un firewall?

  4. #4
    Piccolo aggiornamento.

    Sono andato a sniffare cosa accade quando arrivano le richieste socket, e questo è ciò che Apache risponde 'Your browser sent a request that this server could not understand'.

    Inoltre Apache dice che la richiesta è arrivata alla porta 80, mentre è stata inviata sulla porta 35100. Cosa di cui sono certo perchè ho filtrato il traffico in arivo/uscita solo sulla porta 35100.

  5. #5
    Utente di HTML.it L'avatar di marco_c
    Registrato dal
    Jun 2004
    Messaggi
    1,047
    ma.. dall'altra parte c'è qualcuno effettivamente in ascolto sulla porta 35100 e che possa risponderti? questo qualcuno è corretto che sia apache o dovrebbe essere un altro server? (non ho idea di quale sia il tuo obiettivo).
    Se ti risponde l'apache del pc di destinazione allora vuol dire che il socket è stato aperto, solo mi sembra che la richiesta vada a finire ad apache che però non capisce che farne.
    Se fai un socket su porta 80 e provi a recuperare un file html funziona o no?
    Gli uomini si dividono in due categorie: i geni e quelli che dicono di esserlo. Io sono un genio.

  6. #6
    In sostanza quello che voglio fare è questo:

    Ho un client che autonomamente apre una connessione socket verso ip e porta specifica.
    A questo ip corrisponde il mio server, su cui è anche installato Apache in listen sulla porta 80 perchè vi gira un applicativo web.

    La porta utilizzata dal socket è la 35100, aperta da firewall. Apache non è in listen su questa porta (pensavo di dover mettere in listen, ma mi è stato detto che non dovevo).

    Ho uno script PHP che chiaramente fa parte dell'applicativo installato dentro Apache e raggiungibile dalla classica barra degli indirizzi. Lo script riconosce se la richiesta che arriva è una semplice connessione da browser o una richiesta socket, e si comporta in modo diverso a seconda dei casi.

    Visto che Apache non è in listen sulla porta 35100, per far confluire il traffico socket 35100 proprio sul mio script, ho inserito una regola nel Server tale per cui tutto il traffico che arriva sulla 35100, viene reindirizzato sul mio script.

    Per rispondere alla tua domanda, direi che si, alla fin della fiera è Apache che deve rispondere alla richiesta visto che lo script è scritto in PHP e 'gira' dentro Apache.


    p.s. grazie mille per l'aiuto.

  7. #7
    Utente di HTML.it L'avatar di Ranma2
    Registrato dal
    Mar 2003
    Messaggi
    2,647
    Ma come fa apache a credere che quella connessione sia rivolta a lui se non è in listen su quella porta?

    Per intenderci se tu da browser vai a http://ipmioserve:35100 deve risponderti, ma ti risponderà solo se sta ascoltando su quella porta.

    Ma hai due apache che devono dialogare? Io mica ho capito.

    Client A chiede a client B sulla porta 35100. Che tipo di regola hai messo perché il traffico viene reinderizzato?

  8. #8
    Si scusami, prima sul punto della 'regola' mi sono espresso male. La 'regola' altro non è che un virtualhost. Invece di avere il classico 'Listen iporta', utilizzo un virtualhost.

    Se digito iporta, apache mi risponde correttamente.


    Quello che voglio fare si può riassumere in due parole così:
    A (client) invia informazioni a B (server) tramite socket su porta specifica. B deve ricevere e archiviare i dati.
    Come riceve B? tramite uno script in PHP.


    Ho fatto alcuni test con telnet, e dentro il mio script PHP, laddove dovrebbe esserci la ricezione dei dati tramite socket, ho inserito semplicemente uno script che mi popola una tabella di database. Giusto per essere sicuro che lo script venga lanciato solo quando arrivano richieste socket a quella determinata porta. E funziona.
    Così dovrei esser sicuro che apache è in grado di ricevere richieste su quella porta.

    Credevo che il problema fosse nell'uso dei comandi socket per il PHP, ma il socket_create funziona e restituisce Success. Il problema sembra sia proprio nel bind

    Spero di essermi espresso meglio questa volta

  9. #9
    Se può esser utile, facendo una prova tramite telnet, ottengo '#!/usr/bin/php ...q

    1' come risposta prima che si chiuda la connessione.

  10. #10

    Vicino alla soluzione...

    Dopo aver fatto prove su prove, ho 'intravisto' il problema.

    Al posto dell'IP pubblico del server, inserisco 127.0.0.1 con la porta corretta...e tutto funziona correttamente. Chiaramente provando da shell interna.

    A questo punto direi che il problema è che il server, per qualche motivo, mi blocca il bind sull'ip se accedo dall'esterno.

    Resta solo da capire perchè questo accade.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.