server端父进程accept连接后,通过msg发给子进程;子进程收到msg取出其中的fd,将fd加入epoll进行读写通信。
server 代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <sys/epoll.h>
#include <unistd.h>
#include <sys/types.h>
#define IPADDRESS "127.0.0.1"
#define PORT 8787
#define MAXSIZE 1024
#define LISTENQ 5
#define FDSIZE 1000
#define EPOLLEVENTS 100
//父进程处理
static void father_func(int son_pid, int master_fd);
//创建套接字并进行绑定
static int socket_bind(const char* ip, int port);
//发送fd 消息给子进程
static void send_fd_to_son(int clifd, int master_fd);
//子进程处理
static void son_func(int worker_fd);
//IO多路复用epoll
static void do_epoll(int worker_fd);
//事件处理函数
static void handle_events(int epollfd, struct epoll_event *events, int num, int worker_fd, char *buf);
//从父进程接收fd 消息
static void recv_fd_from_father(int epollfd, int worker_fd);
//读处理
static void do_read(int epollfd, int fd, char *buf);
//写处理
static void do_write(int epollfd, int fd, char *buf);
//添加事件
static void add_event(int epollfd, int fd, int state);
//修改事件
static void delete_event(int epollfd, int fd, int state);
//删除事件
static void modify_event(int epollfd, int fd, int state);
int main(int argc, char *argv[])
{
pid_t pid;
int fds[2];
int master_fd, worker_fd;
if(socketpair(AF_UNIX, SOCK_STREAM, 0, fds) == -1) {
perror("socketpair error:");
return -1;
}
master_fd = fds[0];
worker_fd = fds[1];
switch(pid = fork()) {
case -1:
perror("fork error:");
return -1;
case 0:
close(master_fd);
son_func(worker_fd);
break;
default:
close(worker_fd);
father_func(pid, master_fd);
break;
}
return 0;
}
static void father_func(int son_pid, int master_fd)
{
int listenfd = -1;
if(waitpid(son_pid, NULL, 0) != son_pid) {
perror("waitpid error:");
return;
}
listenfd = socket_bind(IPADDRESS,PORT);
listen(listenfd,LISTENQ);
for( ; ; ) {
int clifd = accept(listenfd, NULL, NULL);
if (clifd