[C]TCP Server

Status
Fechado a novas mensagens.

JomarC

Power Member
Boas

Ja agora....TCP server em C.

Utilizei durante este semestre para criar um servidor HTTP....ta um bom ponto de partida.

Ai esta:



Código:
/*
* Aplicação servidora que envia ao cliente uma mensagem predefinida
*/
 
 
#include <stdio.h> /* printf(), fprintf() */
#include <sys/socket.h> /* socket(), bind(), connect() */
#include <arpa/inet.h> /* sockaddr_in, inet_ntoa() */
#include <stdlib.h> /* atoi(), exit() */
#include <string.h> /* memset() */
#include <unistd.h> /* close() */
 
#define MAXPENDING 5 /* número máximo de pedidos de ligação pendentes */
#define RCVBUFSIZE 32 /* dimensão do buffer de recepção */
 
char* server_msg = "Olá Cliente!\n";
 
void DieWithError(char *errorMessage);
int CreateTCPServerSocket(unsigned short port);
int AcceptTCPConnection(int servSock);
void HandleTCPClient(int clntSocket);
 
int main(int argc, char *argv[])
{
int servSock; /* descritor socket para servidor */
int clntSock; /* descritor socket para cliente */
unsigned short echoServPort; /* porto servidor */
 
if (argc != 2) /* teste ao número de argumentos */
{
fprintf(stderr, "Usage: %s <Server Port>\n", argv[0]);
exit(1);
}
 
echoServPort = atoi(argv[1]); /* arg: porto servidor */
servSock = CreateTCPServerSocket(echoServPort);
for (;;)
{
clntSock = AcceptTCPConnection(servSock);
HandleTCPClient(clntSock);
}
}
 
void DieWithError(char *errorMessage)
{
perror(errorMessage);
exit(1);
}
 
int CreateTCPServerSocket(unsigned short port)
{
int sock; /* socket a criar */
struct sockaddr_in echoServAddr; /* endereço local */
 
/* cria socket para pedidos de ligação */
if ((sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0)
DieWithError("socket() falhou");
 
/* estrutura do endereço local do servidor */
memset(&echoServAddr, 0, sizeof(echoServAddr)); /* preenche com valor zero */
echoServAddr.sin_family = AF_INET; /* familia de endereços de Internet */
echoServAddr.sin_addr.s_addr = htonl(INADDR_ANY); /* permite ligar qualquer interface */
echoServAddr.sin_port = htons(port); /* porto local */
 
/* ligar o socket ao porto local */
if (bind(sock, (struct sockaddr *) &echoServAddr, sizeof(echoServAddr)) < 0)
DieWithError("bind() falhou");
 
/* Colocar o socket à espera de pedidos de ligação */
if (listen(sock, MAXPENDING) < 0)
DieWithError("listen() falhou");
 
return sock;
}
 
int AcceptTCPConnection(int servSock)
{
int clntSock; /* descritor socket para o cliente */
struct sockaddr_in echoClntAddr; /* endereço do cliente */
unsigned int clntLen; /* dimensão da estrutura do endereço do cliente */
 
/* afectar com a dimensão da estrutura do endereço do cliente */
clntLen = sizeof(echoClntAddr);
 
/* espera pela ligação de um cliente... */
if ((clntSock = accept(servSock, (struct sockaddr *) &echoClntAddr,
&clntLen)) < 0)
DieWithError("accept() falhou");
 
/* clntSock está connectado a um cliente */
 
printf("Manipulando cliente %s\n", inet_ntoa(echoClntAddr.sin_addr));
 
return clntSock;
}
 
void HandleTCPClient(int clntSocket)
{
int msgSize; /* dimensão da mensagem */
msgSize = strlen(server_msg);
if (send(clntSocket, server_msg, msgSize, 0) != msgSize)
DieWithError("send() falhou");
 
close(clntSocket); /* fecha socket do cliente */
}




PS: Não sei como é que se poe a mensagem com aquela caixa de codigo! :\ lol


Cumps
 
Última edição pelo moderador:
Status
Fechado a novas mensagens.
Back
Topo