Untitled
unknown
c_cpp
3 years ago
3.8 kB
6
Indexable
#include<sys/socket.h>
#include<sys/epoll.h>
#include<arpa/inet.h>
#include<fcntl.h>
#include<errno.h>
#include<string.h>
#include<iostream>
#include<unistd.h>
using namespace std;
#define MAX_LINE 100
#define MAX_EVENTS 500
#define MAX_LISTENFD 5
int listen_on(int port)
{
int on=1;
int listenfd = socket(AF_INET, SOCK_STREAM, 0);
struct sockaddr_in servaddr;
/* allow immediate reuse of the port */
fcntl(listenfd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
servaddr.sin_port = htonl(port);
if(bind(listenfd, (sockaddr*)&servaddr, sizeof(servaddr))<0){
cerr<<"bind"<<endl;
}
if(listen(listenfd, MAX_LISTENFD)<0){
cerr<<"listen"<<endl;
}
return listenfd;
}
int main(int argc, char** argv)
{
struct epoll_event ev, events[MAX_EVENTS];
int listenfd, connfd, sockfd;
int read_len;
char line[MAX_LINE];
struct sockaddr_in cli_addr;
socklen_t cli_len = sizeof(struct sockaddr_in);
int epoll_fd = epoll_create(1);
if(epoll_fd<0){
cout<<"epoll_fd<0"<<endl;
}
listenfd = listen_on(12345);
ev.data.fd = listenfd;
ev.events = EPOLLIN;
epoll_ctl(epoll_fd, EPOLL_CTL_ADD, listenfd, &ev);
for(;;){
int num_events = epoll_wait(epoll_fd,events, MAX_EVENTS,-1);
if(num_events<0) {
cerr<< "err: "<< errno<<endl;
break;
}
for (size_t i = 0; i < num_events; i++)
{
if(events[i].data.fd==listenfd){
struct sockaddr_in cli_addr1;
socklen_t cli_len;
int fd = accept(listenfd, (struct sockaddr*)&cli_addr1, &cli_len);
if(fd>0){
cout<<"new connection from "
<<"["<<inet_ntoa(cli_addr1.sin_addr)
<<":"<<ntohs(cli_addr1.sin_port)
<<"#"<<fd<<"] accepted!"<<endl;
}else{
cerr<<"accept error: "<<errno<<endl;
}
fcntl(fd, F_SETFL, O_NONBLOCK);
ev.data.fd = fd;
ev.events = EPOLLIN;
if(epoll_ctl(epoll_fd, EPOLL_CTL_ADD, fd, &ev)<0){
cerr<<"ctl error: "<<errno<<endl;
}
}else if(events[i].events & EPOLLIN){
struct sockaddr_in addr;
socklen_t socklen = sizeof(struct sockaddr_in);
int rdfd = events[i].data.fd;
int res = getpeername(rdfd, (struct sockaddr*)&addr, &socklen);
if(rdfd<0){
cerr<<"rdfd<0: "<<errno<<endl;
continue;
}
char *buf[MAX_LINE];
int nbytes=0;
if((nbytes = read(rdfd, buf, MAX_LINE))<0){
if(errno==ECONNRESET){
cerr << "ECONNREST closed socket fd:" << events[i].data.fd << endl;
close(sockfd);
}
}else if(nbytes==0){
cerr<<"connection closed by peer: ["<<inet_ntoa(addr.sin_addr)
<<":"<<ntohs(addr.sin_port)<<"#"<<rdfd<<"]"<<endl;
}else{
if(write(rdfd, buf, nbytes)!=nbytes){
cout<<"write not finish at once: ["<<inet_ntoa(addr.sin_addr)
<<":"<<ntohs(addr.sin_port)<<"#"<<rdfd<<"]"<<endl;
}
}
}
}
}
//The device (normally a client) has sent a synchronize (SYN) message and is waiting for a matching SYN from the other
}
Editor is loading...