Jump to content

Ligação estabelecida através de socket "pendura"


skcratch

Recommended Posts

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!

😁

Link to comment
Share on other 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);
?>

"Pensa positivo: tudo pode piorar"

Link to comment
Share on other 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?

"Pensa positivo: tudo pode piorar"

Link to comment
Share on other 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!

😁

Link to comment
Share on other 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.

"Pensa positivo: tudo pode piorar"

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.