- 论坛徽章:
- 0
|
本帖最后由 tajial 于 2010-03-29 10:43 编辑
服务器代码如下:- #include <stdlib.h>
- #include <strings.h>
- #include <sys/epoll.h>
- #include <fcntl.h>
- #include <unistd.h>
- #include <sys/socket.h>
- #include <arpa/inet.h>
- #include <errno.h>
- void setnonblocking(int fd)
- {
- int val;
- if ((val = fcntl(fd, F_GETFL)) < 0)
- {
- perror("GETFL");
- exit(1);
- }
- val |= O_NONBLOCK;
- if (fcntl(fd, F_SETFL, val) < 0)
- {
- perror("SETFL");
- exit(1);
- }
- }
- int main()
- {
- int fd, listener, clifd, epfd, i, ret, size;
- struct epoll_event ev, events[16];
- char buf[1024];
- int parent = 1;
- int status;
- int pid;
-
- if ((listener = socket(AF_INET, SOCK_STREAM, 0)) < 0)
- {
- perror("socket");
- exit(1);
- }
- setnonblocking(listener);
- epfd = epoll_create(256);
- if (epfd < 0)
- {
- perror("epoll_create");
- exit(1);
- }
- ev.data.fd = listener;
- ev.events = EPOLLIN | EPOLLET;
- if (epoll_ctl(epfd, EPOLL_CTL_ADD, listener, &ev) < 0)
- {
- perror("epoll_ctl");
- exit(1);
- }
-
- struct sockaddr_in servaddr, cliaddr;
- bzero(&servaddr, sizeof(servaddr));
- servaddr.sin_family = AF_INET;
- servaddr.sin_addr.s_addr = INADDR_ANY;
- servaddr.sin_port = htons(5432);
- if (bind(listener, &servaddr, sizeof(servaddr)) < 0)
- {
- perror("bind");
- exit(1);
- }
- if (listen(listener, 16) < 0)
- {
- perror("listen");
- exit(1);
- }
- for (i = 0; i < 3 && parent; i++)
- {
- switch (fork())
- {
- case -1:
- perror("fork");
- exit(1);
- case 0:
- parent = 0;
- pid = getpid();
- break;
- default:
- break;
- }
- }
- if (parent)
- {
- while ((ret = waitpid(-1, &status, 0)))
- {
- if (ret > 0)
- printf("child %d has quit with %d...\n", ret, status);
- }
- }
- socklen_t len;
- while (1)
- {
- if ((ret = epoll_wait(epfd, events, 1, 600000)) < 0)
- {
- perror("epoll_wait");
- exit(1);
- }
- else if (ret == 0)
- {
- printf("[%d]600s elapsed...\n", pid);
- }
- else
- {
- printf("\n[%d]%d events checkin\n", pid, ret);
- }
- for (i = 0; i < ret; i++)
- {
- if ((fd = events[i].data.fd) < 0)
- {
- printf("Invalid fd!\n");
- exit(1);
- }
-
- if (fd == listener)
- {
- len = sizeof(cliaddr);
- clifd = accept(fd, &cliaddr, &len);
- if (clifd < 0)
- {
- perror("accept");
- continue;
- }
- printf("[%d]New connection from %s:%d,fd=%d\n",pid, inet_ntoa(cliaddr.sin_addr),
- ntohs(cliaddr.sin_port), clifd);
- setnonblocking(clifd);
- ev.data.fd = clifd;
- ev.events = EPOLLIN | EPOLLET;
- if (epoll_ctl(epfd, EPOLL_CTL_ADD, clifd, &ev) < 0)
- {
- perror("epoll_ctl");
- exit(1);
- }
- }
- else if (events[i].events & EPOLLIN)
- {
- while ((size = recv(fd, buf, sizeof(buf), 0)) > 0)
- {
- buf[size] = 0;
- printf("[%d]%d bytes recved from fd %d:%s\n", pid, size, fd, buf);
- }
- printf("[%d]size=%d,fd=%d:%s\n", pid, size, fd, strerror(errno));
- if (size == 0)
- {
- close(fd);
- }
- }
- }
- }
- return 0;
- }
复制代码 |
|