Newsgroup: it.comp.www.php
Titolo: Estensione Firefox e PHP socket

Ciao a tutti,
sto avendo un problema con una semplice estensione Firefox che
dovrebbe comunicare con uno script PHP in una rete locale attraverso
una semplice socket.
Quando eseguo l'estensione sulla stessa macchina dove è presente il
servere e lo script PHP funziona perfettamente.
Quando provo ad esequirla in una macchina diversa (in LAN) lo script
PHP mi restituisce questo errore:
"Warning: socket_bind() [function.socket-bind]: unable to bind address
[99]: Cannot assign requested address in /var/www/socket_server.php on
line 21"
Questo è il codice Javascript dell'estensione:
-------------------------------------------------------------------------------
function main()
{
  var host = "192.168.1.2";
  var port = 9999;
  var delay = new Array();
  var lung_pkt = 288;
  var num_pkg = 100;
  var num_str = 12;
  var nPkg = 0;
  try {
    window.open("http://"+host+"/
socket_server.php","Socket","width=500,height=400");
    var transportService = Components.classes["@
mozilla.org/network/
socket-transport-service;1"].getService
(Components.interfaces.nsISocketTransportService);
    var transport = transportService.createTransport(null,
0,host,port,null);
    var stream = transport.openInputStream(0,0,0);
    var instream = Components.classes["@
mozilla.org/
scriptableinputstream;1"].createInstance
(Components.interfaces.nsIScriptableInputStream);
    instream.init(stream);
    var dataListener = {
      onStartRequest: function(request, context){},
      onStopRequest: function(request, context, status) {
        instream.close();
        outstream.close();
        var stampa="";
        var i=0;
        for(i=0; i<delay.length; i++) {
          stampa+=(delay[i].toString()+"\n");
        }
        alert(stampa);
      },
      onDataAvailable: function(request, context, inputStream, offset,
count){
        var ora = new Date();
        var partenza = parseInt(instream.read(lung_pkt).substring
(0,13));
        var arrivo = ora.getTime();
        var d = arrivo - partenza;
        delay.push(d);
      },
    };
    var pump = Components.classes["@
mozilla.org/network/input-stream-
pump;1"].createInstance(Components.interfaces.nsIInputStreamPump);
    pump.init(stream, -1, -1, 0, 0, false);
    pump.asyncRead(dataListener,null);
  } catch (ex){
    alert(ex);
  }
  return null;
}
-------------------------------------------------------------------------------
E questo è il codice PHP:
-------------------------------------------------------------------------------
$host = "192.168.1.5";
$port = 9999;
$lung_pkg = 288; //lunghezza del pacchetto, bytes
$periodo = 100;  //periodo di trasmissione, usec
$delta = 10000;  //pausa tra stream, usec
$num_pkg = 100;  //numero di pacchetti nello stream
$num_str= 12;    //numero di stream nel fleet
//numero di millisecondi trascorsi dalla UNIX Epoque
function timestamp() {
  list($usec, $sec) = explode(" ", microtime());
  $usec = substr($usec,2,3);
  $sec = $sec*1000;
  return $sec+$usec;
}
$socket = socket_create(AF_INET, SOCK_STREAM, 0) or die
(socket_strerror
(socket_last_error($socket)));
echo(date("H:i:s")." Socket creata<br>");
socket_bind($socket, $host, $port) or die(socket_strerror
(socket_last_error($socket)));
echo(date("H:i:s")." Socket connessa<br>");
socket_listen($socket) or die(socket_strerror(socket_last_error
($socket)));
echo(date("H:i:s")." Socket listener creato<br>");
$client = socket_accept($socket) or die(socket_strerror
(socket_last_error($client)));
echo(date("H:i:s")." Connessione accettata<br>");
//invio del fleet
for ($n=0; $n<$num_str; $n++) {
  //invio dello stream
  for ($k=0; $k<$num_pkg; $k++) {
    $output = timestamp();
    while(strlen($output)<$lung_pkg) $output.="A";
    socket_write($client, $output, $lung_pkg) or die(socket_strerror
(socket_last_error($client)));
    usleep($periodo);
  }
  echo(date("H:i:s")." Stream $n inviato<br>");
  usleep($delta);
}
socket_close($client);
socket_close($socket);
echo(date("H:i:s")." Fine");
?>
-------------------------------------------------------------------------------
Spero che qualcuno mi possa aiutare.
Grazie,
Antonello

 $host = "192.168.1.5";
Sei sicuro che questo IP sia quello del server su cui stai facendo girare 
PHP?
Bye.


192.168.1.5 è l'ip del client dove si trova l'estensione Firefox,
mentre 192.168.1.2 è quello del server dove gira lo script PHP. C'è
qualcosa di sbagliato?

 sbagliato?
Non ho tantissima esperienza di socket programming, ma la socket_bind (se 
non ricordo male) serve a fare il bind su una porta (e un IP) locale, 
quando usi socket_listen, quindi sul server con PHP non dovresti avere
socket_bind($socket, 192.168.1.5, 9999)
ma
socket_bind($socket, 192.168.1.2, 9999)
La parte in Javascript penso usi una libreria socket non standard, quindi 
presumo si colleghi come client al server che "apri" in PHP, ma non 
capendone il codice non posso esserne sicuro.
Bye.


Hai perfettamente ragione, il problema era proprio l'ip usato nella
socket_bind.
Grazie!