- 論壇徽章:
- 0
|
我現(xiàn)在再用epoll 進(jìn)行測(cè)試 但是總有個(gè)問題 比較郁悶 如下:
server 端
監(jiān)聽的socket 為阻塞模式
epoll 設(shè)為 ET 模式
在監(jiān)聽的過(guò)程中以下面的模式主
while(1){
epoll_wait();
if(events.data.fd==listenfd)
{
//處理 新來(lái)的socket 連接
// 調(diào)用 accept 產(chǎn)生新的fd
// 把新的fd 設(shè)為非阻塞
// 以ET模式加入到epoll中
} else if(events.events&EPOLLIN){
//處理讀事件
}else if(events.events&EPOLLOUT) {
//處理寫事件
}
}
client 端
建立一個(gè)socket 阻塞模式
調(diào)用 connect
不調(diào)用任何函數(shù) 直接sleep(1000000)
上述 過(guò)程執(zhí)行后 server端 出現(xiàn)一次 連接信號(hào)(events.data.fd==listenfd)
出現(xiàn)一次 寫請(qǐng)求(events.events&EPOLLOUT)
我的問題是 在客戶端 我沒有調(diào)用 recv 為什么在server 會(huì)出現(xiàn) 寫請(qǐng)求?
各位大俠 給點(diǎn)指點(diǎn) 。。。。。 有關(guān)這方面的資料討論也行啊 。。。
跪謝。。
下面是詳細(xì)代碼 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);
} |
|