Publicada por andersonsv1 em 14/06/2007 - 16:52h:
* andersonsv1 usa

pessoal,

to precisando criar uma aplicação cliente servidor(socket) que implemente um servidor de arquivo simples. A aplicação deve ser implementada em C em ambiente Linux.

A primeira parte é um servidor de arquivos que irá receber os comandos na porta 21000 TCP enviará os dados pela porta 20000 TCP.
A segunda parte é um cliente modo texto capaz de comunicar-se com o servidor da primeira parte.

Aceitar conexões na porta 21000 TCP;
Enviar dados pela porta 20000 TCP;

Listar os arquivos da máquina servidora com o comando “LISTAR”
Mudar de diretório na máquina servidora com o comando “CD <diretório>”
Copiar um arquivo da máquina servidora para máquina local com o comando “RECEBER <arquivo>”
Copiar um arquivo da máquina local para máquina servidora com o comando “ENVIAR <arquivo>”
Fechar uma conexão e sair com o comando “FECHAR”

já fiz uma parte... quem puder me ajuda a continuar.
segue o codigo do client e do server:

/* clienteftp.c:
*
* Programa cliente que implementa um sistema para tranferência de arquivo simples
* Exemplo de uso: clienteftp <ipservidor> <portaservidor>
*/

/*
* Includes necessários para o programa
*/
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <time.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>

/*
* Função para reportar erros
*/
static void
bail(const char *on_what) {
   if ( errno != 0 ) {
      fputs(strerror(errno),stderr);
      fputs(": ",stderr);
   }
   fputs(on_what,stderr);
   fputc('n',stderr);
   exit(1);
}


/*
* Função para receber dados pela rede e armazenar em um arquivo
*/
void recebeArquivo(int socket, char * nomearquivo){
FILE* arquivo;
int n; // variável para armazenar o numero de bytes lidos ou escritos
int z; // variável para verificar se a escrita aconteceu com sucesso
char buffer[1024]; // area temporária para armazenar os bytes enviados

arquivo = fopen(nomearquivo, "w+");
if (arquivo == NULL)
   bail("Erro ao criar o arquivo");

while((n=read(socket, buffer, sizeof(buffer)) )>0){
z = fwrite(buffer, 1, n, arquivo);
if (z== -1)
bail("Problemas para gravar no arquivo");
}
fclose(arquivo);
}   

int main(int argc,char *argv[]) {   
    int z;
    char *srvr_addr = NULL; // endereço IP do servidor
    char *srvr_port = "9099"; // porta do servidor
    struct sockaddr_in adr_srvr; // estrutura para armazenar dados do servidor
    int len_inet; // tamanho da estrutura
    int s; // socket do servidor
char arq_servidor[20], arq_local[20];
char comando[25], resposta[25];

    // o primeiro argumento é o IP do servidor
    if ( argc >= 2 ) {
       srvr_addr = argv[1];      
    } else {      
      // valor padrão
      srvr_addr = "127.0.0.1";
    }      
         
    // o segundo argumento é a porta do servidor
    if ( argc >= 3 )      
       srvr_port = argv[2];      
         
    // cria o socket
    s = socket(AF_INET,SOCK_STREAM,0);      
    if ( s == -1 )
       bail("socket()");

    // prepara a estrutura
    memset(&adr_srvr,0,sizeof adr_srvr);
    adr_srvr.sin_family = AF_INET;
    adr_srvr.sin_port = htons(atoi(srvr_port));
    adr_srvr.sin_addr.s_addr =
    inet_addr(srvr_addr);
    if ( adr_srvr.sin_addr.s_addr == INADDR_NONE )
       bail("Endereço IP inválido");

    // conecta com o servidor
    len_inet = sizeof adr_srvr;
    z = connect(s,(struct sockaddr *)&adr_srvr,len_inet);
    if ( z == -1 )
       bail("Erro de conexão");

/*
    * Neste ponto devemos inserir o código específico deste cliente que se resume a:
    * ler nome do arquivo que você deseja no servidor

    * ler nome que você deseja dar ao arquivo que vai ser criado localmente

    * enviar para o servidor o comando GET NOMEARQUIVO   

    * aguardar a resposta do servidor (read)

    * se a resposta foi positiva me preparo para receber o arquivo.

    * receber o arquivo do servido   

    */
   
printf("---------------------- Cliente de FTP simples -----------------------/n");
    printf("n");
    printf("Qual arquivo você deseja no servidor? ");
    scanf("%s", arq_servidor);   
    printf("n");

    printf("Qual o nome do arquivo local a ser criado? ");
    scanf("%s", arq_local);   

// limpa a variavel comando
memset(comando,'

  
 
Resposta de ddmizu em 03/07/2007 - 21:44h:
* ddmizu usa Debian
* ddmizu tem conceito: nenhum voto.
 


Ola rapz!

Recentemente eu fiz um trabalho da facul parecido com esse. Inclusive eu tenho o código fonte numa pagina da internet:

http://www.geocities.com/xmendesx/redes.zip

Pega lá e dá uma conferida. Talvez te ajude ae no seu servico!

Abcs!

  


ATENÇÃO: Antes de contribuir com uma resposta, leia o artigo Qualidade de respostas e certifique-se de que esteja realmente contribuindo com a comunidade. Muitas vezes o ímpeto de contribuir nos leva a atrapalhar ao invés de ajudar.

Contribuir com resposta



CAPTCHA
[ Recarregar imagem ]

Digite o código acima:

  
* Nota: só é possível enviar respostas usuário que possui conta e esteja logado com ela, caso contrário sua mensagem será perdida.



Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts