1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109
| typedef struct zv_connect_s { int fd;
ZVCALLBACK cb;
char rbuffer[BUFFER_LENGTH]; int rc; int count; char wbuffer[BUFFER_LENGTH]; int wc;
char resource[BUFFER_LENGTH]; int enable_sendfile;
struct zv_kvstore_s *kvheader;
} zv_connect_t;
int send_cb(int fd, int event, void *arg) {
zv_reactor_t *reactor = (zv_reactor_t *)arg; zv_connect_t *conn = zv_connect_idx(reactor, fd);
zv_http_response(conn);
send(fd, conn->wbuffer, conn->wc, 0);
if (conn->enable_sendfile) { int filefd = open(conn->resource, O_RDONLY); if (filefd == -1) { printf("open file %s failed!\n", conn->resource); return -1; } struct stat stat_buf; fstat(filefd, &stat_buf); int ret = sendfile(fd, filefd, NULL, stat_buf.st_size); if (ret == -1) { printf("errno: %d\n", errno); } close(filefd); }
conn->cb = recv_cb;
struct epoll_event ev; ev.events = EPOLLIN; ev.data.fd = fd; epoll_ctl(reactor->epfd, EPOLL_CTL_MOD, fd, &ev); }
int recv_cb(int fd, int event, void *arg) {
zv_reactor_t *reactor = (zv_reactor_t *)arg; zv_connect_t *conn = zv_connect_idx(reactor, fd);
int ret = recv(fd, conn->rbuffer + conn->rc, conn->count, 0); if (ret < 0) { } else if (ret == 0) {
conn->fd = -1; conn->rc = 0; conn->wc = 0;
epoll_ctl(reactor->epfd, EPOLL_CTL_DEL, fd, NULL);
close(fd);
return -1; } else { conn->rc += ret; printf("rbuffer: %s, ret: %d\n", conn->rbuffer, conn->rc);
zv_http_request(conn);
conn->cb = send_cb;
struct epoll_event ev; ev.events = EPOLLOUT; ev.data.fd = fd; epoll_ctl(reactor->epfd, EPOLL_CTL_MOD, fd, &ev); } }
|