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,'
Trabalhando Nativamente com Logs no Linux
Jogando Daikatana (Steam) com Patch 1.3 via Luxtorpeda no Linux
LazyDocker – Interface de Usuário em Tempo Real para o Docker
Linux Mint: Zram + Swapfile em Btrfs
O widget do Plasma 6 Área de Notificação
Internet não funciona corretamente no Linux (0)
tentei instalar o steam pelo terminal, agora ele não abre (2)
Após todos esses anos... youtube! (4)









