1. Este site usa cookies. Ao continuar a usar este site está a concordar com o nosso uso de cookies. Saber Mais.

[C]TCP Server

Discussão em 'Programação' iniciada por JomarC, 18 de Setembro de 2008. (Respostas: 0; Visualizações: 1283)

Estado do Tópico:
Fechado a novas mensagens.
  1. JomarC

    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: 19 de Setembro de 2008
Estado do Tópico:
Fechado a novas mensagens.

Partilhar esta Página