Servidor em C via UDP

Publicado por Rafael Siqueira Telles Vieira 20/06/2007

[ Hits: 11.353 ]

Homepage: http://www.lia.ufc.br/~rafaelstv/

Download servidor.c




Um servidor em C que utiliza o protocolo UDP, recebe e envia mensagens...

Olhe também o cliente! De novo a tentativa é ser o mais didático possível.

Logo, este é um exemplo também bem simples e comentado.

Para compilar: gcc servidor.c -o S

  



Esconder código-fonte

#include <stdio.h>
#include <sys/socket.h>
#include <netdb.h>
#include <string.h>

void esvazia(char vetor[],int tam){
   int i;
   for(i=0;i<tam;i++){
      vetor[i]='{FONTE}';
   }
}

int main(){
struct sockaddr_in cliente, servidor;
int tam_cliente, meuSocket,enviei=0;
// MTU padrão pela IETF
char buffer[576];

meuSocket=socket(PF_INET,SOCK_DGRAM,0);
servidor.sin_family=AF_INET;
servidor.sin_port=htons(20000);
servidor.sin_addr.s_addr=htonl(INADDR_ANY);

esvazia(buffer,576);

bind(meuSocket,(struct sockaddr*)&servidor,sizeof(struct sockaddr_in));

while(1){
   printf("*** Servidor de Mensagens ***\n");
   tam_cliente=sizeof(struct sockaddr_in);
   recvfrom(meuSocket,buffer,576,MSG_WAITALL,(struct sockaddr*)&cliente,&tam_cliente);
   printf("Recebi:%s de <endereço:%s> <porta:%d>\n",buffer,inet_ntoa(cliente.sin_addr),ntohs(cliente.sin_port));
   int enviei=sendto(meuSocket,"ACK!",strlen("ACK!"),0,(struct sockaddr*)&cliente,sizeof(struct sockaddr_in));
   if (enviei>=0)
      printf("Envio de ACK!\n");
   else{
         error("sendto");
      printf("Envio de falhou!\n");
   }
   esvazia(buffer,576);
}
close(meuSocket);
}

Scripts recomendados

Fractal

ChangePassword

Script de smbstatus

Exemplo de sockets: um client e um server bem simples

whateveryouwant.c


  

Comentários
[1] Comentário enviado por rafastv em 20/06/2007 - 16:11h

[ATENÇÃO CORREÇÂO] substitua linha vetor[i]='{FONTE}'; por vetor[i]='/ 0'; sem espaços
E o tamanho padrão do pacote na verdade pela IETF é 556 bytes(tem 20 bytes do cabeçalho IPv4) :)
[ATENÇÃO CORREÇÂO]

[2] Comentário enviado por kirotawa em 20/12/2010 - 04:36h

no lugar de esvaziar melhor usar:

memset(vetor, barrazero, sizeof vetor);//vai setar todo o vetor/buffer pra vazio

essas tags é prq esse trem aqui caga o comentário
=]


Contribuir com comentário