#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdlib.h>
#include <string.h>
#include <sys/epoll.h>
#define BUFFER_SIZE 40
#define MAX_EVENTS 10
int main(int argc, char * argv[])
{
int server_sockfd;// 服务器端套接字
int connect_fd;// 客户端套接字
int len;
struct sockaddr_in my_addr; // 服务器网络地址结构体
struct sockaddr_in remote_addr; // 客户端网络地址结构体
int sin_size;
char buf[BUFFER_SIZE];
char sendbuf[BUFFER_SIZE]; // 数据传送的缓冲区
memset(&my_addr,0,sizeof(my_addr)); // 数据初始化--清零
my_addr.sin_family=AF_INET; // 设置为IP通信
my_addr.sin_addr.s_addr=INADDR_ANY;// 服务器IP地址--允许连接到所有本地地址上
my_addr.sin_port=htons(9998); // 服务器端口号
// 创建服务器端套接字--IPv4协议,面向连接通信,TCP协议
if((server_sockfd=socket(PF_INET,SOCK_STREAM,0))<0)
{
perror("socket");
return 1;
}
// 将套接字绑定到服务器的网络地址上
if (bind(server_sockfd,(struct sockaddr *)&my_addr,sizeof(struct sockaddr))<0)
{
perror("bind");
return 1;
}
// 监听连接请求--监听队列长度为5
listen(server_sockfd,5);
sin_size=sizeof(struct sockaddr_in);
int epoll_fd;
epoll_fd=epoll_create(MAX_EVENTS);//创建一个epoll句柄
if(epoll_fd==-1)
{
perror("epoll_create failed");
exit(EXIT_FAILURE);
}
struct epoll_event ev; // epoll事件结构体 内涵两个数据events与data
struct epoll_event events[MAX_EVENTS];// 事件监听队列
ev.events=EPOLLIN;
ev.data.fd=server_sockfd;//结构体内嵌联合体
// 向epoll注册server_sockfd监听事件,加入到epoll的监听队列中
if(epoll_ctl(epoll_fd,EPOLL_CTL_ADD,server_sockfd,&ev)==-1)
{
perror("epll_ctl:server_sockfd register failed");
exit(EXIT_FAILURE);
}
int nfds;// epoll监听事件发生的个数
// 循环接受客户端请求
while(1)
{
// 等待事件发生
nfds=epoll_wait(epoll_fd,events,MAX_EVENTS,-1);
if(nfds==-1)
{
perror("start epoll_wait failed");
exit(EXIT_FAILURE);
}
int i;
for(i=0;i<nfds;i++)
{
// 客户端有新的连接请求
if(events[i].data.fd==server_sockfd)
{
// 等待客户端连接请求到达,调用accept函数
if((connect_fd=accept(server_sockfd,(struct sockaddr *)&remote_addr,&sin_size))<0)
{
perror("accept failed");
exit(EXIT_FAILURE);
}
// 向epoll注册connect_fd监听事件
ev.events=EPOLLIN;
ev.data.fd=connect_fd;
if(epoll_ctl(epoll_fd,EPOLL_CTL_ADD,connect_fd,&ev)==-1)
{
perror("epoll_ctl:connect_fd register failed");
exit(EXIT_FAILURE);
}
printf("accept client %s\n",inet_ntoa(remote_addr.sin_addr));
}
// 客户端有数据发送过来
else
{
len=recv(connect_fd,buf,BUFFER_SIZE,0);
if(len<0)
{
perror("receive from client failed");
exit(EXIT_FAILURE);
}
printf("receive from client:%s",buf);
send(connect_fd,"I have received your message.\n",30,0);
memset(buf, 0, sizeof(buf));
fgets(sendbuf, 4096, stdin);
send(connect_fd, sendbuf, strlen(sendbuf),0);
}
}
}
return 0;
}
---------------------
作者:向念博客
来源:CSDN
原文:https://blog.csdn.net/XN6666/article/details/80352057
版权声明:本文为博主原创文章,转载请附上博文链接!