接口:
// 创建epoll套接字 返回socket_server*上下文
struct socket_server * socket_server_create();
// 释放资源
void socket_server_release(struct socket_server *);
// IO循环
int socket_server_poll(struct socket_server *, struct socket_message *result, int *more);
// 通知退出,停止IO循环
void socket_server_exit(struct socket_server *);
// 关闭连接
void socket_server_close(struct socket_server *, uintptr_t opaque, int id);
// 开始将fd加入epoll列表
void socket_server_start(struct socket_server *, uintptr_t opaque, int id);
// return -1 when error
// 发送消息
int64_t socket_server_send(struct socket_server *, int id, const void * buffer, int sz);
// ctrl command below returns id 以下返回id
// 监听端口(为加入epoll列表)
int socket_server_listen(struct socket_server *, uintptr_t opaque, const char * addr, int port, int backlog);
// 创建非阻塞连接并加入epoll列表
int socket_server_connect(struct socket_server *, uintptr_t opaque, const char * addr, int port);
// 绑定某个fd到epoll列表
int socket_server_bind(struct socket_server *, uintptr_t opaque, int fd);
// 创建阻塞连接
int socket_server_block_connect(struct socket_server *, uintptr_t opaque, const char * addr, int port);
// 添加“读管道”到epoll管理列表
if (sp_add(efd, fd[0], NULL)) {
// add recvctrl_fd to event poll
fprintf(stderr, "socket-server: can't add server fd to event pool.\n");
close(fd[0]);
close(fd[1]);
sp_release(efd);
return NULL;
}
// socket上下文
struct socket_server *ss = MALLOC(sizeof(*ss));
ss->event_fd = efd; // epoll套接字
ss->recvctrl_fd = fd[0]; // 读管道
ss->sendctrl_fd = fd[1]; // 写管道
ss->checkctrl = 1; // 检查标志
这里的fd[1]也就是写管道,它用来向epoll列表中创建,监听,开始监听的一些操作
// 连接127.0.0.1主机的80端口
int c = socket_server_connect(ss,100,"127.0.0.1",80);
// 监听127.0.0.1主机的8888端口
int l = socket_server_listen(ss,200,"127.0.0.1",8888,32);
// 加入epoll列表
socket_server_start(ss,201,l);
// 把标准输出加入epoll列表
int b = socket_server_bind(ss,300,1);
其中的fd[0] fd[1]是阻塞的