@@ -26,5 +26,117 @@ static void modify_event(int epollfd, int fd, int state);
26
26
27
27
int main (int argc , char * argv [])
28
28
{
29
+ int sockfd ;
30
+ struct sockaddr_in servaddr ;
31
+ sockfd = socket (AF_INET , SOCK_STREAM , 0 );
32
+ bzero (& servaddr , sizeof (servaddr ));
33
+ servaddr .sin_family = AF_INET ;
34
+ servaddr .sin_port = htons (SERV_PORT );
35
+ inet_pton (AF_INET , IPADDRESS , & servaddr .sin_addr );
36
+ connect (sockfd , (struct sockaddr * )& servaddr , sizeof (servaddr ));
37
+ // 处理链接
38
+ handle_connection (sockfd );
39
+ close (sockfd );
29
40
return 0 ;
30
41
}
42
+
43
+ static void handle_connection (int sockfd )
44
+ {
45
+ int epollfd ;
46
+ struct epoll_event events [EPOLLEVENTS ];
47
+ char buf [MAXSIZE ];
48
+ int ret ;
49
+ epollfd = epoll_create (FDSIZE );
50
+ add_event (epollfd , STDIN_FILENO , EPOLLIN );
51
+ for ( ; ; )
52
+ {
53
+ ret = epoll_wait (epollfd , events , EPOLLEVENTS , -1 );
54
+ handle_events (epollfd , events , ret , sockfd , buf );
55
+ }
56
+ close (epollfd );
57
+ }
58
+
59
+
60
+ static void handle_events (int epollfd , struct epoll_event * events ,
61
+ int num , int sockfd , char * buf )
62
+ {
63
+ int fd ;
64
+ int i ;
65
+ for (i = 0 ; i < num ; i ++ )
66
+ {
67
+ fd = events [i ].data .fd ;
68
+ if (events [i ].events & EPOLLIN )
69
+ do_read (epollfd , fd , sockfd , buf );
70
+ else if (events [i ].events & EPOLLOUT )
71
+ do_write (epollfd , fd , sockfd , buf );
72
+ }
73
+ }
74
+
75
+ static void do_read (int epollfd , int fd , int sockfd , char * buf )
76
+ {
77
+ int nread ;
78
+ nread = read (fd , buf , MAXSIZE );
79
+ if (nread == -1 )
80
+ {
81
+ perror ("read error:" );
82
+ close (fd );
83
+ }
84
+ else if (nread == 0 )
85
+ {
86
+ fprintf (stderr , "server close.\n" );
87
+ close (fd );
88
+ }
89
+ else
90
+ {
91
+ if (fd == STDIN_FILENO )
92
+ add_event (epollfd , sockfd , EPOLLOUT );
93
+ else
94
+ {
95
+ delete_event (epollfd , sockfd , EPOLLIN );
96
+ add_event (epollfd , STDOUT_FILENO , EPOLLOUT );
97
+ }
98
+ }
99
+ }
100
+
101
+ static void do_write (int epollfd , int fd , int sockfd , char * buf )
102
+ {
103
+ int nwrite ;
104
+ nwrite = write (fd , buf , strlen (buf ));
105
+ if (nwrite == -1 )
106
+ {
107
+ perror ("write error:" );
108
+ close (fd );
109
+ }
110
+ else
111
+ {
112
+ if (fd == STDOUT_FILENO )
113
+ delete_event (epollfd , fd , EPOLLOUT );
114
+ else
115
+ modify_event (epollfd , fd , EPOLLIN );
116
+ }
117
+ memset (buf , 0 , MAXSIZE );
118
+ }
119
+
120
+ static void add_event (int epollfd , int fd , int state )
121
+ {
122
+ struct epoll_event ev ;
123
+ ev .events = state ;
124
+ ev .data .fd = fd ;
125
+ epoll_ctl (epollfd , EPOLL_CTL_ADD , fd , & ev );
126
+ }
127
+
128
+ static void delete_event (int epollfd , int fd , int state )
129
+ {
130
+ struct epoll_event ev ;
131
+ ev .events = state ;
132
+ ev .data .fd = fd ;
133
+ epoll_ctl (epollfd , EPOLL_CTL_DEL , fd , & ev );
134
+ }
135
+
136
+ static void modify_event (int epollfd , int fd , int state )
137
+ {
138
+ struct epoll_event ev ;
139
+ ev .events = state ;
140
+ ev .data .fd = fd ;
141
+ epoll_ctl (epollfd , EPOLL_CTL_MOD , fd , & ev );
142
+ }
0 commit comments