- 论坛徽章:
- 0
|
我现在再用epoll 进行测试 但是总有个问题 比较郁闷 如下:
server 端
监听的socket 为阻塞模式
epoll 设为 ET 模式
在监听的过程中以下面的模式主
while(1){
epoll_wait();
if(events.data.fd==listenfd)
{
//处理 新来的socket 连接
// 调用 accept 产生新的fd
// 把新的fd 设为非阻塞
// 以ET模式加入到epoll中
} else if(events.events&EPOLLIN){
//处理读事件
}else if(events.events&EPOLLOUT) {
//处理写事件
}
}
client 端
建立一个socket 阻塞模式
调用 connect
不调用任何函数 直接sleep(1000000)
上述 过程执行后 server端 出现一次 连接信号(events.data.fd==listenfd)
出现一次 写请求(events.events&EPOLLOUT)
我的问题是 在客户端 我没有调用 recv 为什么在server 会出现 写请求?
各位大侠 给点指点 。。。。。 有关这方面的资料讨论也行啊 。。。
跪谢。。
下面是详细代码 server
#include <iostream>
#include <sys/socket.h>
#include <sys/epoll.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <signal.h>
using namespace std;
#define MAXLINE 100
#define OPEN_MAX 100
#define LISTENQ 20
#define SERV_PORT 5000
#define INFTIM 1000
void setnonblocking(int sock)
{
int opts;
opts=fcntl(sock,F_GETFL);
if(opts<0)
{
perror("fcntl(sock,GETFL)" ;
exit(1);
}
opts = opts|O_NONBLOCK;
if(fcntl(sock,F_SETFL,opts)<0)
{
perror("fcntl(sock,SETFL,opts)" ;
exit(1);
}
}
void sig_quit(int no)
{
cout<<"donothing"<<endl;
signal(SIGPIPE,sig_quit);
}
main()
{
int port=5000;
int epfd;
int listenfd;
int nfds;
int sockfd;
struct epoll_event ev;
struct epoll_event events[20];
epfd=epoll_create(256);
struct sockaddr_in caddr;
struct sockaddr_in saddr;
listenfd=socket(AF_INET,SOCK_STREAM,0);
// setnonblocking(listenfd);
ev.data.fd=listenfd;
ev.events=EPOLLIN|EPOLLOUT|EPOLLET;
epoll_ctl(epfd,EPOLL_CTL_ADD,listenfd,&ev);
bzero(&saddr,sizeof(struct sockaddr_in));
saddr.sin_family=AF_INET;
saddr.sin_port=htons(port);
saddr.sin_addr.s_addr=INADDR_ANY;
bind(listenfd,(sockaddr*)&saddr,sizeof(struct sockaddr_in));
listen(listenfd,LISTENQ);
signal(SIGPIPE,sig_quit);
while(1){
nfds=epoll_wait(epfd,events,20,-1);
int i;
int connfd;
int clen=sizeof(struct sockaddr_in);
for(i=0;i<nfds;i++)
{
if(events.data.fd==listenfd)
{
cout<<"listenfd is"<<listenfd<<endl;
connfd=accept(listenfd,(sockaddr*)&caddr,(socklen_t*)&(clen));
cout<<"other fd is"<<connfd<<endl;
setnonblocking(connfd);
ev.data.fd=connfd;
ev.events=EPOLLIN|EPOLLOUT|EPOLLET;
epoll_ctl(epfd,EPOLL_CTL_ADD,connfd,&ev);
cout<<"flagA"<<endl;
}
else if(events.events&EPOLLIN)
{
char line[MAXLINE];
memset(line,0,MAXLINE);
sockfd=events.data.fd;
cout<<"siteB"<<sockfd<<endl;
//while(1){
int flagB=recv(sockfd,line,MAXLINE,0);
if(flagB==-1){
if(errno==EAGAIN){
break;
}else if(errno==EPIPE) {
epoll_ctl(epfd,EPOLL_CTL_DEL,sockfd,NULL);
break;
}else{
cerr<<"other error!!!!"<<endl;
break;
}
}else if(flagB>0)
cout<<line<<endl;
// }
ev.data.fd=sockfd;
ev.events=EPOLLOUT;
//epoll_ctl(epfd,EPOLL_CTL_DEL,sockfd,NULL);
cout<<"flagB"<<endl;
}
else if(events.events&EPOLLOUT)
{
char* res="this is server1..";
int sockfd=events.data.fd;
cout<<"siteC"<<sockfd<<endl;
// while(1){
int flagC=send(sockfd,res,strlen(res),0);
//cout<<flagC<<endl;
if(flagC==-1){
if(errno==EAGAIN){
break;
}else if(errno==EPIPE){
epoll_ctl(epfd,EPOLL_CTL_DEL,sockfd,NULL);
break;
}else {
break;
}
}
// }
ev.data.fd=sockfd;
ev.events=EPOLLIN;
// epoll_ctl(epfd,EPOLL_CTL_MOD,sockfd,&ev);
cout<<"flagC"<<endl;
}
}//for
}//while
}
client
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <netdb.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <iostream>
using namespace std;
main()
{
int sockfd;
int numbytes;
char buf[100];
memset(buf,0,100);
struct sockaddr_in other_addr;
sockfd=socket(AF_INET,SOCK_STREAM,0);
other_addr.sin_family=AF_INET;
other_addr.sin_port=htons(5000);
inet_aton("127.0.0.1",&other_addr.sin_addr);
bzero(&(other_addr.sin_zero), ;
connect(sockfd,(struct sockaddr*)&other_addr,sizeof(struct sockaddr));
//send(sockfd,"hello!socket..",14,0);
sleep(100000);
char c=fgetc(stdin);
close(sockfd);
} |
|