Tutorial - Aplicação em C para transferência de arquivo usando socket TCP e Thread
Aplicação baseada na arquitetura cliente-servidor escrita em C para realizar múltiplas conexões com diversos clientes para transferências de arquivos de qualquer tamanho. É uma ótimo exemplo para conhecer o funcionamento de thread com sockets e recursos em C para pesquisa em diretórios no Linux.
[ Hits: 21.985 ]
Por: Ronaldo Borges em 11/12/2015 | Blog: https://www.facebook.com/ronyjah1
#include <sys/socket.h>
#include <sys/types.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
#define MAX_MSG 1024
/*
Cliente envia mensagem ao servidor e imprime resposta
recebida do Servidor
*/
int main(int argc, char *argv[]) {
FILE *received_file;
received_file = fopen(argv[3], "w");
ssize_t len;
char buffer[BUFSIZ];
int aba;
if (argc != 4) {
fprintf(stderr, "use:./cliente [IP] [Porta] [arquivo]\n");
return -1;
} else if (!isdigit(*argv[2])) {
fprintf(stderr, "Argumento invalido '%s'\n", argv[2]);
fprintf(stderr, "use:./cliente [IP] [Porta] [arquivo]\n");
return -1;
}
// variaveis
int socket_desc;
struct sockaddr_in servidor;
char *mensagem;
char resposta_servidor[MAX_MSG];
int tamanho;
mensagem = argv[3];
char* aux1 = argv[2];
int portaServidor = atoi(aux1);
/*****************************************/
/* Criando um socket */
// AF_INET = ARPA INTERNET PROTOCOLS
// SOCK_STREAM = orientado a conexao
// 0 = protocolo padrao para o tipo escolhido -- TCP
socket_desc = socket(AF_INET, SOCK_STREAM, 0);
if (socket_desc == -1) {
printf("Nao foi possivel criar socket\n");
return -1;
}
/* Informacoes para conectar no servidor */
// IP do servidor
// familia ARPANET
// Porta - hton = host to network short (2bytes)
servidor.sin_addr.s_addr = inet_addr(argv[1]);
servidor.sin_family = AF_INET;
servidor.sin_port = htons(portaServidor);
//Conectando no servidor remoto
if (connect(socket_desc, (struct sockaddr *) &servidor, sizeof (servidor)) < 0) {
printf("Nao foi possivel conectar\n");
return -1;
}
printf("Conectado no servidor\n");
/*****************************************/
/*******COMUNICAO - TROCA DE MENSAGENS **************/
//Enviando uma mensagem
//mensagem 1 enviando nome do arquivo.
if (send(socket_desc, mensagem, strlen(mensagem), 0) < 0) {
printf("Erro ao enviar mensagem\n");
return -1;
}
printf("Dados enviados\n");
memset(mensagem, 0, sizeof mensagem);
memset(resposta_servidor, 0, sizeof resposta_servidor);
//Recebendo resposta do servidor
//mensagem 2 recebendo que arquivo existe
if((tamanho = read(socket_desc, resposta_servidor, MAX_MSG)) < 0) {
printf("Falha ao receber resposta\n");
return -1;
}
printf("Resposta recebida: %s\n", resposta_servidor);
if (strcmp(resposta_servidor, "200") == 0) {
mensagem = "OK";
//mensagem 3 enviado ok
write(socket_desc, mensagem, strlen(mensagem));
//mensagem 4 recebendo o tamanho do arquivo;
memset(resposta_servidor, 0, sizeof resposta_servidor);
read(socket_desc, resposta_servidor, 1024);
int tamanhoDoArquivo = atoi(resposta_servidor);
printf("\nTamanho do arquivo a ser copiado: %s \n", resposta_servidor);
aba = tamanhoDoArquivo;
}else{
fprintf(stderr, "Arquivo nao encontrado no servirdor'%s'\n", argv[3]);
close(socket_desc);
printf("Cliente finalizado com sucesso!\n");
return 0;
}
while (((len = recv(socket_desc, buffer, BUFSIZ, 0)) > 0)&& (aba > 0)) {
fwrite(buffer, sizeof (char), len, received_file);
aba -= len;
fprintf(stdout, "Recebidos %d bytes e aguardamos :- %d bytes\n", len, aba);
if (aba <= 0) {
break;
}
}
fclose(received_file);
close(socket_desc);
printf("Cliente finalizado com sucesso!\n");
return 0;
}
Tutorial hadoop - Guia prático de um cluster com 3 computadores
Monitorando o consumo de banda com Bwbar
IA Turbina o Desktop Linux enquanto distros renovam forças
Como extrair chaves TOTP 2FA a partir de QRCODE (Google Authenticator)
Linux em 2025: Segurança prática para o usuário
Desktop Linux em alta: novos apps, distros e privacidade marcam o sábado
IA chega ao desktop e impulsiona produtividade no mundo Linux
Como instalar o repositório do DBeaver no Ubuntu
Como instalar o Plex Media Server no Ubuntu
Digitando underscore com "shift" + "barra de espaços"
Como ativar a lixeira e recuperar aquivos deletados em um servidor Linux
Como mudar o nome de dispositivos Bluetooth via linha de comando
Warcraft II Remastered no Linux? (4)
O programa assinador digital (5)









