Foros del Web » Programando para Internet » PHP »

Problema con fsockopen()

Estas en el tema de Problema con fsockopen() en el foro de PHP en Foros del Web. Hola a todos, estoy intentando usar una clase de php que te devuelve la lista de contactos de un usuario de MSN Messenger pero tengo ...
  #1 (permalink)  
Antiguo 08/02/2006, 11:28
 
Fecha de Ingreso: septiembre-2005
Mensajes: 94
Antigüedad: 12 años, 2 meses
Puntos: 0
Problema con fsockopen()

Hola a todos, estoy intentando usar una clase de php que te devuelve la lista de contactos de un usuario de MSN Messenger pero tengo siempre el mismo fallo:

Cuando el código llega a fsockopen
Código PHP:
$this->socket fsockopen($server,$port,$errno$errstr,20); 
el navegador me devuelve el mismo fallo:

Código:
Warning: fsockopen(): unable to connect to messenger.hotmail.com:1863 in /home/content/r/a/u/raul123/html/msngrab/msnlistgrab.php on line 125
Connection timed out (110)
He comprobado que el servidor sea correcto (que lo es, con el programa WLMServers), el puerto me imagino que también es correcto pues lo he visto en todas las webs que he visitado y el servidor donde tengo alojada la web tiene instalada la librería CURL. Ya no sé dónde mirar. Si hay alguien que me pueda ayudar se lo agradecería.

Muchas gracias a todos, un saludo!
  #2 (permalink)  
Antiguo 08/02/2006, 11:29
 
Fecha de Ingreso: septiembre-2005
Mensajes: 94
Antigüedad: 12 años, 2 meses
Puntos: 0
Por cierto, eso de
BEGIN__VBULLETIN__CODE__SNIPPET

se ha colado, no sé como.No tiene nada que ver con lo que he puesto.
  #3 (permalink)  
Antiguo 08/02/2006, 11:48
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
Si dices que usas "tal código (classe)" lo ideal es que al menos dejes referencia de donde ver su código original/manuales si los tiene ..

El problema que tienes concreto habla de un "time out" .. Parece que en el tiempo que se le dió a esa función ("20" segundos .. el último parámetro) no consiguió conectarse. Tal vez podrías probar a darle más tiempo .. Y lo mejor sería contactar con el autor de ese código a ver que comentario te puede hacer al respecto .. o ver si tiene algunas FAQ's ? ...

Un saludo,
  #4 (permalink)  
Antiguo 09/02/2006, 07:24
 
Fecha de Ingreso: septiembre-2005
Mensajes: 94
Antigüedad: 12 años, 2 meses
Puntos: 0
La verdad que el código viene bastante mal documentado, pero ya sé por dónde anda el error:

El puerto al que pretendo conectar (1863) no está abierto en mi hosting, ya me lo han dicho.
Voy a dejar aquí la clase completa para quien la quiera usar:
MSN List Grabber:

msnlistgrab.php

Código PHP:
<?php
error_reporting
(E_ALL); 
    
/****************************************************************************************
    *                                   MSN CONTACT LIST GRAB CLASS                            *
    *             (c)2005 Ghulam Mustafa, [email protected], Pakistan                    *
    *                               ver 1.0 (04.02.2005)                                    *
    ****************************************************************************************/
    
class msnlistgrab {
    var 
$user='Nombre_usuario';
    var 
$password='contraseña_aquí' ;
    var 
$server ='messenger.hotmail.com';
    var 
$port 1863;
    var 
$version 'MSNMSGR 6.2';
    var 
$buffer;
    var 
$socket;
    var 
$startcom;
    var 
$error="";
    function 
msnlistgrab() {

    }
    function 
GetRecords(){
        if (
$this->msn_connect($this->server$this->port))
        {
            return 
$this->res;
        }
        else
        {
            return 
$this->error;
        }
    }

    function 
getData() {
        
$this->buffer="";
        while (!
feof($this->socket)) {
            
$this->buffer .= fread($this->socket,1024);
            if (
preg_match("/\r/",$this->buffer)) {
                break;
            }
        }
        
$this->checkData($this->buffer);
    }
    function 
getData2() {;
    
//$container="";
    
$buffer="";
    while (!
feof($this->socket)) {
        if (
$this->i>1) {
            if (
$this->i==$this->total) {
                
fclose($this->socket);
                
$this->res;
                break;
            }
        }
        
$buffer fread($this->socket,8192);
        
$this->check_buffer($buffer);
    }
    }

    function 
check_buffer($buffer) {
        if (
eregi("^SYN",$buffer)) {
            list(
$junk$junk$junk$this->total) = explode(" "$buffer);
            
//    echo '<h1>Number of Records: '.$this->total.'</h1>';
        
}
        
$this->grabber($buffer);
    }

    function 
grabber ($buffer)
    {
        
$g preg_split("/[\n]+/"$buffer);
        for (
$n=0;$n<count($g);$n++) {
            if (
strstr($g[$n], 'LST')) {
                
$this->i++;
                
//echo $i.',';
                
list($junk$email) = explode(" "$g[$n]);
                
$this->res[] = $email;
            }
        }

    }

    function 
checkData($buffer) {
        
//              echo $buffer;
        
if (preg_match("/lc\=(.+?)/Ui",$buffer,$matches)) {

            
$this->challenge "lc=" $matches[1];

        }

        if (
preg_match("/(XFR 3 NS )([0-9\.\:]+?) (.*) ([0-9\.\:]+?)/is",$buffer,$matches)) {
            
$split explode(":",$matches[2]);
            
$this->startcom 1;
            
$this->msn_connect($split[0],$split[1]);

        }

        if (
preg_match("/tpf\=([a-zA-Z0-9]+?)/Ui",$buffer,$matches)) {

            
$this->nexus_connect($matches[1]);
        }
        
/*
        $split = explode("\n",$buffer);

        for ($i=0;$i<count($split);$i++) {

        $detail = explode(" ",$split[$i]);

        if ($detail[0] == "LST") {
        //echo "<div  OnMouseOver=\"style.cursor='hand';showTooltip('show','$detail[1]-$detail[3]')\" OnMouseMove=\"followTooltip('show')\" OnMouseOut=\"showTooltip('hide')\">" . urldecode($detail[2]) . "</div>";
        }
        }
        */



    
}

    function 
msn_connect($server$port) {

        if (IsSet(
$this->socket)) {
            
fclose($this->socket);
        }
        echo 
$this->socket;
        echo 
"intentamos conectar";
        
$this->socket fsockopen($server,$port,$errno$errstr,20);       
        
//stream_set_timeout($GLOBALS["socket"], 20000);
        
if (!$this->socket) {
           echo 
"$errstr ($errno)<br />\n";
        }
        echo 
"conectado";
                
        if (!
$this->socket) {
            return 
"Could not connect";
        } else {
            
$this->startcom++;
            
$this->send_command("VER " $this->startcom " MSNP8 CVR0",1);
            
$this->send_command("CVR " $this->startcom " 0x0409 win 4.10 i386 "$this->version ." MSMSGS " $this->user "@hotmail.com",1);
            
$this->send_command("USR " $this->startcom " TWN I " $this->user "@hotmail.com",1);

        }
    }

    function 
send_command($command)
    {
        
$this->startcom++;
        
//      echo "<font color=blue> >> $command<br>";
        
fwrite($this->socket,$command "\r\n");
        
$this->getData();


    }


    function 
nexus_connect($tpf)
    {

        
$arr[] = "GET /rdr/pprdr.asp HTTP/1.0\r\n\r\n";

        
$curl curl_init();
        
curl_setopt($curlCURLOPT_URL"https://nexus.passport.com:443/rdr/pprdr.asp");
        
curl_setopt($curlCURLOPT_RETURNTRANSFER1);
        
curl_setopt($curlCURLOPT_VERBOSE0);
        
curl_setopt($curlCURLOPT_HEADER,1);
        
curl_setopt($curlCURLOPT_HTTPHEADER$arr);
        
curl_setopt($curlCURLOPT_SSL_VERIFYPEERFALSE);
        
$data curl_exec($curl);
        
curl_close($curl);
        
preg_match("/DALogin=(.+?),/",$data,$matches);

        
//$data = str_replace("\n","<br>",$data);
        //              echo $data;

        //echo "<br><br>";

        
$split explode("/",$matches[1]);

        
$headers[0] = "GET /$split[1] HTTP/1.1\r\n";
        
$headers[1] = "Authorization: Passport1.4 OrgVerb=GET,OrgURL=http%3A%2F%2Fmessenger%2Emsn%2Ecom,sign-in=" $this->user "%40hotmail.com,pwd=" $this->password ", " trim($this->challenge) . "\r\n";

        
$curl curl_init();
        
curl_setopt($curlCURLOPT_URL"https://" $split[0] . ":443/"$split[1]);
        
curl_setopt($curlCURLOPT_RETURNTRANSFER1);
        
curl_setopt($curlCURLOPT_VERBOSE0);
        
curl_setopt($curl,CURLOPT_FOLLOWLOCATION,1);
        
curl_setopt($curlCURLOPT_HTTPHEADER$headers);
        
curl_setopt($curlCURLOPT_HEADER,1);
        
curl_setopt($curlCURLOPT_SSL_VERIFYPEERFALSE);

        
$data curl_exec($curl);

        
//$data = str_replace("\n","<br>\n",$data);
        //              echo $data;

        
curl_close($curl);

        
//echo "</font>";

        
preg_match("/t=(.+?)'/",$data,$matches);
        
$this->send_command("USR " $this->startcom " TWN S t=" trim($matches[1]) . "",2);
        
$this->send_command("SYN " $this->startcom " 0",2);
        
$this->getData2();



    }

}
//end of the file
?>
example.php

Código PHP:
<?php
include('msnlistgrab.php');
$gm = new msnlistgrab();
$gm->GetRecords();
foreach (
$gm->res as $val)
{
    echo 
$val .'<BR>';
}
echo 
'<hr>'.$gm->total;
?>
  #5 (permalink)  
Antiguo 10/02/2006, 06:50
 
Fecha de Ingreso: septiembre-2005
Mensajes: 94
Antigüedad: 12 años, 2 meses
Puntos: 0
Hola a todos,
Pretendo establecer una conexión con el servidor de messenger.hotmail.com de esta manera:


$server = 'messenger.hotmail.com';
$port='1863'
$this->socket = fsockopen($server,$port,$errno, $errstr,20);

Pero cuando intento conectar me da fallo de que no se pudo conectar.
He contactado con el servicio técnico de mi hosting y me han dicho que no tengo acceso al puerto 1863, sino que tengo que hacerlo a través de un proxy. Esto es exactamente lo que me dijeron

Cita:
We recently enabled outgoing http and https connections for our web hosting customers. These connections will take place via a proxy server, which will be completely transparent for customers making only http (port 80) connections. Applications that need to make https connections (port 443) will need to be made “proxy aware”. This will require additional coding to varying degrees, depending on the application. These customers will need to know the ip address and port of the proxy server in order to correctly modify their code. The ip of the proxy server is 64.202.165.130 and connections will be made on port 3128.
¿Cómo se puede establecer una conexión con el servidor que quiero , al puerto 1863?
  #6 (permalink)  
Antiguo 10/02/2006, 07:15
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
No sé si la classe que usas tiene capacidades de conectarse a traves de un proxy (parece que no?).

No sabría en este momento (no es mi fuerte la programación de "sockets") que deberías modificar para "pasar por un proxy" tu conexión .. pero en principio te puedo mencionar algunos ejemplos de conexiones en general que tienene esa opción (como para que estudies el código y veas si podrías adaptarlo a que tienes .. modificando los métodos que correspondan de esa classe):

http://lwest.free.fr/doc/php/lib/ind...client&lang=en


Un saludo,
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 17:11.