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.319 ]
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
Inteiros e Strings na linguagem C
Compartilhando a tela do Computador no Celular via Deskreen
Como Configurar um Túnel SSH Reverso para Acessar Sua Máquina Local a Partir de uma Máquina Remota
Configuração para desligamento automatizado de Computadores em um Ambiente Comercial
Como renomear arquivos de letras maiúsculas para minúsculas
Imprimindo no formato livreto no Linux
Vim - incrementando números em substituição
Efeito "livro" em arquivos PDF
Como resolver o erro no CUPS: Unable to get list of printer drivers
Melhorando a precisão de valores flutuantes em python[AJUDA] (5)
Instalação Uefi com o instalador clássico do Mageia (1)
[Python] Automação de scan de vulnerabilidades
[Python] Script para analise de superficie de ataque
[Shell Script] Novo script para redimensionar, rotacionar, converter e espelhar arquivos de imagem
[Shell Script] Iniciador de DOOM (DSDA-DOOM, Doom Retro ou Woof!)
[Shell Script] Script para adicionar bordas às imagens de uma pasta