服务端
#include<iostream>
#include<stdio.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<assert.h>
#include<unistd.h>
#include<string.h>
#include<string>
#include<stdlib.h>
#include<fcntl.h>
#include<sys/epoll.h>
#include<errno.h>
using namespace std;
//非阻塞
int setnoblocking(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;
}
//添加socket至epollfd
void addfd(int epollfd,int fd,bool et){
epoll_event event;
event.data.fd=fd;
event.events=EPOLLIN;
if(et){
event.events |=EPOLLET;
}
epoll_ctl(epollfd,EPOLL_CTL_ADD,fd,&event);
setnoblocking(fd);
}
//et模式
void et(epoll_event*events,int number,int epollfd,int listenfd){
char buf[10];
for(int b=0;b<number;b++){
int sockfd=events[b].data.fd;
if(sockfd==listenfd){
struct sockaddr_in clnt_addr;
socklen_t clntlen=sizeof(clnt_addr);
int connfd=accept(listenfd,(struct sockaddr*)&clnt_addr,&clntlen);
addfd(epollfd,connfd,true);
}
else if(events[b].events & EPOLLIN){
while(true){
memset(buf,'\0',10);
int ret=recv(sockfd,buf,9,0);
if(ret<0){
if((errno==EAGAIN)||(errno==EWOULDBLOCK)){
cout<<"read later"<<endl;
break;
}
close(sockfd);
break;
}
else if(ret==0){
close(sockfd);
}
else{
cout<<buf<<endl;
}
}
}
}
}
int main(int argc,char* argv[]){
int ret=0;
struct sockaddr_in serve_adr;
int clnt_adr_size;
const char* ip=argv[1];
const char* port=argv[2];
memset(&serve_adr,0,sizeof(serve_adr));
serve_adr.sin_family=AF_INET;
serve_adr.sin_addr.s_addr=inet_addr(argv[1]);
serve_adr.sin_port=htons(atoi(argv[2]));
int listenfd=socket(PF_INET,SOCK_STREAM,0);
assert(listenfd>=0);
ret=bind(listenfd,(struct sockaddr*)&serve_adr,sizeof(serve_adr));
assert(ret!=-1);
epoll_event events[1024];
int epollfd=epoll_create(5);
assert(epollfd!=-1);
addfd(epollfd,listenfd,true);
while(true){
int ret=epoll_wait(epollfd,events,1024,-1);
if(ret<0){
cout<<"epoll failure"<<endl;
break;
}
et(events,ret,epollfd,listenfd);
}
close(listenfd);
return 0;
}
客户端
#include<iostream>
#include<stdio.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<assert.h>
#include<unistd.h>
#include<string.h>
#include<string>
#include<stdlib.h>
#include<fcntl.h>
#include<sys/epoll.h>
#include<string>
using namespace std;
int setnoblocking(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;
}
int main(int argc,char * argv[]){
int ret=0;
struct sockaddr_in serve_adr,clnt_adr;
int clnt_adr_size;
const char* ip=argv[1];
const char* port=argv[2];
memset(&serve_adr,0,sizeof(serve_adr));
serve_adr.sin_family=AF_INET;
serve_adr.sin_addr.s_addr=inet_addr(argv[1]);
serve_adr.sin_port=htons(atoi(argv[2]));
int sockfd=socket(PF_INET,SOCK_STREAM,0);
assert(sockfd>=0);
if(connect(sockfd,(struct sockaddr*)&serve_adr,sizeof(serve_adr))<0){
perror("connect failed");
close(sockfd);
return -1;
}
setnoblocking(sockfd);
string x;
cin>>x;
const char*a=x.data();
write(sockfd,a,sizeof(a));
close(sockfd);
return 0;
}