int main(void) { BOOL bRet; HANDLE hRet; wsa_init(); iocp = w_iocp_create(); DIE(iocp == NULL, "w_iocp_create"); /* Create server socket. */ listenfd = tcp_create_listener(ECHO_LISTEN_PORT, DEFAULT_LISTEN_BACKLOG); DIE(listenfd == INVALID_SOCKET, "tcp_create_listener"); hRet = w_iocp_add_handle(iocp, (HANDLE) listenfd); DIE(hRet != iocp, "w_iocp_add_handle"); /* Use AcceptEx to schedule new connection acceptance. */ create_iocp_accept(); dlog(LOG_INFO, "Server waiting for connections on port %d\n", ECHO_LISTEN_PORT); /* server main loop */ while (1) { OVERLAPPED *ovp; ULONG_PTR key; DWORD bytes; /* Wait for overlapped I/O. */ bRet = w_iocp_wait(iocp, &bytes, &key, &ovp); if (bRet == FALSE) { DWORD err; err = GetLastError(); if (err == ERROR_NETNAME_DELETED) { connection_remove((struct connection *) key); continue; } DIE(bRet == FALSE, "w_iocp_wait"); } /* * Switch I/O notification types. Consider * - new connection requests (on server socket); * - socket communication (on connection sockets). */ if (key == listenfd) { dlog(LOG_DEBUG, "New connection\n"); handle_new_connection(ovp); } else { handle_aio((struct connection *) key, bytes, ovp); } } wsa_cleanup(); return 0; }
int main(void) { SOCKET listenfd; /* server socket */ SOCKET connectfd; /* client communication socket */ wsa_init(); /* create server socket */ listenfd = tcp_create_listener(SIMPLE_WEB_LISTEN_PORT, DEFAULT_LISTEN_BACKLOG); DIE(listenfd < 0, "tcp_create_listener"); connectfd = accept_connection(listenfd); receive_request(connectfd); send_reply(connectfd); closesocket(listenfd); wsa_cleanup(); return 0; }
int main(int argc, char **argv) { int server; int efd; struct epoll_event ev, events[10]; server = tcp_create_listener(7878, 1024, 0); if (server == TCP_ERR) { printf("server creation fail\n"); return EXIT_FAILURE; } efd = epoll_create(10); if (efd == -1) { perror("epoll_create"); exit(EXIT_FAILURE); } ev.events = EPOLLIN; ev.data.fd = server; epoll_ctl(efd, EPOLL_CTL_ADD, server, &ev); printf("server listening ...\n"); int etfd; int n; long ecounter = 0; while(1) { etfd = epoll_wait(efd, events, 10, -1); ecounter++; if (etfd == -1) { printf("ecounter:%ld\n", ecounter); perror("epoll_wait"); exit(EXIT_FAILURE); } for (n = 0; n < etfd; ++n) { if ((events[n].events & EPOLLERR) || (events[n].events & EPOLLHUP)) //&& ((!events[n].events & EPOLLIN) //|| (!events[n].events & EPOLLOUT)) { printf("ecounter:%ld\n", ecounter); perror("epoll error"); close (events[n].data.fd); continue; } if (events[n].data.fd == server) { printf("ecounter:%ld\n", ecounter); char ip[64]; int port; int tryagain; int cli = tcp_accept(server, ip, 64, &port, 1, &tryagain); if (cli == TCP_ERR) { printf("tryagain: %d\n", tryagain); printf("accept(): %s\n", strerror(errno)); continue; } //tcp_set_keepalive(cli, 10); printf("-----> Client: %s:%d\n", ip, port); ev.events = EPOLLIN; ev.data.fd = cli; epoll_ctl(efd, EPOLL_CTL_ADD, cli, &ev); } else { if (events[n].events & EPOLLIN) { printf("ecounter:%ld\n", ecounter); printf("%d ready for read\n", events[n].data.fd); int cli = events[n].data.fd; int tryagain; char buf[16]; int isreadonce = 0; ssize_t nread; memset(buf, '\0', 16); nread = tcp_read(cli, buf, 16, &tryagain); if (nread > 0) { printf("Read: %zd:%d:%s\n", nread,tryagain, buf); ev.events = events[n].events; ev.events |= EPOLLOUT; ev.data.fd = events[n].data.fd; int rct = epoll_ctl(efd, EPOLL_CTL_MOD, ev.data.fd, &ev); if (rct == -1) perror("r:epoll_ctl_mod"); } else { if (tryagain) { printf("completed reading: %zd, tryagain:%d\n", nread, tryagain); printf("read(): %s\n", strerror(errno)); break; } else { printf("client down: %zd\n", nread); printf("read(): %s\n", strerror(errno)); tcp_close(cli); break; } } } if (events[n].events & EPOLLOUT) { printf("ecounter:%ld\n", ecounter); printf("%d ready for write\n",events[n].data.fd); int tryagain; char *buf = "helloresponse"; ssize_t written = tcp_write(events[n].data.fd, buf, 13, &tryagain); printf("written: %zd, tryagain: %d\n", written, tryagain); ev.events = events[n].events; ev.events = EPOLLIN; ev.data.fd = events[n].data.fd; int rct = epoll_ctl(efd, EPOLL_CTL_MOD, ev.data.fd, &ev); if (rct == -1) perror("w:epoll_ctl_mod"); } } } } return EXIT_SUCCESS; }