1*a9643ea8Slogwang #include <stdio.h> 2*a9643ea8Slogwang #include <stdlib.h> 3*a9643ea8Slogwang #include "mt_incl.h" 4*a9643ea8Slogwang #include "micro_thread.h" 5*a9643ea8Slogwang 6*a9643ea8Slogwang using namespace NS_MICRO_THREAD; 7*a9643ea8Slogwang 8*a9643ea8Slogwang int set_fd_nonblock(int fd) 9*a9643ea8Slogwang { 10*a9643ea8Slogwang int nonblock = 1; 11*a9643ea8Slogwang return ioctl(fd, FIONBIO, &nonblock); 12*a9643ea8Slogwang } 13*a9643ea8Slogwang 14*a9643ea8Slogwang int create_tcp_sock() 15*a9643ea8Slogwang { 16*a9643ea8Slogwang int fd; 17*a9643ea8Slogwang fd = socket(AF_INET, SOCK_STREAM, 0); 18*a9643ea8Slogwang if (fd < 0) { 19*a9643ea8Slogwang fprintf(stderr, "create tcp socket failed, error: %m\n"); 20*a9643ea8Slogwang return -1; 21*a9643ea8Slogwang } 22*a9643ea8Slogwang if (set_fd_nonblock(fd) == -1) { 23*a9643ea8Slogwang fprintf(stderr, "set tcp socket nonblock failed\n"); 24*a9643ea8Slogwang return -1; 25*a9643ea8Slogwang } 26*a9643ea8Slogwang 27*a9643ea8Slogwang return fd; 28*a9643ea8Slogwang } 29*a9643ea8Slogwang 30*a9643ea8Slogwang void echo(void *arg) 31*a9643ea8Slogwang { 32*a9643ea8Slogwang int ret; 33*a9643ea8Slogwang int *p = (int *)arg; 34*a9643ea8Slogwang int clt_fd = *p; 35*a9643ea8Slogwang delete p; 36*a9643ea8Slogwang char buf[64 * 1024]; 37*a9643ea8Slogwang while (true) { 38*a9643ea8Slogwang ret = mt_recv(clt_fd, (void *)buf, 64 * 1024, 0, -1); 39*a9643ea8Slogwang if (ret < 0) { 40*a9643ea8Slogwang printf("recv from client error\n"); 41*a9643ea8Slogwang break; 42*a9643ea8Slogwang } 43*a9643ea8Slogwang ret = mt_send(clt_fd, (void *)buf, ret, 0, 1000); 44*a9643ea8Slogwang if (ret < 0) { 45*a9643ea8Slogwang //printf("send data to client error\n"); 46*a9643ea8Slogwang break; 47*a9643ea8Slogwang } 48*a9643ea8Slogwang } 49*a9643ea8Slogwang close(clt_fd); 50*a9643ea8Slogwang } 51*a9643ea8Slogwang 52*a9643ea8Slogwang int echo_server() 53*a9643ea8Slogwang { 54*a9643ea8Slogwang struct sockaddr_in addr; 55*a9643ea8Slogwang addr.sin_family = AF_INET; 56*a9643ea8Slogwang addr.sin_addr.s_addr = INADDR_ANY; 57*a9643ea8Slogwang addr.sin_port = htons(80); 58*a9643ea8Slogwang 59*a9643ea8Slogwang int fd = create_tcp_sock(); 60*a9643ea8Slogwang if (fd < 0) { 61*a9643ea8Slogwang fprintf(stderr, "create listen socket failed\n"); 62*a9643ea8Slogwang return -1; 63*a9643ea8Slogwang } 64*a9643ea8Slogwang 65*a9643ea8Slogwang if (bind(fd, (struct sockaddr *)&addr, sizeof(addr)) < 0) { 66*a9643ea8Slogwang close(fd); 67*a9643ea8Slogwang fprintf(stderr, "bind failed [%m]\n"); 68*a9643ea8Slogwang return -1; 69*a9643ea8Slogwang } 70*a9643ea8Slogwang 71*a9643ea8Slogwang if (listen(fd, 1024) < 0) { 72*a9643ea8Slogwang close(fd); 73*a9643ea8Slogwang fprintf(stderr, "listen failed [%m]\n"); 74*a9643ea8Slogwang return -1; 75*a9643ea8Slogwang } 76*a9643ea8Slogwang int clt_fd = 0; 77*a9643ea8Slogwang int *p; 78*a9643ea8Slogwang while (true) { 79*a9643ea8Slogwang struct sockaddr_in client_addr; 80*a9643ea8Slogwang int addr_len = sizeof(client_addr); 81*a9643ea8Slogwang 82*a9643ea8Slogwang clt_fd = mt_accept(fd, (struct sockaddr*)&client_addr, (socklen_t*)&addr_len, -1); 83*a9643ea8Slogwang if (clt_fd < 0) { 84*a9643ea8Slogwang mt_sleep(1); 85*a9643ea8Slogwang continue; 86*a9643ea8Slogwang } 87*a9643ea8Slogwang if (set_fd_nonblock(clt_fd) == -1) { 88*a9643ea8Slogwang fprintf(stderr, "set clt_fd nonblock failed [%m]\n"); 89*a9643ea8Slogwang break; 90*a9643ea8Slogwang } 91*a9643ea8Slogwang 92*a9643ea8Slogwang p = new int(clt_fd); 93*a9643ea8Slogwang mt_start_thread((void *)echo, (void *)p); 94*a9643ea8Slogwang } 95*a9643ea8Slogwang return 0; 96*a9643ea8Slogwang } 97*a9643ea8Slogwang 98*a9643ea8Slogwang int main(int argc, char *argv[]) 99*a9643ea8Slogwang { 100*a9643ea8Slogwang mt_init_frame("./config.ini", argc, argv); 101*a9643ea8Slogwang echo_server(); 102*a9643ea8Slogwang } 103