服务器端
构建进程池实现高并发,高效率
不需要重复创建子进程分配任务
子进程有任务执行
无任务阻塞
3种文件传输技术:
小火车协议
大货车
以及sendfile的0拷贝技术
框架:

头文件
#include <23c.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/time.h>
#include <dirent.h>
#include <sys/stat.h>
#include <unistd.h>
#include <pwd.h>
#include <grp.h>
#include <fcntl.h>
#include <sys/wait.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/sem.h>
#include <sys/msg.h>
#include <sys/select.h>
#include <time.h>
#include <syslog.h>
#define __USE_POSIX
#define __USE_XOPEN_EXTENDED
#include <signal.h>
typedef __sighandler_t sighandler_t;
#define __USE_UNIX98
#include <pthread.h>
#include <errno.h>
#include <stdarg.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netinet/ip.h>
#include <netdb.h>
#include <strings.h>
#include <sys/epoll.h>
#include <sys/mman.h>
#include <sys/sendfile.h>
#define ARGS_CHECK(argc, num) \
{ \
if (argc != num) \
{ \
fprintf(stderr, "Args error\n"); \
return -1; \
} \
}
#define ERROR_CHECK(ret, num, info) \
{ \
if (ret == num) \
{ \
perror(info); \
return -1; \
} \
}
#define THREAD_ERROR_CHECK(ret, info) \
{ \
{ \
if (ret != 0) \
{ \
fprintf(stderr, "%s:%s\n", info, strerror(ret)); \
} \
} \
}
#include "head.h"
#include <23c.h>
//在头文件下定义各种数据结构
//workerdata_t
enum workerStatus{
FREE,
BUSY
};
typedef struct workerdata_s
{
pid_t pid;
int ststus;
int pipefd;
}workerdata_t;
//小火车结构体
typedef struct train_s
{
int length;
char data[1000];
}train_t;
//函数体
int makeChild(workerdata_t*workerDataArr,int workerNum);
int tcpInit(const char *ip, const char *port, int *psockfd);
int sendfd(int Wpipefd,int fdtosend);
int recvfd(int Rpipefd,int *pfdtosend);
int epollCre();//return 一个监听集合epfd
int epollAdd(int epfd,int fd);//往epoll监听加入fd进行监听
int epollDel(int epfd,int fd);//从epoll监听删除fd解除监听
//小火车
int transFile_Small(int netfd);
int transFile_Big(int netfd);
//0拷贝技术 sendfile
int zeroCopySend(int netfd);
Makefile文件
srcs:=server/worker.c server/main.c server/worker.c server/tcpInit.c server/sendfd.c \
server/recvfd.c server/epoll.c server/transFile.c #目前的服务器源码文件
objs:=$(srcs:%.c=%.o)
all:client/client server/server
client/client:client/client.c
gcc $^ -o $@ -lpthread -g
server/server:$(objs) #先编译成.o文件 再链接成可执行程序
gcc $^ -o $@ -lpthread