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