Servidor TCP/IP em C
Publicado por Samuel Leonardo 27/07/2009
[ Hits: 14.903 ]
Homepage: https://nerdki.blogspot.com.br/
Exemplo de um servidor TCP/IP usando sockets. Esse é o primeiro script que faço que não é um jogo :P, mas tá valendo.
NOTA: Também postei um cliente para esse servidor, verifique na lista de scripts enviados por mim através do meu perfil.
Para compilar:
$ gcc -o server tcp_server.c
Para executar:
$ ./server <num_da_porta>
Valeu!
/*
Exemplo de um servidor TCP/IP usando sockets.
Esse é o primeiro scripts que faço que não é um jogo :P,
mas tá valendo.
NOTE: Vô postar hoje um cliente para esse server.
para compilar:
$ gcc -o sever tcp_server.c
para executar:
$ ./server <num_da_porta>
valeu!
NOTE: ORGANIZEI TODO O CÓDIGO, DE FORMA QUE FIQUE MAIS LEGÍVEL A LÓGICA DO MESMO.
ISSO É O QUE ACONTECE QUANDO SE USA A TECLA TAB. /:^]
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//
#include <sys/types.h>
#include <sys/socket.h>
//funções inet_*()
#include <arpa/inet.h>
//struct sockaddr_in, ntol e outras
#include <netinet/in.h>
#include <errno.h>
#include <unistd.h>
int main(int argc, char *argv[])
{
int sockfd, new_sockfd;
int bytes;
socklen_t length;//para accept() e bind()
char buffer[32], quit;
struct sockaddr_in server;
struct sockaddr_in client;
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if(sockfd < 0)
{
perror("server_sockfd:::");
exit(1);
}
if(argc == 2)
{
server.sin_family = AF_INET;
//é meio arriscado usar atoi() aqui,
//mas assim fica fácil escolher em que porta esperar por conexões
server.sin_port = htons(atoi(argv[1]));
server.sin_addr.s_addr = INADDR_ANY;
memset(&(server.sin_zero), 0x00, 8);
}
else
{
printf("\n\tusage: %s <num_porta> \n\n", argv[0]);
close(sockfd);
exit(1);
}
length = sizeof(struct sockaddr);
if(bind(sockfd, (struct sockaddr *)&server, length) < 0)
{
perror("server_bind:::");
close(sockfd);
exit(1);
}
//o servidor aceitará no máximo apenas duas conexões
if(listen(sockfd, 2) < 0)
{
perror("server_listen:::");
close(sockfd);
exit(1);
}
printf("\nAguardando por conexões na porta %s...\n\n", argv[1]);
//aguardando por conexões
new_sockfd = accept(sockfd, (struct sockaddr *)&client, &length);
if(new_sockfd < 0)
{
perror("server_accept:::");
close(sockfd);
exit(1);
}
printf("\nAceitando conexão de %s\n\n", inet_ntoa(client.sin_addr));
quit = 'N';
while(quit != 'S')
{
bytes = send(new_sockfd, "SERVER:::ok!", 12, 0);
//ocorreu um erro = -1
if(bytes < 0)
{
perror("server_send:::");
close(new_sockfd);
close(sockfd);
exit(1);
}
bytes = recv(new_sockfd, buffer, 32, 0);
//NOTE:ocorreu um erro = -1 ou cliente fechou conexão = 0
if(bytes <= 0)
{
perror("server_recv:::");
close(new_sockfd);
close(sockfd);
exit(1);
}
buffer[bytes] = 0x00;//0x00 o mesmo que '{FONTE}'
quit = buffer[0];
printf("\nRECEBIDO:::%s\n\n", buffer);
}
close(new_sockfd);
close(sockfd);
return 0;
}
Alucard - scan de redes defensivo
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
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
How can I remove duplicate MSG files from my folders effectively? (0)
O programa assinador digital (0)
dpkg: erro: gatilho de arquivo duplicado chamado pelo arquivo de nome (6)









