• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

skcratch

[Ajuda] - Ligação estabelecida através de socket "pendura"

12 mensagens neste tópico

Viva!

Estou a utilizar a seguinte função para enviar um HTTP POST de um cliente para um servidor:

	public function sendRequest($xmlRequest) {

		// open a connection through a socket to IPTVServer
	    $fp = fsockopen($this->serverAddress, $this->serverIpPort);
	    
	    if ($fp != null) { 
		    // set the HTTP POST headers
		    fputs($fp, "POST / HTTP/1.1\r\n");
		    fputs($fp, "Host: $this->serverAddress\r\n");
		    fputs($fp, "Content-type: application/x-www-form-urlencoded\r\n");
		    fputs($fp, "Content-length: " . strlen($xmlRequest) . "\r\n");
		    fputs($fp, "Connection: close\r\n\r\n");
		    fputs($fp, $xmlRequest);

		    $result = ''; 
		    while(!feof($fp)) {
		        // receive the results of the request
		        $result .= fgets($fp);
		    }

		    // close the socket connection:
		    fclose($fp);

		    // split the result header from the content
		    $result = explode("\r\n\r\n", $result, 2);

		    $header = isset($result[0]) ? $result[0] : '';
		    $content = isset($result[1]) ? $result[1] : '';
		    
		    // remove iptvxml= from the response
   			$response = str_replace("iptvxml=", "", $content);
   			
   			// return the xml string with the IPTVServer response
   			return $response;
		}
	}

Durante muito tempo, este método funcionou na perfeição mas agora está com alguns problemas. A ligação entre o cliente e o servidor é estabelecida com sucesso através do socket mas quando tento obter a resposta, a execução fica pendurada no ciclo while. Já defini vários tamanhos como segundo argumento da função fgets mas o problema continua.

Será que alguém pode dar uma ajuda?

Cumps!

:cheesygrin:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Viva!

Por favor, algum moderador que mova este tópico para a secção de "Dúvidas e Ajudas".

Cumps!

:cheesygrin:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Aparentemente está tudo bem. Verifica se foram feitos updates do sistem ás máquinas (tanto servidor como cliente), poderá ser a causa. Ou outra configuração que foi alterada? Se o código funcionava antes e agora já não funciona, e se este não foi alterado...

...podemos concluir que foi outro factor que mudou?

Outra coisa, um aviso presente no manual do PHP (que poderá aplicar-se ao teu caso), aqui fala em fopen() mas suponho que seja similar com fsockopen():

If the passed file pointer is not valid you may get an infinite loop, because feof() fails to return TRUE.

Example #1 feof() example with an invalid file pointer

<?php
// if file can not be read or doesn't exist fopen function returns FALSE
$file = @fopen("no_such_file", "r");

// FALSE from fopen will issue warning and result in infinite loop here
while (!feof($file)) {
}

fclose($file);
?>

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Viva!

Eu faço o teste que mencionas-te: caso não se consiga estabelecer a ligação através do socket, este devolve null e não executa o código seguinte.

Grato pela ajuda,

Cumps!

:cheesygrin:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
(...)Eu faço o teste que mencionas-te: caso não se consiga estabelecer a ligação através do socket, este devolve null e não executa o código seguinte.(...)

Bem visto, tenho de ler melhor as coisas..!

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Viva!

O problema que referi anteriormente, pode estar de alguma forma relacionado com o tamanho do corpo do pedido que é efectuado?

Grato desde já pela ajuda,

Cumps!

:cheesygrin:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

O protocolo HTTP em si não define limites máximos para o tamanho do pedido, mas o webserver pode definir tais limites. Não será má ideia verificar isso.

Se estiveres a enviar os dados para um script PHP, verifica no php.ini do servidor o suspeito do costume: post_max_size, por defeito 8MB.

Se não estou em erro o Apache por defeito não tem qualquer limite definido. Outros webserver/linguagens, só vendo.

De qualquer forma, o server não te devolve nenhum código de erro, nada de nada?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Viva!

Neste momento estou a utilizar o Wamp 2.0 como ambiente de desenvolvimento. No logger do PHP não é escrita qualquer mensagem de erro, apenas fico "pendurado" quando tento executar um pedido. De notar, que para outros pedidos idênticos (envio de um PHP POST através de um socket sendo a mensagem uma string XML) funciona na perfeição e não tenho qualquer tipo de problema, dai a minha pergunta acerca do tamanho do pedido.

Grato desde já pela ajuda,

Cumps!

:cheesygrin:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Viva!

No código que apresentei no início do tópico, existe alguma forma de verificar se a informação foi ou não enviada com sucesso? Como o ciclo while "pendura" na leitura, gostaria de verificar se está a ocorrer algum erro durante o envio.

Grato desde já pela ajuda,

Cumps!

:P

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Do que vi na documentação, não há muito a verificar. Podes tentar o seguinte (é um pouco rebuscado, mas deverá funcionar):

Usa a extenção Live HTTP headers do Firefox para criar um pedido igual ao que estás a tentar fazer no PHP, e enviá-lo para o servidor. Podes verificar os headers de resposta.

Outra hipótese, ainda mais rebuscada, seria analizar o tráfego de rede usando um programa para tal (p. ex. wireshark em Linux), e verificar o que se passa.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Viva!

Sinceramente, não compreendo o que se passa, já que utilizo exactamente o mesmo método para fazer outros pedidos e tudo funciona bem. Vou utilizar o Wireshark para tentar perceber melhor a causa do problema.

Grato desde já pela ajuda,

Cumps!

;)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora