Пример #1
0
void
serverDestroy(
    Server **_self
) {
    Server *self = *_self;

    if (self) {
        serverFree (self);
        free(self);
    }

    *_self = NULL;
}
Пример #2
0
void acceptClients(serv *server){
    int socket = server->socket;

    struct sockaddr_in clientAddr;
    int clientSocket;

    pthread_attr_t worker_attr;
    pthread_attr_init(&worker_attr);
    pthread_attr_setdetachstate(&worker_attr, PTHREAD_CREATE_DETACHED);
    pthread_t worker_thread;

    socklen_t sinSizeClient = sizeof(struct sockaddr_in);

    /*the accept loop*/
    while(1){
        if((clientSocket = accept(socket, (struct sockaddr *) &clientAddr, &sinSizeClient)) < 0){
            perror("ERROR: Could not accept client");
            continue;
        }

        /*resolve the clients host name*/
        bstring clientHostName = safe_BfromCstr("");
        int rc = getnameinfo((struct sockaddr *) &clientAddr, sinSizeClient,
                    charBuffromBstr(clientHostName), IRC_MAX_LEN+1, NULL, 0, 0);
        clientHostName->slen = strlen(charBuffromBstr(clientHostName));
        if (rc != 0 || !clientHostName->slen){
            bdestroy(clientHostName);
            clientHostName = safe_BfromCstr("unresolved");
        }
        /*init the client*/
        cli *newClient = initClient(clientSocket, clientHostName, server);
        /*create thread to wait for the client to register and then handle client request*/
        if (pthread_create(&worker_thread, &worker_attr, &enterRegister, newClient) != 0){
            clientFree(newClient);
            close(socket);
            errnoExit("ERROR: Could not create thread");
        }
    }

    /*free server*/
    serverFree(server);
}