Sockets: um mini webserver
Publicado por Andre Luiz da Silva 16/05/2004
[ Hits: 10.978 ]
Homepage: http://localhost
Em mais uma empreitada sobre sockets, resolvi "enfeitar" um pouco e trazer um exemplo do que de longe poderia ser chamado de webserver, ou melhor, de mini webserver, ou talvez um micro webserver, honestamente falando podemos chamá-lo de nano webserver... o funcionamento eh clássico, tu põe ele pra rodar e ele ficará ouvindo na porta 8080, ou se fosse for root o suficiente pode alterar a constante PORT e colocá-lo pra rodar na porta 80, como se é de contume em servidores web...
/*********************************************************************************
* Author: Andre Luiz da Silva
* Date: 16/05/2004
* Obs: Nao se esqueca de colocar um arquivinho "index.html" com algumas tags em html no mesmo
* diretório onde inicio o programa... beleza?!
********************************************************************************* * This program is free software; you can redistribute it and/or modify it under
* the terms of the GNU General Public License as published by the Free
* Software Foundation; either version 2 of the License, or (at your option)
* any later version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*********************************************************************************/
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <getopt.h>
#include <fcntl.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <netinet/in.h>
#include <sys/sendfile.h>
#define PORT 8080
#define BACKLOG 10
#define INDEX_PATH "index.html"
int DoDaemon()
{
pid_t child_pid;
child_pid = fork();
if (!child_pid)
{
int i;
for (i = 0; i < getdtablesize(); ++i)
close (i);
setsid();
return 0;
}
if (child_pid > 0)
exit (0);
else
return -1;
}
int send_file(int fd_out)
{
int fd_in;
struct stat fd_in_stat;
if ((fd_in = open(INDEX_PATH, O_RDONLY)) == -1)
{
perror ("open(): ");
exit (1);
}
if ((stat (INDEX_PATH, &fd_in_stat)) == -1)
{
perror ("stat(): ");
exit (1);
}
sendfile (fd_out, fd_in, 0, fd_in_stat.st_size);
close (fd_in);
return 0;
}
int main(int argc, char **argv)
{
struct sockaddr_in server;
int port = PORT, server_sd, remote_sd;
memset (&server, 0, sizeof(server));
server.sin_port = htons (port);
server.sin_family = AF_INET;
if ((DoDaemon()) == -1)
exit (1);
if ((server_sd = socket (AF_INET, SOCK_STREAM, 0)) == -1)
{
perror ("socket(): ");
exit (1);
}
if ((bind (server_sd, (struct sockaddr *)&server, sizeof(server))) == -1)
{
perror ("bind(): ");
exit (1);
}
listen (server_sd, BACKLOG);
strcpy (argv[0], "mini-apache: esperando por conexões...");
while (1)
{
remote_sd = accept (server_sd, NULL, NULL);
send_file (remote_sd);
close (remote_sd);
}
close (server_sd);
return 0;
}
Alucard - scan de redes defensivo
Robo HTTP usando socket e código multiplataforma
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
Novos apps de produtividade, avanços em IA e distros em ebulição agitam o universo Linux
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
Captação de áudio no zorin linux começa a diminuir com o tempo (0)
dpkg: erro: gatilho de arquivo duplicado chamado pelo arquivo de nome (0)
estou na 22.1 e não é atualizado pra 22.4 via "sudo full-upgrade&... (6)









