運行環境:Linux2.6以上
文件說明:
tcputil.c --------------- TCP多線程服務框架實現
tcputil.h --------------- 公開函數聲明
使用說明:
發送消息必須采用固定的(消息大小,消息體)這種流邊界方式,其中消息大小是uint32_t類型,並且是網絡字節序。
直接調用start(監聽IP, 監聽端口,自定義消息處理函數)即可;主要是提供自定義的消息處理函數,原型為:
int msg_handler(int socket, void* buf, uint32_t n),其中: socket-接收消息的socket,buf-消息體內存,n-消息體長度。
幾個關鍵點:
(1)發送和接收n個字節的方法,在readn()和writen()函數實現;
(2)向派生線程傳遞參數時,注意並發導致的同步問題,參見start()函數中的傳參實現;
(3)遵循“malloc和free要成對存在於同一個函數中”,但是(2)違反了這個原則,是否有更好的解決方案?
(4)采用了回調函數機制(類似C#中的事件)來讓庫使用著自定義消息處理函數;(這也是為了遵循(3)采取的策略);
(5)TCP流邊界,采取了(消息大小,消息體)的方式,其中消息大小為4字節無符號整數。
存在問題:
(1)性能問題,目前是直接分配與消息體大小同樣的內存來接收消息體;
(2)大消息問題,目前消息不能大於int32_t的最大值,對於大數據量傳送,請在消息體內實現自定義的用戶消息格式來把大數據分塊傳送;
源碼:tcputil.h
#ifndef TCPUTIL_H
#define TCPUTIL_H
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <sys/types.h>
ssize_t writen(int fd, void* buf, size_t n);
ssize_t recvn(int fd, void* buf, size_t n);
/*callback function called after received one message, 0-success, -1-error*/
typedef int (*message_handler)(int socket, void * buf, uint32_t size);
int start(uint32_t listenip, uint16_t listenport, message_handler handler);
#endif