⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 server.c

📁 linux程序设计第二版
💻 C
字号:
/* Some global variables, a prototype for process_command and a signal catcher to ensure a clean exit. */#include <unistd.h>#include <stdlib.h>#include <stdio.h>#include <fcntl.h>#include <limits.h>#include <signal.h>#include <string.h>#include <errno.h>#include <sys/types.h>#include <sys/stat.h>#include "cd_data.h"#include "cliserv.h"int save_errno;static int server_running = 1;static void process_command(const message_db_t mess_command);void catch_signals(){    server_running = 0;}/*Now we come to the main function.After checking that the signal catching routines,the program checks to see whether you passed -i on the command line.If you did, it will create a new database.If all is well and the server is running,any requests from the client are fed to the process_command functionthat we'll meet in a moment. */int main(int argc, char *argv[]) {    struct sigaction new_action, old_action;    message_db_t mess_command;    int database_init_type = 0;    new_action.sa_handler = catch_signals;    sigemptyset(&new_action.sa_mask);    new_action.sa_flags = 0;    if ((sigaction(SIGINT, &new_action, &old_action) != 0) ||        (sigaction(SIGHUP, &new_action, &old_action) != 0) ||        (sigaction(SIGTERM, &new_action, &old_action) != 0)) {        fprintf(stderr, "Server startup error, signal catching failed\n");        exit(EXIT_FAILURE);    }        if (argc > 1) {        argv++;        if (strncmp("-i", *argv, 2) == 0) database_init_type = 1;    }    if (!database_initialize(database_init_type)) {                fprintf(stderr, "Server error:-\                         could not initialize database\n");                exit(EXIT_FAILURE);    }    if (!server_starting()) exit(EXIT_FAILURE);        while(server_running) {        if (read_request_from_client(&mess_command)) {            process_command(mess_command);        } else {            if(server_running) fprintf(stderr, "Server ended - can not \                                        read pipe\n");            server_running = 0;        }    } /* while */    server_ending();    exit(EXIT_SUCCESS);}/*  Any client messages are fed to the process_command function, where they are fed into a case statement that makes the appropriate calls to cd_dbm.c. */static void process_command(const message_db_t comm){    message_db_t resp;    int first_time = 1;    resp = comm; /* copy command back, then change resp as required */    if (!start_resp_to_client(resp)) {        fprintf(stderr, "Server Warning:-\                 start_resp_to_client %d failed\n", resp.client_pid);        return;    }    resp.response = r_success;    memset(resp.error_text, '\0', sizeof(resp.error_text));    save_errno = 0;    switch(resp.request) {        case s_create_new_database:            if (!database_initialize(1)) resp.response = r_failure;            break;        case s_get_cdc_entry:            resp.cdc_entry_data =                            get_cdc_entry(comm.cdc_entry_data.catalog);            break;        case s_get_cdt_entry:            resp.cdt_entry_data =                            get_cdt_entry(comm.cdt_entry_data.catalog,                                          comm.cdt_entry_data.track_no);            break;        case s_add_cdc_entry:            if (!add_cdc_entry(comm.cdc_entry_data)) resp.response =                            r_failure;            break;        case s_add_cdt_entry:            if (!add_cdt_entry(comm.cdt_entry_data)) resp.response =                            r_failure;            break;                    case s_del_cdc_entry:            if (!del_cdc_entry(comm.cdc_entry_data.catalog)) resp.response                         = r_failure;            break;                    case s_del_cdt_entry:            if (!del_cdt_entry(comm.cdt_entry_data.catalog,                  comm.cdt_entry_data.track_no)) resp.response = r_failure;            break;        case s_find_cdc_entry:            do {                resp.cdc_entry_data =                          search_cdc_entry(comm.cdc_entry_data.catalog,                                            &first_time);                if (resp.cdc_entry_data.catalog[0] != 0) {                    resp.response = r_success;                    if (!send_resp_to_client(resp)) {                        fprintf(stderr, "Server Warning:-\                            failed to respond to %d\n", resp.client_pid);                        break;                    }                } else {                    resp.response = r_find_no_more;                }            } while (resp.response == r_success);        break;        default:            resp.response = r_failure;            break;    } /* switch */    sprintf(resp.error_text, "Command failed:\n\t%s\n",              strerror(save_errno));    if (!send_resp_to_client(resp)) {        fprintf(stderr, "Server Warning:-\                 failed to respond to %d\n", resp.client_pid);    }    end_resp_to_client();    return;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -