コード例 #1
0
ファイル: iocp_echo_server.c プロジェクト: adrianacaciur/PiTV
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;
}
コード例 #2
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;
}
コード例 #3
0
ファイル: net.c プロジェクト: stoned7/kopou
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;
}