简单的Linux环境下多线程TCP服务程序框架


运行环境: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

  • 1
  • 2
  • 3
  • 下一页

相关内容