dez 6 2008

Transferência de Arquivos via Sockets

O script possui duas partes, o cliente e o servidor. Digamos que eu rode o Servidor em um computador. O servidor vai abrir uma porta nesse computador, e irá deixar essa porta escutando até alguém se conectar. Se você rodar o script Cliente, o script vai conectar no computador que está rodando o script Servidor, e então irá transferir um arquivo do PC Servidor para o PC Cliente, tudo isso usando sockets.

Servidor:

<?php
/* PHP File Transfer
Desenvolvido por sYnyst3r
www.forum-invaders.com.br */
 
set_time_limit(0);
ini_set("max_execution_time", 999999999);
 
class Servidor
{
	var $config = array("address"=>"127.0.0.1",
						"port"=>666,
						"file"=>"phon.mp3"       
						);
	private $suck;
 
	public function listen(){
		if(!$this->suck = socket_create(AF_INET, SOCK_STREAM, SOL_TCP)) die("[!]could not create socket");
 
		socket_bind($this->suck, $this->config['address'], $this->config['port']) or $this->SocketError();
		socket_listen($this->suck, 5) or $this->SocketError();
		echo "[+]Listening...<br><br>";
		flush();
	}
 
	public function send(){
		if(!file_exists($this->config['file'])) die("[!]Arquivo não encontrado!");
		$buffer = file_get_contents($this->config['file']);
 
		do {
			$isock = socket_accept($this->suck) or $this->SocketError();
			echo "[!]Client Connected!<br>";
			echo "[+]Enviando o arquivo<br>";
			flush();
			socket_write($isock, $buffer, strlen($buffer));
			socket_close($isock);   
		}
		while(true);
		socket_close($this->suck);
	}
 
	final private function SocketError(){
		die("Socket Error: ".socket_strerror(socket_last_error($this->suck)));
	}
}
 
$synyster = new Servidor;
$synyster->listen();
$synyster->send();
?>

Cliente:

<?php
/* PHP File Transfer
Desenvolvido por sYnyst3r
www.forum-invaders.com.br */
 
set_time_limit(0);
ini_set("max_execution_time", 999999999);
 
class Cliente
{
	public $file = "recebido.mp3";
 
	public function connect(){
		$this->suck = socket_create(AF_INET,SOCK_STREAM,SOL_TCP);
		$err = socket_connect($this->suck, 'localhost', 666);
	}
 
	public function save(){
		$fp = fopen($this->file, "w");
		fwrite($fp, $this->transfer);
		fclose($fp);
	}
 
	private function transfer(){
		$buffer = "";
 
		while($r = @socket_read($this->suck,4000,PHP_NORMAL_READ)) $buffer .= $r;
		return $buffer;
	}
 
}
 
$client = new Cliente;
$client->connect();		
$client->save();
?>

OBS.: Arquivos pequenos irão ser transferidos sem problemas, pois irão caber no buffer, mas arquivos grandes não irão funcionar, pelo limite network buffer. Para evitar isso o código será adaptado futuramente para incluir um loop infinito usando socket_select() pra enviar mais dados conforme o buffer for esvaziando.



1 Comentários:

Trackbacks

  1. adailton diz:
    Já usei diferente onde o servidor é executado via linha de comando,

    tipo cd\appserv (enter) php -q www\server.php

    seria bom, se o servidor enviasse para o echo do php os dados como um servidor de socket que não fecha a conexão.

    fevereiro 13th, 2011 às 10:45 pm

DEIXE UM COMENTÁRIO

Subscrever

Subscreve o Blog



Publicidade

Comentários Recentes

  • shirley Balazs: Parabéns!! Informações de utilidade publica e de primeira, foi muito útil a mim.Obrigada!!
  • Jefferson Ferreira de brito: eu quero muito
  • thiago valente: Eu quero um para mim
  • Lucas martins balieiro: Eu não fiz o enem mesmo assim eu posso me inscrever no site essa é minha dúvida, só queme...
  • Francisca Marli Oliveira: quero saber quanto tenho no meu fgts

Links

Leitores Recentes

VALE O CLIQUE!

Site Seguro Ocioso

Divulgue o blog Infomaroto em seu site e tenha seu link ou banner aqui.
Blog Infomaroto