Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Firefox extension and socket

83 views
Skip to first unread message

theZio

unread,
Sep 23, 2009, 6:46:36 AM9/23/09
to
Hi all,
I'm having a problem with a simple Firefox extension that should
comunicate with a php script in a local network. They only should
exchange a simple message.

This is the JavaScript code of the extension:
------------------------------------------------------------------------------------------
function getPageContent()
{
var listener = {
finished : function(data){
alert("Inizio dati letti\n"+data+"\nFine dati letti");
}
}

readAllFromSocket("192.168.1.2",9999,"Prova messaggio da
Firefox",listener);
}

function readAllFromSocket(host,port,outputData,listener)
{
try {
var transportService = Components.classes["@mozilla.org/network/
socket-transport-service;1"].getService
(Components.interfaces.nsISocketTransportService);
var transport = transportService.createTransport(null,
0,host,port,null);
if(transport) alert("Creata la socket");
else alert("Errore creazione socket");

var outstream = transport.openOutputStream(0,0,0);
outstream.write(outputData,outputData.length);
alert("Creato l'output stream e inviato il messaggio");

var stream = transport.openInputStream(0,0,0);
var instream = Components.classes["@mozilla.org/
scriptableinputstream;1"].createInstance
(Components.interfaces.nsIScriptableInputStream);
instream.init(stream);
alert("Creato l'input stream");

var dataListener = {
data : "",
onStartRequest: function(request, context){},
onStopRequest: function(request, context, status) {
instream.close();
outstream.close();
listener.finished(this.data);
},
onDataAvailable: function(request, context, inputStream, offset,
count){
this.data += instream.read(count);
alert("Ho aggiunto dati al buffer");
},
};

var pump = Components.classes["@mozilla.org/network/input-stream-
pump;1"].createInstance(Components.interfaces.nsIInputStreamPump);
pump.init(stream, -1, -1, 0, 0, false);
while(true) pump.asyncRead(dataListener,null);
} catch (ex){
throw ex;
}
return null;
}
------------------------------------------------------------------------------------------

And this is the php code:
------------------------------------------------------------------------------------------
<?php
$fp=fsockopen("192.168.1.5", 9999, $errno, $errstr, 100);

if (!$fp) {
echo "$errstr ($errno)<br />\n";
}
else {
fwrite($fp, "Prova messaggio da PHP");
while (!feof($fp)) {
echo fgets($fp, 128);
}
fclose($fp);
}
?>
------------------------------------------------------------------------------------------

I hope that someone can help me.
Thanks,
Antonello

Shane

unread,
Sep 23, 2009, 12:21:30 PM9/23/09
to
This might not be helpful, but why not just use "ajax" and create an
XMLHttpRequest object?

Antonello

unread,
Sep 24, 2009, 5:28:08 AM9/24/09
to

My purpose is just to open a socket and exchanging data between a
server and a Firefox extension, in this case I'm trying with a php
script. The problem is that the extension does not seem to get
anything.

0x000000

unread,
Sep 24, 2009, 9:28:34 AM9/24/09
to
Here's a working snippet from my extension, this returns the header of
a particular port/service, e.g. open, closed. It basically is a very
simple port-scanner. Maybe you find it useful. But what I think what
you want is for the extension to listen on a port, right. That's
sounds a bit weird. Anyway, the below should work to get data from
your service that listens on a particular port.


-------------------------8<---------------------------
tcpConnect('http://www.google.com',80,"HEAD / HTTP/1.0\n\n");
------------------------->8---------------------------


-------------------------8<---------------------------

function tcpConnect(uri,port,header){
var listener = {
finished : function(packet){
if(packet) {
portstate = '';
packet.split("\r\n");
packetset = packet[8]+packet[9]+packet[10]+packet[11];
portstate = 'open';
} else { portstate = 'closed'; }
if(portstate == 'closed') {} else {
document.getElementById('httpresult').value =
document.getElementById('httpresult').value +="\r\n" + port + "/
tcp " + portstate;
}
},
};
readSocket(uri,port,header,listener);
}

function readSocket(host,port,outputData,listener) {


var transportService = Components.classes["@mozilla.org/network/
socket-transport-service;1"].getService
(Components.interfaces.nsISocketTransportService);

var transport = transportService.createTransport(["starttls"],
0,host,port,null);


var outstream = transport.openOutputStream(0,0,0);
outstream.write(outputData,outputData.length);

var stream = transport.openInputStream(0,0,0);
var instream = Components.classes["@mozilla.org/
scriptableinputstream;1"].createInstance
(Components.interfaces.nsIScriptableInputStream);
instream.init(stream);

var dataListener = {
data : "",
onStartRequest: function(request, context){},
onStopRequest: function(request, context, status){
instream.close();
outstream.close();

return listener.finished(this.data);


},
onDataAvailable: function(request, context, inputStream, offset,
count){
this.data += instream.read(count);

},
};
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);

return null;
}

------------------------->8---------------------------

Antonello

unread,
Oct 7, 2009, 6:20:42 AM10/7/09
to
I changed the PHP socket function and now when I execute the extension
on the server where there is the PHP
script, it works fine.
When I try to execute it on different machine (in the same LAN) the
PHP script gives to me this error:

"Warning: socket_bind() [function.socket-bind]: unable to bind address
[99]: Cannot assign requested address in /var/www/socket_server.php on
line 21"

This is the new extension javascript code:
-------------------------------------------------------------------------------
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;
}

-------------------------------------------------------------------------------

And this is the new PHP code:
-------------------------------------------------------------------------------
$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");
?>
-------------------------------------------------------------------------------

0 new messages