#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <netinet/in.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/epoll.h>
int setnonblocking(int s);
int do_use_fd(int s);
int main()
{
printf("server starting.../n");
int n;
#define MAX_EVENTS 10
struct epoll_event ev, events[MAX_EVENTS];
int listen_sock, conn_sock, nfds, epollfd;
struct my_epoll_data
{
int fd;
char* desc;
} myevd;
struct sockaddr_in servaddr;
struct sockaddr local;
socklen_t addrlen = sizeof(local);
listen_sock = socket(AF_INET, SOCK_STREAM, 0);
if (listen_sock == -1)
{
perror("socket");
exit(EXIT_FAILURE);
}
memset(&servaddr, 0, sizeof(servaddr));
servaddr.sin_port = htons(10000);
if (bind(listen_sock, (struct sockaddr*)&servaddr, sizeof(servaddr)) == -1)
{
perror("bind");
exit(EXIT_FAILURE);
}
if (listen(listen_sock, 5) == -1)
{
perror("bind");
exit(EXIT_FAILURE);
}
/* Set up listening socket, 'listen_sock' (socket(),
bind(), listen()) */
epollfd = epoll_create(10);
if (epollfd == -1) {
perror("epoll_create");
exit(EXIT_FAILURE);
}
ev.events = EPOLLIN;
myevd.fd = listen_sock;
myevd.desc = "hello, epoll/n";
ev.data.ptr = &myevd;
if (epoll_ctl(epollfd, EPOLL_CTL_ADD, listen_sock, &ev) == -1) {
perror("epoll_ctl: listen_sock");
exit(EXIT_FAILURE);
}
for (;;) {
nfds = epoll_wait(epollfd, events, MAX_EVENTS, -1);
if (nfds == -1) {
perror("epoll_pwait");
exit(EXIT_FAILURE);
}
for (n = 0; n < nfds; ++n) {
struct my_epoll_data* pmevd = (struct my_epoll_data*)events[n].data.ptr;
if (pmevd->fd == listen_sock) {
conn_sock = accept(listen_sock,
(struct sockaddr *) &local, &addrlen);
if (conn_sock == -1) {
perror("accept");
exit(EXIT_FAILURE);
}
printf("%s/n", pmevd->desc);
setnonblocking(conn_sock);
ev.events = EPOLLIN | EPOLLET;
myevd.fd = conn_sock;
myevd.desc = 0;
ev.data.ptr = &myevd;
if (epoll_ctl(epollfd, EPOLL_CTL_ADD, conn_sock,
&ev) == -1) {
perror("epoll_ctl: conn_sock");
exit(EXIT_FAILURE);
}
} else {
do_use_fd(pmevd->fd);
}
}
}
printf("server exiting.../n");
return 0;
}
int setnonblocking(int s)
{
long flag = fcntl(s, F_GETFL, 0);
return fcntl(s, F_SETFL, flag|O_NONBLOCK);
}
int do_use_fd(int s)
{
char buf[1024] = {0};
int len = 1024;
len = recv(s, buf, len, 0);
if (len > 0)
printf("%s/n", buf);
else
return -1;
return 0;
}
epoll代码实例
最新推荐文章于 2022-04-01 22:08:53 发布