Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] PHP OO Sockets

Estas en el tema de Sockets en el foro de PHP en Foros del Web. Buenas tardes, ayudenme con un problema que tengo el cual se los expongo: Tengo un socket client de lado de php, este socket funciona bien, ...
  #1 (permalink)  
Antiguo 19/09/2014, 14:03
 
Fecha de Ingreso: septiembre-2014
Mensajes: 2
Antigüedad: 9 años, 7 meses
Puntos: 1
Sockets

Buenas tardes, ayudenme con un problema que tengo el cual se los expongo:
Tengo un socket client de lado de php, este socket funciona bien, envia y recibe datos normalmente, el problema esta en el timeout que se le setea al socket. Cuando mi fuente php esta en un equipo windows el socket_recv funciona con normalidad, al pasar este fuente a cualquier equipo con linux este espera todo el timeout que s establece en la config. Este s mi codigo:

$response = '';
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket !== FALSE) {
socket_set_option($socket, SOL_SOCKET, SO_RCVTIMEO, array("sec" => 20, "usec" => 0));
$result = socket_connect($socket, IP_SOCKET_EASYLOAD, PORT_SOCKET_EASYLOAD);
if ($result !== FALSE) {
$result = socket_write($socket, "ACTION=TEST" . "\r\n");
echo date("Y-m-d H:i:s"),"<br/>";
socket_recv($socket, $response, 1028, MSG_WAITALL);
echo $response."--".date("Y-m-d H:i:s");
}
}

Cuando ejecuto ese codigo en un windows el programa recibe la respuesta en aproximademente 1 o 2 segundos.

Cuando ejecuto ese mismo codigo en un linux el programa a pesar de haber recibido la respuesta en el mismo tiempo (lo se porque el server socket ya envio la respuesta) este espera los 20 segundos del timeout para hacer el echo; el timeout se lo setea en esta linea:

socket_set_option($socket, SOL_SOCKET, SO_RCVTIMEO, array("sec" => 20, "usec" => 0));

Y si quito esta linea del codigo, en window si ejecuta con normalidad, pero en linux se quedo inhibido, es decir queda en una espera infinita ya que si no se define esta funciona por default el timeout es 0 que quiere decir espera infinita.

Por favor si alguien me ayuda con este problema porque realmente me tiene desconcertado este asunto, ya googlee y no encuentro ninguna solucion.
  #2 (permalink)  
Antiguo 20/09/2014, 03:56
 
Fecha de Ingreso: marzo-2011
Ubicación: Oaxaca
Mensajes: 252
Antigüedad: 13 años, 1 mes
Puntos: 17
Respuesta: Sockets

Hola amigo, la verdad no estoy muy familiarizado con los sokets, pero, busque información referente a la sintaxis que pusiste en la pagina de PHP y no encontré nada
pero, encontré esta alternativa, no se si te sirva
http://stackoverflow.com/questions/1...es-not-timeout

revisalo y cualquier cosa comentas, de todos modos, le dare una leida ya que me llamo la atención
  #3 (permalink)  
Antiguo 21/09/2014, 00:44
Avatar de HackmanC  
Fecha de Ingreso: enero-2008
Ubicación: Guatemala
Mensajes: 1.817
Antigüedad: 16 años, 2 meses
Puntos: 260
Sonrisa Respuesta: Sockets

Hola,

Posiblemente,

Cita:
Iniciado por dpinos Ver Mensaje
...
socket_recv($socket, $response, 1028, MSG_WAITALL);
...
Con esa línea estás diciendo que espere hasta recibir 1028 bytes, hasta que ocurra un timeout o hasta que se desconecte el peer. Seguramente no recibe 1028 bytes, ni detectó que se desconectó el peer, así que espera hasta el timeout.

Cita:
Iniciado por dpinos Ver Mensaje
... Cuando ejecuto ese codigo en un windows el programa recibe la respuesta en aproximademente 1 o 2 segundos.

Cuando ejecuto ese mismo codigo en un linux el programa a pesar de haber recibido la respuesta en el mismo tiempo (lo se porque el server socket ya envio la respuesta) este espera los 20 segundos del timeout para hacer el echo; ...
Posiblemente, el servidor no cerró la conexión correctamente.

Saludos,

ps: 1024 Bytes es igual a 1 Kilobyte.
  #4 (permalink)  
Antiguo 30/09/2014, 15:16
 
Fecha de Ingreso: septiembre-2014
Mensajes: 2
Antigüedad: 9 años, 7 meses
Puntos: 1
Respuesta: Sockets

Finalmente solucione el asunto. El tema iba por donde dijo HackmanC. se debia a que la linea forzaba a detectar los 1028 bytes completos.

Solucione el tema con esta reemplazando la linea:

socket_recv($socket, $response, 1028, MSG_WAITALL);

por la linea:

$response = socket_read($socket,1028);

con esta linea funciona perfectamente el timeout y no se queda en espera infinita. Si se sobrepasa del timeout devuelve FALSE.

Gracias a todos por sus aportes.

Etiquetas: sockets
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

SíEste tema le ha gustado a 1 personas




La zona horaria es GMT -6. Ahora son las 22:30.