6 #include <netinet/in.h>
7 #include <sys/socket.h>
10 #include <arpa/inet.h>
12 #include <sys/epoll.h>
14 #include <sys/resource.h>
20 #define SERV_TPORT 5000
21 #define SERV_UPORT 5001
26 int setnonblocking(int sockfd
)
28 if (fcntl(sockfd
, F_SETFL
, fcntl(sockfd
, F_GETFD
, 0)|O_NONBLOCK
) == -1)
35 int main(int argc
, char* argv
[])
37 int i
, tfd_listener
, connfd
, ufd_listener
, sockfd
,epfd
,nfds
, portnumber
;
39 char line
[MAXLINE
] = "abcdefg";
44 struct epoll_event ev
,events
[20];
45 struct sockaddr_in clientaddr
;
46 struct sockaddr_in serveraddr
;
47 struct sockaddr_in my_addr
;
49 tfd_listener
= socket(AF_INET
, SOCK_STREAM
, 0);
51 perror("tfd_listener create error\n");
53 ufd_listener
= socket(PF_INET
, SOCK_DGRAM
, 0);
55 perror("ufd_listener create error\n");
58 setsockopt(ufd_listener
,SOL_SOCKET
,SO_REUSEADDR
,&opt
,sizeof(opt
));
60 setnonblocking(ufd_listener
);
61 setnonblocking(tfd_listener
);
63 bzero(&my_addr
, sizeof(my_addr
));
64 my_addr
.sin_family
= PF_INET
;
65 my_addr
.sin_port
= htons(4000);
66 my_addr
.sin_addr
.s_addr
= INADDR_ANY
;
69 bzero(&serveraddr
, sizeof(serveraddr
));
70 serveraddr
.sin_family
= AF_INET
;
71 serveraddr
.sin_addr
.s_addr
= INADDR_ANY
;
72 serveraddr
.sin_port
=htons(1235);
74 if (bind(ufd_listener
, (struct sockaddr
*) &my_addr
, sizeof(struct sockaddr
)) == -1)
75 perror("ufd_listener bind error\n");
77 if(bind(tfd_listener
,(struct sockaddr
*)&serveraddr
, sizeof(struct sockaddr
))== -1)
78 perror("tfd_listener bind error\n");
80 epfd
=epoll_create(256);
82 ev
.data
.fd
=tfd_listener
;
83 ev
.events
=EPOLLIN
|EPOLLET
;
84 epoll_ctl(epfd
,EPOLL_CTL_ADD
,tfd_listener
,&ev
);
86 ev
.data
.fd
= ufd_listener
;
87 ev
.events
= EPOLLIN
|EPOLLET
;
88 epoll_ctl(epfd
,EPOLL_CTL_ADD
,ufd_listener
,&ev
);
90 listen(tfd_listener
, LISTENQ
);
94 nfds
=epoll_wait(epfd
,events
,20,500);
96 printf("wait end nfds = %d\n",nfds
);
100 if(events
[i
].data
.fd
== tfd_listener
)
102 connfd
= accept(tfd_listener
,(struct sockaddr
*)&clientaddr
, &clilen
);
107 setnonblocking(connfd
);
108 char *str
= inet_ntoa(clientaddr
.sin_addr
);
109 printf("accept a connection from %s\n", str
);
112 ev
.events
=EPOLLIN
|EPOLLET
;
113 epoll_ctl(epfd
,EPOLL_CTL_ADD
,connfd
,&ev
);
116 else if(events
[i
].data
.fd
== ufd_listener
)
119 if( events
[i
].events
&& EPOLLIN
)
120 printf( "udp receive begin!\n" );
121 n
= recvfrom(ufd_listener
, line
,MAXLINE
, 0,
122 (struct sockaddr
*)&clientaddr
, &clilen
);
124 perror( "udp receive ERROR\n" );
126 printf( "udp receive right!\n" );
129 else if(events
[i
].events
&EPOLLIN
)//如果是已经连接的用户,并且收到数据,那么进行读入。
131 printf("count == %d\n",count
);
133 if ( (sockfd
= events
[i
].data
.fd
) < 0)
135 if ( (n
= read(sockfd
, line
, MAXLINE
)) < 0) {
136 if (errno
== ECONNRESET
) {
138 events
[i
].data
.fd
= -1;
141 printf("readline error\n");
144 printf("close tcp port\n");
146 events
[i
].data
.fd
= -1;
150 printf("read OK %s\n", line
);
154 ev
.events
=EPOLLOUT
|EPOLLET
;
155 epoll_ctl(epfd
,EPOLL_CTL_ADD
,connfd
,&ev
);
156 }else if(events
[i
].events
&EPOLLOUT
) // 如果有数据发送
160 sockfd
= events
[i
].data
.fd
;
161 write(sockfd
, line
, n
);
167 ev
.events
=EPOLLIN
|EPOLLET
;
168 //修改sockfd上要处理的事件为EPOLIN
170 epoll_ctl(epfd
,EPOLL_CTL_MOD
,sockfd
,&ev
);