udp tcp epoll serv
[socket_samples.git] / serv_udptcp.c
blob451cc372ef37130f960d0364b665f9e4c3f920b0
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <errno.h>
4 #include <string.h>
5 #include <sys/types.h>
6 #include <netinet/in.h>
7 #include <sys/socket.h>
8 #include <sys/wait.h>
9 #include <unistd.h>
10 #include <arpa/inet.h>
11 #include <fcntl.h>
12 #include <sys/epoll.h>
13 #include <sys/time.h>
14 #include <sys/resource.h>
17 #define MAXLINE 100
18 #define OPEN_MAX 100
19 #define LISTENQ 20
20 #define SERV_TPORT 5000
21 #define SERV_UPORT 5001
23 #define INFTIM 1000
26 int setnonblocking(int sockfd)
28 if (fcntl(sockfd, F_SETFL, fcntl(sockfd, F_GETFD, 0)|O_NONBLOCK) == -1)
30 return -1;
32 return 0;
35 int main(int argc, char* argv[])
37 int i, tfd_listener, connfd, ufd_listener, sockfd,epfd,nfds, portnumber;
38 ssize_t n;
39 char line[MAXLINE] = "abcdefg";
40 socklen_t clilen;
42 int count = 0;
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);
50 if(tfd_listener < 0)
51 perror("tfd_listener create error\n");
53 ufd_listener = socket(PF_INET, SOCK_DGRAM, 0);
54 if(ufd_listener < 0)
55 perror("ufd_listener create error\n");
57 int opt=SO_REUSEADDR;
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);
92 for ( ; ; ) {
94 nfds=epoll_wait(epfd,events,20,500);
96 printf("wait end nfds = %d\n",nfds);
98 for(i=0;i<nfds;++i)
100 if(events[i].data.fd == tfd_listener)
102 connfd = accept(tfd_listener,(struct sockaddr *)&clientaddr, &clilen);
103 if(connfd<0){
104 perror("connfd<0");
105 exit(1);
107 setnonblocking(connfd);
108 char *str = inet_ntoa(clientaddr.sin_addr);
109 printf("accept a connection from %s\n", str);
111 ev.data.fd=connfd;
112 ev.events=EPOLLIN|EPOLLET;
113 epoll_ctl(epfd,EPOLL_CTL_ADD,connfd,&ev);
116 else if(events[i].data.fd == ufd_listener)
118 printf("udp\n");
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);
123 if(n < 0)
124 perror( "udp receive ERROR\n" );
125 else
126 printf( "udp receive right!\n" );
129 else if(events[i].events&EPOLLIN)//如果是已经连接的用户,并且收到数据,那么进行读入。
131 printf("count == %d\n",count);
132 count ++;
133 if ( (sockfd = events[i].data.fd) < 0)
134 continue;
135 if ( (n = read(sockfd, line, MAXLINE)) < 0) {
136 if (errno == ECONNRESET) {
137 close(sockfd);
138 events[i].data.fd = -1;
140 else
141 printf("readline error\n");
143 else if (n == 0) {
144 printf("close tcp port\n");
145 close(sockfd);
146 events[i].data.fd = -1;
148 else
150 printf("read OK %s\n", line);
151 line[n] = '/0';
153 ev.data.fd=sockfd;
154 ev.events=EPOLLOUT|EPOLLET;
155 epoll_ctl(epfd,EPOLL_CTL_ADD,connfd,&ev);
156 }else if(events[i].events&EPOLLOUT) // 如果有数据发送
159 printf("write \n");
160 sockfd = events[i].data.fd;
161 write(sockfd, line, n);
162 //设置用于读操作的文件描述符
164 ev.data.fd=sockfd;
165 //设置用于注测的读操作事件
167 ev.events=EPOLLIN|EPOLLET;
168 //修改sockfd上要处理的事件为EPOLIN
170 epoll_ctl(epfd,EPOLL_CTL_MOD,sockfd,&ev);
174 return 0;