#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <sys/epoll.h>
#define BUFLEN 128
int createSocket(short port){
int serverFd,clientFd;
int len,ret,rlen;
struct sockaddr_in serverAddr;
len = sizeof(serverAddr);
serverFd = socket(AF_INET,SOCK_STREAM,0);
serverAddr.sin_family = AF_INET;
serverAddr.sin_port = htons(port);
serverAddr.sin_addr.s_addr = 0; //inet_addr("192.168.3.120");
int reuse = 1;
setsockopt(serverFd,SOL_SOCKET,SO_REUSEADDR,&reuse,sizeof(int));
ret = bind(serverFd,(struct sockaddr *)&serverAddr,len);
if(ret<0){
perror("Failed to bind");
return -1;
}
ret = listen(serverFd,10);
if(ret<0){
perror("Failed to bind");
return -1;
}
return serverFd;
}
int main(int argc,char ** argv){
int sockfd;
short port;
int addrlen;
struct sockaddr_in serverAddr,clientAddr;
addrlen = sizeof(serverAddr);
char buf[BUFLEN];
if(argc!=2){
printf("Usage:%s port\n",argv[0]);
return 0;
}
port = atoi(argv[1]);
sockfd = createSocket(port);
if(sockfd<0){
return -1;
}
int epfd;
int ret;
int rdlen;
int i;
int clientFd;
struct epoll_event event;
struct epoll_event events[20];
memset(events,0,20*sizeof(struct epoll_event));
event.events = EPOLLIN ;
event.data.fd = sockfd;
epfd = epoll_create(1);
epoll_ctl(epfd, EPOLL_CTL_ADD, sockfd, &event);
while(1){
ret = epoll_wait(epfd, events,20, -1); //阻塞等待时间到来
printf("epoll_wait return=%d\n",ret);
for(i=0;i<ret;i++){ //轮训到达的事件
if(events[i].data.fd == sockfd){//如果是监听的文件描述符有事件到来,接收新连接
clientFd = accept(events[i].data.fd,(struct sockaddr *)&clientAddr, &addrlen);
printf("new client %s,port=%d \n",inet_ntoa(clientAddr.sin_addr),ntohs(clientAddr.sin_port));
event.events = EPOLLIN;
event.data.fd = clientFd;
epoll_ctl(epfd, EPOLL_CTL_ADD, clientFd, &event);
}else{ //否则,是连接的客户端事件,读取数据
rdlen = read(events[i].data.fd,buf,BUFLEN);
if(rdlen>0){
printf("read buf=%s\n",buf);
}else if (rdlen==0){//客户连接中断,删除epoll监听的客户端文件描述符
event.events = EPOLLIN;
event.data.fd = events[i].data.fd;
epoll_ctl(epfd, EPOLL_CTL_DEL, events[i].data.fd, &event);
}
}
}
}
}
epoll服务器
于 2023-04-20 16:23:26 首次发布