|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
1.介绍
9 \9 Q$ L# s5 f' u/ `& P( ]3 ^+ K# |
' H( r; ~5 p V' d I8 Q4 fLinux网络循环服务器是指逐个处理客户端的连接,处理完一个连接后再处理下一个连接,是一个串行处理的方式,比较适合时间服务器,DHCP服务器.对于TCP服务器来说,主要阻塞在accept函数,等待客户端的连接。而对于UDP服务器来说,主要阻塞在recv函数.
2 L: U; C2 T, D; C" Z T7 m' M, K4 _5 d8 W
2.循环服务器模型2 L7 r% R% i; {, Y
j9 A5 O' |. I0 x7 \ LTCP循环服务器:3 Z8 ?7 n# C: K) k
1 r" n6 I( T" N5 r
算法如下:
8 d# ]9 d2 e: @, S5 J& w* M1 D7 `* m
socket(...);
2 U9 L5 E0 o! c5 K' Y bind(...);3 d" P3 [ `( W0 ]% t
listen(...);
' P7 N- ?- g: G' I& s while(1)
% U' w" S4 A) o* s7 ]+ N {
1 M- U0 B! Z, l: x7 V! b! k+ A accept(...);4 Z! n/ C f* ^% o5 H6 E" j0 o. z
read(...);
: z1 x) _+ T) ~7 i process(...);1 E' T2 V4 I/ `# z, V
write(...);" w9 P( a+ ?8 G& }$ p6 c, i
close(...);//关闭客户端连接& Q- r# g- x* [
7 z0 y! X/ W4 N9 L! ^$ u' h/ A }
0 }+ x, j! q3 ^& j close(....);//关闭服务器连接- n0 @7 d# t- {7 H
2 k. N4 ?" _! w( P8 S* KUDP循环服务器:, Y$ q( B, U) Y3 ?& B: m* W
" x! a, y1 v( ~' N) t- x 算法如下:
1 @4 U9 W+ E# G+ e
6 f! D2 E& d" n socket(...)% ^4 n$ m5 G a' u7 h% q6 h
% T1 t& m* t5 y8 g
bind(....);
/ V6 v' k8 ^6 W6 r- q6 K7 m
3 S& r3 p) S" v while(1){
' @, J1 @7 J% b7 y2 i& X8 A
. U2 ~6 G# `& |2 H recvfrom(....);) R, A0 p2 U, y r
2 W) F4 J* O9 ~
process(...);5 t0 c1 ?5 e$ D1 o
# r; k5 `5 w8 ~ n2 Z sendto(....);
; P) ^$ w: J3 b# y" W2 ~# g# D- d; s# t1 n- x* w; q
close(....);//关闭客户端连接 ' }: U9 x* `! l/ r+ r" D: T" v; v0 [
* c0 @. L3 r" x3 D
}
/ F3 H. f; Q! c0 O
1 L$ D+ O: y: z) x; n0 b/ j- [ close(....);//关闭服务器连接
- A$ T6 ~1 H" ]; C6 }% {9 C
d3 f2 Q% d8 R: K& k9 E7 m! ^9 x, Z# [6 r
从上面的流程可以看出,TCP循环服务器在accept处阻塞一直等待客户端的到来,而UDP循环服务器在recv处阻塞,等待客户端发送数据.
/ F4 c& v: z) U- Y; J' j$ t: U1 Q6 r: a3 w5 T+ ?
/ E2 s, P# U: J7 L3 U" c, Q+ o
3. 循环服务器的例子
" U9 V. w: `. e: b% b- I2 T" q% g# v% S" X( ]; c
下面的程序是一个时间服务器,客户端发出TIME时间请求,服务器将本地时间返回给客户端.8 m0 [" {2 d1 U2 r& U
. m" A: J7 Z7 `; @(1)TCP循环服务器
9 j3 b8 q& _7 B$ u. X4 ^ B9 {# d
+ g/ W# I. M" f+ B服务器: u4 k, L8 Z- K# d5 ?) z/ h3 G
! Q3 ~$ v4 u' h
|
|