cncml手绘网
标题:
一个简单的C语言的socket服务器和客户端程序
[打印本页]
作者:
admin
时间:
2020-5-9 02:14
标题:
一个简单的C语言的socket服务器和客户端程序
程序很简单,windows环境下的,客户端和服务器程序都在本机运行,在客户端输入发送给服务器的字符串,服务器收到字符串后会打印出来,同时与"abc"比较,与"abc"相同就会返给客户端,输入的是正确的,不同会告诉客户端输入时错误的。
. A7 Y& ^( u5 X7 C( p* v1 x, y
客户端程序:client.cpp
) r' f0 B5 I, T' X- {
#include <winsock2.h>
5 B9 A2 \! s. T! {; O! y- @9 N
#include <stdio.h>
' I- ^% t) E% u
#include <stdlib.h>
4 d/ i( N6 y: ~; a3 f. H" K; S
/ {8 L; E2 d* ^6 E/ T9 c
#define DEFAULT_PORT 5150
/ _ d) g/ N% q, P$ F
#define DEFAULT_BUFFER 2048
; N% n* F. ~% o; R: Q& g
# K( j; S& u) @6 U( \8 }* g: P+ C1 |7 D
char szServer[128],
0 c: E( i5 J8 C: Y% d( I8 c
szMessage[1024];
: u$ b& m! e3 `* K$ a: e# F
int iPort = DEFAULT_PORT;
! N6 a; V, V7 A$ G- @6 Q
4 P, C2 o) a- ^
int main()
$ g, U ?4 u2 ?0 g, v( M% e# e0 Z
{
3 O* F: q7 f$ O8 q2 n7 h- @# v
WSADATA wsd;
5 ?3 i7 m7 e3 M6 W* C/ y
SOCKET sClient;
5 U% a9 n1 R, l) m' S* J
char szBuffer[DEFAULT_BUFFER];
7 Q2 P1 X2 O1 S* P8 s2 P: z
int ret;
" B- C- w- M4 H3 f& j( m E
struct sockaddr_in server;
. j( @4 ?9 U3 P4 C( h/ _1 l
struct hostent *host = NULL;
2 W$ c, v3 H8 A1 C- u& }8 e
if (WSAStartup(MAKEWORD(2,2), &wsd) != 0)
& r3 X e. N* U; z! G } y
{
+ i: u; C! c, V' G1 f( i- ?- _0 t
printf("Failed to load Winsock library!\n");
# W& N! j& D* }
return 1;
, o- }8 y" D) C9 l/ h6 O0 s7 ~
}
1 I( F" H' @5 D
printf("Enter a string to send to server:\n");
5 e& f+ P: S F3 J( V1 |. [( P
gets(szMessage);
6 S4 j' J9 d( m# l
// Create the socket, and attempt to connect to the server
6 P1 E' s# M- P; h+ q7 a
sClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
9 z( K9 J) o: C" m3 V
if (sClient == INVALID_SOCKET)
% P7 C) y5 ]4 [/ Z* H8 ~% Z! F5 W
{
M0 ~+ g4 Z8 P6 P1 E
printf("socket() failed: %d\n", WSAGetLastError());
( m2 l9 U+ _' \* }5 R4 M; B3 c; H
return 1;
0 b( d6 `7 t+ ~
}
$ S1 Z5 P1 Q; u# N6 d' t5 c7 s
server.sin_family = AF_INET;
5 v U; ~" U2 I" |8 V C$ }9 w
server.sin_port = htons(iPort);
; P$ V" C) v1 u$ ^% F$ |2 r3 U
server.sin_addr.s_addr = inet_addr("127.0.0.1");
, f9 _( b) B) b1 j* `& m
0 ~/ \' \0 Z; c& I/ @0 D
if (connect(sClient, (struct sockaddr *)&server,
6 Z8 }" p7 ?( e$ f0 q6 }
sizeof(server)) == SOCKET_ERROR)
0 s! z- G7 f( R3 E
{
$ H* p. f8 R* m8 b( u5 ~
printf("connect() failed: %d\n", WSAGetLastError());
( @9 }7 U# d) ]( V: R
return 1;
6 P/ w3 b$ [9 g. H4 o7 R d3 O
}
6 k+ {" c9 b, ?) s" U
// Send and receive data
! G* a- T4 ^ F0 |1 R
ret = send(sClient, szMessage, strlen(szMessage), 0);
- Y. \7 J v, r7 Q+ j: V
if (ret == SOCKET_ERROR)
# ?6 U9 o+ J; ?$ h, @- x
{
5 G' r8 C: s+ T; [: g
printf("send() failed: %d\n", WSAGetLastError());
: Y* S- Y! l! T( ] I. r7 A
}
7 T9 m5 g0 \0 w7 H n$ e
else{
, w/ |9 O7 T3 X. _$ S
printf("Send '%s' \n", szMessage);
! D2 ^% x; Z! @- B1 y
ret = recv(sClient, szBuffer, DEFAULT_BUFFER, 0);
, [- G2 [7 R/ I! o H
if (ret == SOCKET_ERROR){
* C& i2 T2 s# F7 X
printf("recv() failed: %d\n", WSAGetLastError());
9 `" ?& ~2 l0 j& k Y U
}
% r) q& W0 ?) e1 O# a
else{
& v2 i3 B# j* ]+ g% _
szBuffer[ret] = '\0';
$ @9 g' {5 {0 t. y. s4 _
printf("RECV: '%s'\n",szBuffer);
% M" T& T) S9 |9 V! O1 T
}
) \0 S/ b! R4 U; O; W: r9 \# a+ Y
}
: `; i' N2 R% u
closesocket(sClient);
$ n& W( I. {. a' d
* r4 j& i& K" G" V5 M
WSACleanup();
) X' ~* l+ |5 K4 V. Y9 O! H
return 0;
7 t; g5 W. k' C: ~% @' n
}
复制代码
服务器程序:server.cpp
" ]9 c# G3 V% N5 I( v) R
#include <winsock2.h>
3 L: C; f/ X# O" x, @3 J8 G ~
#include <stdio.h>
3 }# O; R4 P% L2 ~
#include <stdlib.h>
, V- Y' O2 T L4 K4 K6 G
: b6 }; b& y( S. i8 e/ d) d
#define DEFAULT_PORT 5150
" F9 B; i% B" B; Y+ O2 x
#define DEFAULT_BUFFER 4096
+ a+ P" d$ [: x5 n& w
8 i: g" D1 {+ F, ?- R
int iPort = DEFAULT_PORT;
8 T: S- d! B; C$ s/ T- u' O
char szAddress[128];
' g% t9 H# n3 @4 s2 l, {" m# h
$ U4 k* Q% u% e% d9 E6 E* {+ I
DWORD WINAPI ClientThread(LPVOID lpParam)
) ]0 S* Q9 [" P4 |
{
0 E, z* l I: U$ w8 {$ }" H
SOCKET sock=(SOCKET)lpParam;
P# E7 w2 D$ p' S" |$ W
char szBuff[DEFAULT_BUFFER];
# _8 C# L. w; P, b$ E' ?
int ret;
% r' f$ s0 s, H' y: V
: d$ w* [7 R6 @+ S3 [/ d5 A
while(1)
# p( ?/ _- h& e
{
1 J9 M: `' U- T
ret = recv(sock, szBuff, DEFAULT_BUFFER, 0);
9 }( \, B9 R6 p
if (ret == 0)
% r! C$ g* {* [3 Y2 O b
break;
8 X5 ~/ Q, R7 v& o" z1 V9 L
else if (ret == SOCKET_ERROR)
^( E' G, X: ]) s3 f
{
4 j2 _ H n3 B E0 ~+ x. T
printf("recv() failed: %d\n", WSAGetLastError());
6 K3 s% L6 C- E7 _
break;
/ b$ B$ ?) U7 l- O( p; e; m2 x$ M4 p
}
2 \ t: Y; d& \. j- j8 i
szBuff[ret] = '\0';
; r' W6 f0 T8 K" B
printf("RECV: '%s'\n", szBuff);
/ d0 y% U- f9 s
if(strcmp(szBuff,"abc")==0){
/ f# X9 f/ n8 _, \
memcpy(szBuff,"Send the correct string!",25);
5 e$ l+ u5 G- v# K" e. L( n6 A
}
7 \: ^; ]" V- U! i! X$ k9 P8 P
else{
; y: Z9 S0 R9 i5 v T2 Q
memcpy(szBuff,"Send the wrong string!",23);
; v6 O) s4 x. ^: G s `( {
}
& f3 D2 K6 f/ _
ret = send(sock, szBuff, strlen(szBuff), 0);
% S. Z a5 G' J
if (ret == SOCKET_ERROR){
( s, \/ }. ^# k' X4 j9 J3 G( y& D. J
printf("send() failed: %d\n", WSAGetLastError());
7 s4 g6 T- B8 R& S
}
3 P7 A& S$ X F3 V' _' d
}
4 \% G! t% K8 A& p
return 0;
) M, u4 t' Z5 N/ J
}
* y# E0 c* K; S" Z1 L
# y5 m3 c8 y9 w# r5 s
int main()
+ r" t* g& M* g; S1 @- H
{
2 z" V6 ~# e+ e. k
WSADATA wsd;
/ T* Q7 P$ e2 \9 ^# N V2 L
SOCKET sListen,
6 U9 X3 S- A3 b. Q! t
sClient;
3 \/ W8 k5 P. y, ~6 {% S
int iAddrSize;
3 w& m2 ~% S2 m( c
HANDLE hThread;
7 r" S t3 ]: M: ~
DWORD dwThreadId;
* n5 O& A f8 G# A9 p5 T; l2 Z
struct sockaddr_in local,
9 H6 O8 ^, Y7 }# K+ P9 [
client;
* ]; i: J; c2 t: S1 h
/ _: d0 s- J: F5 R' C" `4 V+ `" _
if (WSAStartup(MAKEWORD(2,2), &wsd) != 0)
8 ]+ J# {( m) [; q9 G0 u
{
9 H z( z2 m: Z: Q% q
printf("Failed to load Winsock!\n");
3 q% K( l0 A! e, S7 s2 i
return 1;
9 r' A0 Q( U& h0 I) P+ C
}
" F4 t+ r, r. b( ^, E9 _/ l
// Create our listening socket
# Z* D4 Y- q8 O4 o; \* H" y
sListen = socket(AF_INET, SOCK_STREAM, IPPROTO_IP);
, W# k3 _0 v- x% W5 |7 j) L. H
if (sListen == SOCKET_ERROR)
/ ?- Q4 @% \7 U' C
{
) U5 x2 v) n1 e3 @% ?7 B
printf("socket() failed: %d\n", WSAGetLastError());
5 R3 i& `+ x5 M8 w4 `( p4 q8 x
return 1;
. y$ A4 K. f+ I% v
}
9 I/ e9 J/ O) U# d/ C# H* g- Q
local.sin_addr.s_addr = htonl(INADDR_ANY);
; _$ N. Z ^- r3 v. g) ]
local.sin_family = AF_INET;
% q5 _' R- `9 R) j3 _8 z8 g
local.sin_port = htons(iPort);
# D4 u4 ?1 u' z$ u' Y4 ~* s
$ K' a/ g% R: r+ M5 T3 J
if (bind(sListen, (struct sockaddr *)&local,
4 U' Y; [; D# a4 N7 A3 R8 T8 B8 {" k
sizeof(local)) == SOCKET_ERROR)
- {) ^6 G$ {/ _$ q# |1 {# k
{
. |% a( ~: Q6 ]! S( r4 n
printf("bind() failed: %d\n", WSAGetLastError());
9 ~! E1 S# }( B& x) f
return 1;
- S4 N1 O. j8 d% ~
}
, w1 {$ O0 E8 L9 n0 U. H* K
listen(sListen, 8);
j ?" g( J4 |
// In a continous loop, wait for incoming clients. Once one
, U( {1 j9 ~1 ]1 E; I2 a: ]) g, G
// is detected, create a thread and pass the handle off to it.
* f$ S, n' u1 k# H8 e
while (1)
# F6 Z2 L) }7 X
{
' Q# D. a3 [, N! q. e [
iAddrSize = sizeof(client);
* l( m. K9 U1 k+ \% C( j
sClient = accept(sListen, (struct sockaddr *)&client,
5 S' v2 h* G- I" g4 W
&iAddrSize);
9 S: d# P4 V; s, j# m D3 s* J
if (sClient == INVALID_SOCKET)
8 T& p9 Q. @" G. g( h6 @5 [
{
( d9 Y% _# [# H$ ^
printf("accept() failed: %d\n", WSAGetLastError());
5 q5 r5 a7 A9 L& H6 ^6 f
break;
8 j: Q3 @2 g7 V' s% t1 ]- k
}
2 f% x- s; F! p, O5 ?
printf("Accepted client: %s:%d\n",
& L0 w! X- K$ l" [" w
inet_ntoa(client.sin_addr), ntohs(client.sin_port));
) z M# R2 l6 ]# u- j
' a& W4 L8 T8 Y6 H% S# { y
hThread = CreateThread(NULL, 0, ClientThread,
( ~$ Y( N) k* t" U, u8 R
(LPVOID)sClient, 0, &dwThreadId);
: O6 H/ R. r( L: `
if (hThread == NULL)
( V3 J( F9 U( d/ L3 q4 R
{
! [0 t, J! m/ \8 @0 z1 `
printf("CreateThread() failed: %d\n", GetLastError());
$ ^: R$ h6 r; O4 r) e& c
break;
/ d8 X, X3 G; G* E
}
4 X5 l! Q" Y- [$ S' {- M- @
CloseHandle(hThread);
& E2 P8 V. h! u+ k! i3 e
}
{- F9 \/ v4 k, @
closesocket(sListen);
+ Z' \/ U. u8 G( u- U3 K* |# l
1 M0 |/ A; ~, l5 }( t0 m
WSACleanup();
; m1 x0 ^1 [3 S' k' V6 t
return 0;
* E5 N7 i" J; y- S' g) O
}
复制代码
' i" M+ J, E9 O' Y: G
6 f6 w. f0 U: N2 M8 V( g& ^
( T3 a: c! C, U$ L3 l5 v" x
) J) q/ b# }" z# B& y7 _3 i
0 }. \" s/ }$ O. b/ G; Y/ J! B
作者:
admin
时间:
2020-5-9 02:16
作为服务器,你要绑定【bind】到本地的IP地址上进行监听【listen】,但是你的机器上可能有多块网卡,也就有多个IP地址,这时候你要选择绑定在哪个IP上面,如果指定为INADDR_ANY,那么系统将绑定默认的网卡【即IP地址】。
! n- |5 I6 v( W0 u! d( t% b
D' Y D3 P9 U
作为客户端,你要连接【connect】到远端的服务器,也是要指定远端服务器的(ip, port)对。
! z! r H+ B7 {* h; X
当然,在这种情况下,不可能将IP地址指定为INADDR_ANY,系统会疯掉的。
9 T* v' Y1 ]+ U
0 ]3 d h8 c$ j8 R: u5 r
Server:
* B7 \$ E+ g" |% J
#include <winsock2.h>
' U: C. [/ @9 x2 W8 Y( I
#pragma comment(lib, "WS2_32.lib")
, K* n- ?, i3 B% ?
2 D, H+ d# Z' G1 y% s
#include <stdio.h>
% w1 _! g! C5 I# ^6 s! ~2 ^
void main()
: G- B/ u3 z8 a
{
9 f# k3 Y: H- O0 g" |
WORD wVersionRequested;//版本号
; C A+ o- q& \5 D: P9 d
WSADATA wsaData;
5 M1 I( v2 d$ o
int err;
" T3 M* V# h# Y: r+ F, n
2 Y5 }, ^" n: s1 Q5 D
wVersionRequested = MAKEWORD(2, 2);//2.2版本的套接字
+ m5 u( {6 @! }8 w
//加载套接字库,如果失败返回
/ u$ n7 i0 x6 W9 u( o$ r! o: E
err = WSAStartup(wVersionRequested, &wsaData);
r4 i6 a! N- E& {3 z
if (err != 0)
3 V( ?, s! c* z, q
{
`" }: |- f# g
return;
- l( l& Y, r. F1 h- t
}
! `3 f& y5 p) ]" Z, h4 Z$ [ c4 M
" S3 L5 L; @: u6 X+ }
//判断高低字节是不是2,如果不是2.2的版本则退出
+ j: T q, d) m
if (LOBYTE(wsaData.wVersion) != 2 ||
7 a- q9 w0 y+ \* p/ ?
$ p# q) ~% `9 Q }) l
HIBYTE(wsaData.wVersion) != 2)
4 [( U7 H1 c% P: s$ m# w, B
7 i0 u/ F: |2 F# }5 D1 z' W3 B
{
D+ n! Y. J ^1 Y5 ?! E M' H
return;
+ @' H8 \, P2 E! c# q3 V! k
}
+ S+ k- o4 R. P) F
# D% l/ f4 ?; H1 c% V0 ^3 ]
//创建流式套接字,基于TCP(SOCK_STREAM)
. K( P9 w8 h5 O+ j q/ q
7 f8 f j. \1 j+ } F( v
SOCKET socSrv = socket(AF_INET, SOCK_STREAM, 0);
( s9 W- w9 m/ q! D, n% G' E% h
! U+ h; s9 L* h$ P2 M- W9 p
//Socket地址结构体的创建
5 S. {. Y# f# I
0 B6 D+ m+ @- G: Y" p7 S# r
SOCKADDR_IN addrSrv;
3 o4 V2 @" F& w+ j) ~: I( D* {
3 d* y% @$ `; ^4 }$ i1 {% X
addrSrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY);//转换Unsigned long型为网络字节序格
# _& b5 L% Z/ Q1 q* \
addrSrv.sin_family = AF_INET;//指定地址簇
8 p$ W* J4 V7 o7 a( a
addrSrv.sin_port = htons(6000);
$ s7 F% \1 @- p5 D7 n
//指定端口号,除sin_family参数外,其它参数都是网络字节序,因此需要转换
* y- \; {: b% J0 Z+ a2 x3 o M- Z
' \; U' P) C2 m! x1 u0 Z7 e$ Q) T ?
//将套接字绑定到一个端口号和本地地址上
$ A; Q: c- l+ B$ ^' ]1 e; V
bind(socSrv, (SOCKADDR*)&addrSrv, sizeof(SOCKADDR));//必须用sizeof,strlen不行
W/ c, f# [, \3 R! J- [
6 O0 H2 ?6 m% T3 @# r1 T$ X
listen(socSrv, 5);
: K+ }4 r! r+ R# v
: |! z5 Y8 |: h1 A6 J: z
SOCKADDR_IN addrClient;//字义用来接收客户端Socket的结构体
( u+ S E1 l, ]' d
/ m9 f" e# s' r; u0 m; ^9 t- |
int len = sizeof(SOCKADDR);//初始化参数,这个参数必须进行初始化,sizeof
. {6 k4 p& Y% m/ ~( _5 ~3 \! i
+ K$ D: e/ a' Z- }
//循环等待接受客户端发送请求
- q3 n l7 Z R6 T+ o
+ c; X/ B4 K3 B3 p5 {
while (1)
7 M' a2 ?3 Y; b' e9 s7 ` o
{
( e$ Q$ p' h& j& R) {
//等待客户请求到来;当请求到来后,接受连接请求,
" F Z% y8 c8 C0 J$ }8 v
3 m2 u, s) N& y! g. \
//返回一个新的对应于此次连接的套接字(accept)。
: }6 }0 _* e p: j# a! B0 _( O) f
//此时程序在此发生阻塞
: M8 t @3 p' x/ j- w
# A( A* L. X3 P( S& E7 ]
SOCKET sockConn = accept(socSrv, (SOCKADDR*)&addrClient, &len);
$ B+ c0 k2 U% Y" j3 J4 i; B9 V
9 q. V8 `3 H" Y$ k* U
char sendBuf[100];
8 K' K+ m! f6 j- m+ W; l/ x/ Y8 q
& s. {3 H9 H# P# X. ]+ E9 \1 R; J
sprintf(sendBuf, "Welcome %s to JoyChou",
n) f* s0 {2 ^' O9 W7 X+ P
4 ]: x& Z0 ~! ]# E% s
inet_ntoa(addrClient.sin_addr));//格式化输出
) M2 F# B* Y+ c @
# C( K% b" P! v. B( }
//用返回的套接字和客户端进行通信
9 I) C3 C+ y1 o" O2 K
L3 ]' o0 S5 T# s/ n
send(sockConn, sendBuf, strlen(sendBuf)+1, 0);//多发送一个字节
. W! D9 Q* ~- u+ z6 E7 ^0 ]
% ]+ Y1 P3 K1 e- Q: ^: O
//接收数据
v' n$ U1 Z" f; E
# F1 j: t* P0 `1 l
char recvBuf[100];
; s. h8 _5 \7 R, P. S8 H
2 F' i& [9 ~; A- Z
recv(sockConn, recvBuf, 100, 0);
' |- G1 S6 p- W+ J. C
: U3 ?+ E/ U5 m6 j, w# `
printf("%s\n", recvBuf);
" F/ h+ i- K# ^. U$ Q, q$ Z
closesocket(sockConn);
) @# s( R0 z4 n' I% W
( x$ A X7 J$ r+ O
}
; Z' ]1 G( M1 {- E" B( @/ E
}
6 D* x0 R3 Y$ o9 |( f( G
. X$ c+ k9 P1 l3 J
! |9 \& P! K( l, o( h
Client:
$ w, o! l2 x2 i# b$ h
* l4 k4 H; K: U7 T1 ~" E
#include <winsock2.H>
$ d3 `+ u8 F7 g
#pragma comment(lib, "Ws2_32.lib")
( {" |5 J0 o. D; Q6 f
#include <stdio.h>
! P( x1 [" L1 Q' h5 \0 u2 M
#include <string.h>
0 p3 O9 v( p1 W, ?
. \9 i, n$ P9 e' I1 f/ n
void main()
. e& N: c' T2 [4 h* U. t4 |
{
2 q0 A V+ Y* o' d2 O
WORD wVersionRequested;
' \ [0 B/ f k: h' j. a5 Q
WSADATA wsaData;
% y! \6 H2 `! X
int err;
: R/ i1 R+ V( g; M+ ^1 c
, t8 y3 z. ]$ {, I3 p1 S
wVersionRequested = MAKEWORD( 2, 2 );
! @+ {; F: Q' ^4 G, N( p( l9 U9 I
8 l- J! [+ }1 c- l3 i5 E
err = WSAStartup( wVersionRequested, &wsaData );
" w- r B W: ?8 I3 W, ] F' T
if ( err != 0 ) {
: w$ v" W' _- \7 [7 K. W
) t- m" J3 J) g0 L) c3 K( e1 U; H
return;
s6 A1 O+ j$ M0 h1 q# {
}
5 n( R0 H! }6 l% u5 p% ?! i
k3 A5 T: D$ o4 t J/ p
/ Y& g) {; b$ W8 e1 d
if ( LOBYTE( wsaData.wVersion ) != 2 ||
- t" |. E/ K$ I
HIBYTE( wsaData.wVersion ) != 2 )
, m# P& c' Y! s) V2 D8 y: Y
{
1 D+ `, | d& [' z7 [, e3 e
1 V) w$ e; x- L. l
WSACleanup( );
+ \5 \9 y/ |; B4 c- }3 T5 s2 {. N
return;
* u' P1 a* g$ A# |( d5 H7 I( |
}
7 Y+ V5 P0 v" t1 c, G
SOCKET socketClient = socket(AF_INET, SOCK_STREAM, 0);
8 J. D: Y: S1 ]6 _+ w9 _% ~
SOCKADDR_IN addrSrv;
6 v5 K& i# y) D# w0 y
addrSrv.sin_family = AF_INET;
# H# ]. I2 ]7 b: R
addrSrv.sin_port = htons(6000);
8 `+ Z y' Y: b
addrSrv.sin_addr.S_un.S_addr = inet_addr("192.168.1.101");//服务器端的IP地址
6 {, a+ ], J3 P( T
# P4 ~: t9 V( [% R
connect(socketClient, (SOCKADDR *)&addrSrv, sizeof(SOCKADDR));
% W5 y5 x# \7 P( i/ c
char recvBuf[256];
2 T' H) o( A( i, N' H
char sendBuf[] = "This is Joychou";
) r9 {: y) m# w$ d) H+ s' v" `/ E
recv(socketClient, recvBuf, 256, 0);
3 A, ^0 R: z0 k
printf("%s\n", recvBuf);
: g H$ ]- [3 h5 c) K: `1 l) h
send(socketClient, sendBuf, strlen(sendBuf) + 1, 0);
7 V7 |9 i) I2 h0 _; a2 l4 S2 d7 V/ T
closesocket(socketClient);
, K( E: g4 V: }8 T! M+ n1 Q7 l
WSACleanup();
. E+ u9 I% B5 m0 w" ]5 Q& u$ y
* ?; [" |& _2 \: u3 p0 i
}
复制代码
0 |. _) t. B% a! y' U$ j& E$ }! @
( [! L; z2 I/ L
欢迎光临 cncml手绘网 (http://bbs.cncml.com/)
Powered by Discuz! X3.2