c++网络编程

#include<netinet/in.h>
#include<string.h>
#include<arpa/inet.h>
#include<assert.h>
#include<fcntl.h>
#include<stdio.h>
#include<errno.h>
#include<unistd.h>
#include<sys/socket.h>
#include<sys/epoll.h>

const int MAX_EVENT_NUMBER = 1024;
const int BUFF_SIZE = 256;
int setnonblocking(int fd)
{
int old_option = fcntl(fd,F_GETFL);
int new_option = old_option | O_NONBLOCK;
fcntl(fd,F_SETFL,new_option);
return old_option;
}
void addfd_in(int epollfd,int fd,bool enable_et)
{
epoll_event event;
event.data.fd = fd;
event.events = EPOLLIN;
if(enable_et)
{
event.events |= EPOLLET;
}
epoll_ctl(epollfd,EPOLL_CTL_ADD,fd,&event);
setnonblocking(fd);
}

void epoll_et(epoll_event events,int numEvent, int epollfd,int listenfd)
{
char buff[BUFF_SIZE]={};
for(int i = 0;i<numEvent;++i)
{
int sockfd = events[i].data.fd;
if(sockfd == listenfd)
{
struct sockaddr_in cli_addr;
socklen_t cli_addrlen = sizeof(cli_addr);
int connfd = accept(listenfd,(struct sockaddr
)&cli_addr,&cli_addrlen);
if(connfd < 0)
{
printf(“accept: %d : %s \n”,errno,strerror(errno));
continue;
}
else
{
addfd_in(epollfd,connfd,true);
}
}else if(events[i].events & EPOLLIN)
{
memset(buff,‘\0’,BUFF_SIZE);
int pos = 0;
for(;😉
{
int ret = recv(sockfd,buff+pos,BUFF_SIZE-1-pos,0);
// NONBLOCK
if(ret > 0) { pos += ret; }
else if(ret < 0)
{
if(errno == EAGAIN || errno == EWOULDBLOCK || errno == EINTR)
{
break;
}
printf(“error : %s \n”,strerror(errno));
close(sockfd);
break;
}
else if(ret == 0)
{
close(sockfd); // events[i].data.fd;
printf(“close %d \n”,sockfd);
}
}
buff[pos] = ‘\0’;
printf(“get %d => buff : %s \n”,sockfd,buff);
}
else
{
printf(“something else happened \n”);
}
}
}
int main(int argc,char *argv[]) // mtiltpoll 127.0.0.1 12345
{
const char ip = “127.0.0.1”; //
const int port = 12345;
int ret;
struct sockaddr_in address ={}; //
bzero(&address,sizeof(address));
address.sin_family = AF_INET; // PF_INET;
inet_pton(AF_INET,ip,&address.sin_addr);
address.sin_port = htons(port); //
int listenfd = socket(PF_INET,SOCK_STREAM,0); //
assert(listenfd >= 0);
ret = bind(listenfd,(struct sockaddr
)&address,sizeof(address));
assert(ret != -1);
ret = listen(listenfd,5); //
assert(ret != -1);
struct epoll_event events[MAX_EVENT_NUMBER]={};

int epollfd = epoll_create(5); // epoll_create(); epoll_create1();
assert(epollfd != -1);

addfd_in(epollfd,listenfd,true);

for(;;)
{
    int ret = epoll_wait(epollfd,events,MAX_EVENT_NUMBER,-1);
    if(ret == 0) 
    {
        continue;
    }
    if(ret < 0)
    {
        printf("epoll failuer %d : %s \n",errno,strerror(errno));
        break;
    }
    epoll_et(events,ret,epollfd,listenfd);
}
close(epollfd);
close(listenfd);
return 0;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值