基於線程池,封裝的TCP服務器框架

線程池請見上一遍blog,且說下如何使用此框架。

環境:Ubuntu 12.04 g++ 4.6.3

解壓附件AdvServer.zip到linux機器上的目錄,然後解壓,進入到AdvServer/src,用戶可直接修改main.cc然後make,編譯結果爲AdvServer/src/main

服務器接口定義:

/**********************
 * Copyrigth (c) 2013,lonelyc++
 * All rights reserved
 *
 *   @file:tcpserver.h
 *   @desc:tcpserver definion
 * @author:liyuanchi
 *   @date:2013-10-20
 **********************/
#ifndef __TCPSERVER_H_
#define __TCPSERVER_H_
#include <sys/socket.h>
#include <sys/types.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <pthread.h>
typedef struct client_conn_t
{
    int connfd;
    struct sockaddr_in *client;
}client_conn_t;
typedef struct tcpserver_t tcpserver_t;
/**
 * @function tcpserver_create
 * @descCreates a tcpserver_t object.
 * @param server_port port
 * @max_client_conn # of client conn
 * @param thr_num  thread num
 * @param max_thr_num  max thread size
 * @param task_queue_size   size of the queue.
 * @return a newly created thread pool or NULL
 */
tcpserver_t* tcpserver_create(int server_port, int max_client_conn,
        int min_thr_num, int max_thr_num, int task_queue_size);
/**
 * @function tcpserver_startup
 * @desc startup server do void *(*routine)(client_conn_t *)
 * @param tcpserver
 * @param void *(*routine)(client_conn_t *)
 */
void tcpserver_startup(tcpserver_t *tcpserver, void *(*routine)(void *));
/**
 * @function tcpserver_shutdown
 * @desc Stops and destroys a tcpserver.
 * @param tcpserver server to shutdown.
 */
void tcpserver_shutdown(tcpserver_t *tcpserver);
#endif


如何使用此框架?

1、#include "tcpserver.h"

2、創建一個tcp服務器詳細參數詳見接口說明。

tcpserver_t *tcpserver = tcpserver_create(12345,10,2,5,100);

3、定義好自己的業務處理函數,void *process_client(void *client_conn)

注意:此處參數必須是此類型client_conn_t *conn = (client_conn_t *)client_conn;

4、調用接口啓動此tcp服務器。tcpserver_startup(tcpserver, process_client);


/*
 ============================================================================
 Name        : main.c
 Author      : liyuanchi
 Version     :
 Copyright   : huasi
 Description : main
 ============================================================================
 */
#include "tcpserver.h"
#include <stdio.h>
#include "common.h"
#include <malloc.h>
#include <string.h>
void *process_client(void *client_conn);
int main()
{
    tcpserver_t *tcpserver = tcpserver_create(12345,10,2,5,100);
    if (tcpserver == NULL)
    {
        printf("tcp server create fail");
        return -1;
    }
    tcpserver_startup(tcpserver, process_client);
    return 0;
}
void *process_client(void *client_conn)
{
    client_conn_t *conn = (client_conn_t *)client_conn;
    int read = 0;
    char recvbuf[BUF_SIZE];
    while ((read = recv(conn->connfd, recvbuf, BUF_SIZE, 0)) != 0)
    {
        recvbuf[read] = '\0';
        printf("recv from client: %s\n",recvbuf);
        if (strcmp(recvbuf, "bye") == 0)
        {
            break;
        }
    }
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章