Foros del Web » Programando para Internet » PHP »

Un servidor UDP con sockets que envie y reciba datos

Estas en el tema de Un servidor UDP con sockets que envie y reciba datos en el foro de PHP en Foros del Web. Tengo que hacer un servidor udp que envie y reciba informacion ("comandos") y por alguna razon no lo puede enviar, estoy tratando de probarlo en ...
  #1 (permalink)  
Antiguo 30/12/2009, 13:12
Avatar de el_gustavo  
Fecha de Ingreso: mayo-2009
Mensajes: 117
Antigüedad: 14 años, 10 meses
Puntos: 0
Tengo que hacer un servidor udp que envie y reciba informacion ("comandos") y por alguna razon no lo puede enviar, estoy tratando de probarlo en la red local pero tampoco funciona.
Ahi paso el codigo.
Código:
if (!extension_loaded('sockets')) {
    die('SKIP The sockets extension is not loaded.');
}

print_log("Arranca el script");
set_time_limit (0);
// Set the ip and port we will listen on
$address_host = SERVER_HOST;
$port = SERVER_PORT;
$max_clients = SERVER_MAX_CLIENT;/*no sirve*/
error_reporting(E_ALL | E_STRICT);

// Array that will hold client information
//$clients = Array();

// Create a TCP Stream socket
$sock = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);/*abrir el socket*/

if(!$sock){
    print_log("Error al crear el socket".socket_strerror(socket_last_error()));
    exit(1);
}
print_log("Se creo el socket correctamente");

// Bind the socket to an address/port
socket_bind($sock, $address_host, $port) or die('Could not bind to address');
print_log("Se asocio el socket con el puerto y direccion correctamente");
print_log($address_host.":".$port);

$string = "MENSAJE";
$envio = socket_sendto($sock,$string,strlen($string),0,"192.168.0.107",$port);
        if(!$envio){
            print_log("Error envio de SETTIME   ".socket_strerror(socket_last_error()));
            exit(1);
        }
        print_log("Envio:".$string);
// Start listening for connections
/*socket_listen($sock);*/
$count_session = 0;
// Loop continuously
 // end while
// Close the master sockets
while(true){
    $mensaje_recibido ="";
    $count_session++;
    $from="";
    $recibo = false;
    $port = 0;
    //print_log ("INIT SESION ".$count_session." ****");
    print_log ("INIT SESION ".$count_session." ****");
    $recibo = socket_recvfrom($sock,$mensaje_recibido,100,0,$from,$port);
    if(!$recibo){
        /*que salga que salga si hay error, despues lo arrancameos*/
        print_log("Error recibo de datos    ".socket_strerror(socket_last_error()));
        exit(1);
    }else{
        print_log("Sesion:".$count_session." -Leyendo mensaje ---");
        $input = trim($mensaje_recibido);
        print_log("Sesion:".$count_session." -Procesando mensaje ---");
       $output= process_request($sock,$input,$recibo,$from,$port);
       $envio = socket_sendto($sock,$output,strlen($output),0,"192.168.0.107",$port);
        if(!$envio){
            print_log("Error envio de DATOS   ".socket_strerror(socket_last_error()));
            exit(1);
        }
    }


    
    
    /*Qizas debamos de dejar de imprimir, por ahora que imprima*/
}
socket_close($sock);
print_log("Cerramos Socket y salimos del programa");
Originalmente fue para tcp, no se fijen en los comenatarios.
El problema es que en ningun momento me dice error pero se "tilda", es posible que haya algun error de sintaxis pero eso seria porque "copie" mal el codigo,
El hecho que me importa es que no envia ni recibe datos, llega hasta donde dice print_log ("INIT SESION ".$count_session." ****") pasando antes por send; y de ahi no avanza, no se como solucionarlo (la verdad es la primera vez que programo en socket).
Los puertos son los mismos tanto en remoto como en local.
Si alguien me ayuda estare muy agradecido, gracias por su colaboracion.

Agrege esta funcion
Código:
function comprobar_puerto($server,$port)
{
   # // Dominio a comprobar

 $b = false;
 $fp = fsockopen($server,$port,$errno,$errstr,10);
    if($fp)
    {
    fclose($fp);
    $b = true;
    }
  return $b;
}
y me dice este warning:
Warning: fsockopen() [function.fsockopen]: unable to connect to 127.0.0.1:19810 (Se produjo un error durante el intento de conexión ya que la parte conectada no respondió adecuadamente tras un periodo de tiempo, o bien se produjo un error en la conexión establecida ya que el host conectado no ha podido responder. ) in

Deberia aceptar el puerto?? o sea, esa comprobacion deberia ser exitosa? hace falta que sea exitosa?

Última edición por GatorV; 31/12/2009 a las 16:43
  #2 (permalink)  
Antiguo 30/12/2009, 23:39
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Un servidor UDP con sockets que envie y reciba datos

una pregunta... ¿lo estas ejecutando como si fuera un script web, curl, o como??
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #3 (permalink)  
Antiguo 31/12/2009, 05:24
Avatar de el_gustavo  
Fecha de Ingreso: mayo-2009
Mensajes: 117
Antigüedad: 14 años, 10 meses
Puntos: 0
Lo estoy ejecutando como script web "normal", el servidor usa windows.

La funcion para comprobar el puerto no sirve para nada, se la saque, inicie el script e hice netstat - a en la "consola" de windows y me aparecio el dichoso puerto.

Una pregunta a todo esto, los dos programas, tanto cliente como servidor, para que se comuniquen deben si o si haber sido programadas con sockets?

Última edición por GatorV; 31/12/2009 a las 16:44
  #4 (permalink)  
Antiguo 31/12/2009, 09:49
 
Fecha de Ingreso: abril-2006
Mensajes: 1.128
Antigüedad: 18 años
Puntos: 33
Respuesta: Un servidor UDP con sockets que envie y reciba datos

el_gustavo:

El codigo no debiera correr hasta donde tu dices, ya que
debe existir un socket_listen(....) que lo hace detenerse
y esperar por conexiones externas.
Los servidores funcionan en base a protocolos y tanto
el protocolo UDP y TCP/IP son totalmente diferentes.
En todo servidor se espera que se diseñe o exista un cliente
codigo que pueda comunicarse con el servidor.
Ejemplo: SMTP (Servidor y cliente) FTP (Servidor y cliente).
DNS(Servidor y cliente); este ultimo funciona via UDP.
Resumen:
1.- Familiarizate con los protocolos, especialmente UDP.
2.- No utilices puertos como el 80 sino que arriba de 1500
(Ejemplo 8000, etc).
3.- Familiarizate con un tipico intercambio de comunicacion
entre un servidor y un cliente; para ello el manual PHP ofrece
ejemplos altamente confiables y enriquecedores.
Tengo entendido que hay un ejemplo de servidor TCP/IP
con su cliente y hay otro que utiliza telnet para comunicarse.
4.- Resumen: El servidor entra al bucle activado por el cliente y
se espera que la comunicacion sea un envio, una recepcion, otro
envio otra recepcion, etc osea que si hay un envio por parte
del servidor y el cliente NO fue diseñado para recibirlo entonces
se trunca la comunicacion y tira error. No se si me explico claramente
pero es un mundo muy interesante y complejo.

Saludos
Franco
  #5 (permalink)  
Antiguo 31/12/2009, 10:02
Avatar de el_gustavo  
Fecha de Ingreso: mayo-2009
Mensajes: 117
Antigüedad: 14 años, 10 meses
Puntos: 0
Respuesta: Un servidor UDP con sockets que envie y reciba datos

Entiendo lo que decis respecto a listen pero no funciona con el protocolo UDP, para crear un servidor UDP es muy pocos los ejemplos en php, y he seguido los que estan escrito en C.
Me acabo de crear un cliente y pude ver que si funciona este codigo, algo que tendria que haber hecho antes, SI, RECIBO MENSAJE =) aunque ahora el problema es otro, me salta con este error =(

FIN SESION 1 ****
INIT SESION 2 ****

Warning: socket_recvfrom() [function.socket-recvfrom]: unable to recvfrom [0]: La operación se ha completado correctamente. in E:\wamp\www\raptor\actions\do_server.php on line 91
Error recibo de datos La operación se ha completado correctamente.
y sale del programa.
  #6 (permalink)  
Antiguo 31/12/2009, 20:07
 
Fecha de Ingreso: abril-2006
Mensajes: 1.128
Antigüedad: 18 años
Puntos: 33
Respuesta: Un servidor UDP con sockets que envie y reciba datos

el_gustavo:

Generalmente hablando los servidores UDP se utilizan para
enviar una solicitud de algo (Ej: dns de un host) y el servidor
de inmediato envia una respuesta que debiera ser leida
por el cliente.
Talvez este enlace te puede ayudar ->
http://www.codeproject.com/KB/IP/udptime.aspx
O este enlace ->
http://www.c-sharpcorner.com/UploadF...ClientPL2.aspx
creo esta en C.
Y para php ->
http://php.net/manual/en/function.st...ket-server.php
Tambien se utilizan para mayor rapides en el envio de un
audio o un video.

El ejemplo que tiene el manual de php lo puedes modificar
para UDP y una sola peticion.

Saludos
Franco

Última edición por franco190453; 01/01/2010 a las 09:41
  #7 (permalink)  
Antiguo 03/01/2010, 21:36
Avatar de el_gustavo  
Fecha de Ingreso: mayo-2009
Mensajes: 117
Antigüedad: 14 años, 10 meses
Puntos: 0
Exactamente como vos decis, el servidor queda "escuchando" permamenentemente, por eso el bucle infinito. La idea es que el cliente envia mensajes (no se si permanentemente pero seguido), yo creo el servidor para que lea, interprete y responda a los mensajes recibidos, de eso se trata el trabajo.
Yo me encargo del servidor, el cliente no se. Ahora la pregunta seria porque me sale ese mensaje en la segunda vuelta del ciclo:
Warning: socket_recvfrom() [function.socket-recvfrom]: unable to recvfrom [0]: La operación se ha completado correctamente. in E:\wamp\www\raptor\actions\do_server.php on line 91.
Sera alguna variable que tengo que destruir??

Bueno, el problema estaria casi solucionado, al final el ultimo problema lo solucione usando las operaciones de sockets dentro del bucle (No me gusta para nada esta solucion, si alguien me aconseja otra soy todo ojos =) )
Ahora, y con esto cierro el tema, me falta hacerlo funcionar via remota (por internet).
Me explico mejor, quiero subir el cliente al hosting y desde ahi enviarlo hacia donde estoy yo y que funcione tan bien como localmente.
En la linea del cliente donde tengo la funcion
socket_sendto($sock,$mensaje,strlen($mensaje),0,$s erver,19810);
me sale este error->
Warning: socket_sendto() [function.socket-sendto]: unable to write to socket [22]: Invalid argument in /Path/raptor/actions/du_cliente_pru.php on line 24
el mal argumento es la variable $server,
Si $server = "localhost" funciona (en realidad no, pero no sale error).
Si $server = ip , donde ip es la ip publica de donde yo estoy trabajando me sale ese warning y no funciona.
Como tendria que escribir esta ip para que si funcione y no me salga ese warning?
Ahi seria todo, gracias a los que leyeron y escribieron.

Última edición por GatorV; 04/01/2010 a las 10:43
  #8 (permalink)  
Antiguo 04/01/2010, 08:15
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Un servidor UDP con sockets que envie y reciba datos

NOTA que el principal "problema", es que ejecutes un listener vía web

o piensas tener el navegador abierto todo el tiempo??

este tipo de aplicaciones, se deben implementar bajo otro tipo de circunstancias... esto quiere decir, que por ejemplo, si usamos *nix puedes crear un servicio que ejecute dicho listener

yo he visto algo muy parecido, incluso, era un servidor de SMTP hecho con sockets en PHP!!

si, para ello se necesita un ciclo casi infinito... pero definitivamente este no se ejecutaba en web, si no que venia en su propio ejecutable EXE...
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #9 (permalink)  
Antiguo 04/01/2010, 08:38
Avatar de el_gustavo  
Fecha de Ingreso: mayo-2009
Mensajes: 117
Antigüedad: 14 años, 10 meses
Puntos: 0
Respuesta: Un servidor UDP con sockets que envie y reciba datos

Estoy de acuerdo patetrueke con respecto a que no debe ser via web asi funcionar desde un navegador sino algo bien hecho en C y asi con varias cosas mas pero bueno, fue en php.

Si te entendi lo de listener, listener unicamente para TCP.
  #10 (permalink)  
Antiguo 15/04/2011, 10:14
 
Fecha de Ingreso: abril-2011
Mensajes: 1
Antigüedad: 13 años
Puntos: 0
Respuesta: Un servidor UDP con sockets que envie y reciba datos

Estoy realizando algo parecido para una comunicación que se ejecutará del lado de nuestro host de nuestras páginas web.

@el_gustavo contigo es la tercera vez que leo que un port listener no se recomienda hacerlo en php y que es mejor crear un binario que sea quien se encargue de todo eso. Pero nadie ha explicado bien la razón. ¿Podrías explicarme un poco sobre ese detalle?

Por ahora en nuestro caso, como no sabemos si es posible ejecutar un binario (ni siquiera si tendrá que ser uno de windows o uno de *nix, por nuestro host), lo hemos hecho en php.

Si es por que como se trata de bucles infinitos y éstos gastan recursos, me parece lo mismo en un exe programado en C, a menos que se usen interrupciones o eventos.

Dónde podría saber los detalles, que debería de saber, sobre éste tipo de listeners? que serán ejecutados en un host externo?
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 20:23.