|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
1.介绍
' Z0 h, h6 x% {$ w/ V5 k, @
U: P3 d3 G" g) ^5 i9 V6 X& z0 yLinux网络循环服务器是指逐个处理客户端的连接,处理完一个连接后再处理下一个连接,是一个串行处理的方式,比较适合时间服务器,DHCP服务器.对于TCP服务器来说,主要阻塞在accept函数,等待客户端的连接。而对于UDP服务器来说,主要阻塞在recv函数.
5 F, O6 x0 X" y7 I- d4 Y
2 ^7 q8 d# n+ M/ I2.循环服务器模型
- S5 I8 M! x2 v, b H/ r! P, e2 E2 p$ e! S0 a; h* E
TCP循环服务器:
2 F) W* W1 A8 L" U
. s1 w6 W- [1 X$ s" D/ \算法如下:
( U/ N" C3 [) _; b! ]
6 G" a9 ^& t/ g; ^0 { e socket(...);
( j- z7 a' F8 ]/ V, ]+ w3 J+ ^ bind(...);3 o: X& \. N; i; i4 I# R1 A4 H
listen(...);
' u" i+ y( O; B while(1): Y7 }' [) o7 [8 R" [( B2 w+ e
{
8 r3 `0 f# U3 D6 J6 v y Q0 i accept(...);
/ ^, H# |; z* m! A! Q" \ read(...);
% Z2 G/ g7 b: |0 O5 E; N process(...);1 U8 `2 l: d' u" D2 n0 H+ Q
write(...);
: U. g8 x4 y, I) n& P2 i* Z close(...);//关闭客户端连接$ N0 |* j& n7 o2 ?
) [$ ]1 S3 N5 l% m' ?
}
G8 f$ B7 v. [' K H close(....);//关闭服务器连接9 v/ l+ z) E. c" t7 p/ t N1 z
( U+ {% U/ f F! O X* E
UDP循环服务器:2 \5 [/ i1 L* k( g" r/ k x* T
}8 O+ v) n( b/ j: q% r" F7 o
算法如下:
, G9 d u. I1 l& |0 \6 f0 l5 q `7 C) L" \$ O6 q* A3 J0 P
socket(...)
3 u/ ]$ O& {# z7 n
9 M1 V& }* c; W4 N bind(....);. o! T2 s$ I3 k+ a; {
: b5 _$ h9 h1 x% r. Z) d& C
while(1){& W2 l Q8 `4 w6 N/ ?$ S4 z) m
- C' `+ b2 {1 F V" D# u8 k recvfrom(....);2 e! @# x' h5 n9 Q/ Z
- {2 G& u# {; j( A8 L; E* G& n process(...);' T4 C J7 ^* @% M
9 V/ I+ S7 a3 C1 o* O* E P5 S
sendto(....);( D( }9 A6 c8 q) f6 x; ~
3 C. ?$ R6 p3 l. y5 I' n. x" g
close(....);//关闭客户端连接 + T) i: q6 T2 i$ o% Y" E8 r
; b9 } W5 O* C: p' @+ [ }& M4 ?. [8 ~ F. t, h$ p, ]
# M! J! b6 Z7 c! u1 `1 W/ r$ `
close(....);//关闭服务器连接3 l7 ]" m, d, j% P
2 Q, V7 R1 T H
8 X" Z3 ]; ^: G7 b a从上面的流程可以看出,TCP循环服务器在accept处阻塞一直等待客户端的到来,而UDP循环服务器在recv处阻塞,等待客户端发送数据.; Y: \( |2 c" p' b f7 m
1 T3 @. a8 l& P" p! j
$ m; ~4 ^0 Z. E
3. 循环服务器的例子! e+ U4 m: U/ ?
7 g& w) t5 y- A: O) z p
下面的程序是一个时间服务器,客户端发出TIME时间请求,服务器将本地时间返回给客户端.
) F3 t, @' R$ L; E+ F: m- X) U" A9 t( |- y( ]7 V
(1)TCP循环服务器
1 F# b9 o( j* F0 c, x8 R9 ?) I, [% z6 r
服务器:
y: n7 }& ]3 C: N/ X) _, A8 b5 o* X8 n! V. m k
|
|