cncml手绘网
标题:
一个简单的C语言的socket服务器和客户端程序
[打印本页]
作者:
admin
时间:
2020-5-9 02:14
标题:
一个简单的C语言的socket服务器和客户端程序
程序很简单,windows环境下的,客户端和服务器程序都在本机运行,在客户端输入发送给服务器的字符串,服务器收到字符串后会打印出来,同时与"abc"比较,与"abc"相同就会返给客户端,输入的是正确的,不同会告诉客户端输入时错误的。
" v6 T9 U1 ^% G2 l7 E4 X( o
客户端程序:client.cpp
3 W6 C) O' Z1 b" A) c
#include <winsock2.h>
0 J5 L; M- s4 f
#include <stdio.h>
3 @5 D! Z. p. H X9 Z. m6 f
#include <stdlib.h>
% r0 I" c6 n7 i( J. N0 x# n5 \. h( `7 e
2 C% E9 |' S. s2 \5 P \$ ~
#define DEFAULT_PORT 5150
% i" F1 {9 ^& S- s4 t
#define DEFAULT_BUFFER 2048
6 v6 E m: Q5 h Q# E$ d2 \
4 Q# l0 R! C9 `, t; Y% a$ u
char szServer[128],
& r4 J ?8 c2 F3 f. l
szMessage[1024];
6 c5 |, [' d+ v$ ]0 \$ P7 Y3 V
int iPort = DEFAULT_PORT;
: f3 T( }2 |' C: n' j
3 l4 W, A2 ?5 H; \# C s6 z; U
int main()
+ B0 A1 h6 K3 E0 C- p) h
{
$ j2 w# \ b" c1 b9 ?
WSADATA wsd;
* w$ e* k- H* h$ C
SOCKET sClient;
7 c6 i7 }8 i7 U s/ S. `
char szBuffer[DEFAULT_BUFFER];
, r/ Q; o4 G9 i% f) K4 a# A0 N7 u
int ret;
& h, O7 Y% L- |6 z- C
struct sockaddr_in server;
3 y! [7 u, Z" U4 w1 `9 o% p
struct hostent *host = NULL;
% h) v7 T$ R% S* i: X, ^
if (WSAStartup(MAKEWORD(2,2), &wsd) != 0)
; r+ @- N- j! k1 e
{
: S1 M# v& x# Z& B7 t
printf("Failed to load Winsock library!\n");
, Q- `1 O5 A) N: m
return 1;
# o( s1 w0 k5 x7 N; m/ X* ?
}
; K) J- A6 ~6 V( \! T& i
printf("Enter a string to send to server:\n");
/ r3 I7 @$ ]3 L _. ]- z+ I
gets(szMessage);
5 X, S8 w8 }2 J, p, `
// Create the socket, and attempt to connect to the server
; B% r! W" ?0 z6 v) G7 Q, S
sClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
, c) S* ?# \8 g0 Q
if (sClient == INVALID_SOCKET)
9 X7 o3 ]4 v6 n% r/ e8 [& r9 N
{
) [$ G) e# Y- ?4 I+ b
printf("socket() failed: %d\n", WSAGetLastError());
9 ]7 `# b* R! p4 p
return 1;
- B( w* J% V* S
}
0 q, q H8 z1 z5 O
server.sin_family = AF_INET;
9 G' j- q' }& P% F$ Z
server.sin_port = htons(iPort);
7 x% R+ W/ p# |; h
server.sin_addr.s_addr = inet_addr("127.0.0.1");
4 l+ L1 Q2 i4 k4 | z$ _$ L# x
, O% y" k I4 G" `5 V) l
if (connect(sClient, (struct sockaddr *)&server,
( X7 H+ }4 k3 G; }9 `; M* x) B
sizeof(server)) == SOCKET_ERROR)
# l$ W/ x: C. y7 Z- [
{
4 y0 G6 L: Y0 t6 k9 s
printf("connect() failed: %d\n", WSAGetLastError());
2 `* |2 Q( C2 h5 G% W5 [
return 1;
4 r6 P7 R( n1 x, N9 `; ?0 [9 t
}
7 v: e0 I1 J+ ?- t7 _
// Send and receive data
5 v* m7 y7 a3 c1 {/ Z7 h# @
ret = send(sClient, szMessage, strlen(szMessage), 0);
/ V( G4 P2 \1 k# ?7 a% w% @
if (ret == SOCKET_ERROR)
# f3 S7 y; R5 t; r, X% T6 D6 s: o
{
2 t) v( R! D. W, e- ], e% `- d
printf("send() failed: %d\n", WSAGetLastError());
6 h% Y4 M' R+ [$ _! X; u
}
1 k- }0 O( ~: r! w9 ~
else{
) r, n2 d# O: U; H
printf("Send '%s' \n", szMessage);
( B8 e4 _- o' G' A Q
ret = recv(sClient, szBuffer, DEFAULT_BUFFER, 0);
0 P l* d0 e. E3 ~3 E% A! Y! `
if (ret == SOCKET_ERROR){
$ x5 Q/ e! o- Y, x
printf("recv() failed: %d\n", WSAGetLastError());
/ b! j6 _1 A1 j, N3 S
}
8 D: L% d6 H }$ h, @
else{
& n' N) P8 I/ R1 _5 E
szBuffer[ret] = '\0';
/ y2 ]$ F( c, _. e+ @4 q% M$ j
printf("RECV: '%s'\n",szBuffer);
4 C& E `3 }& D2 w* |: t
}
; I1 Y1 y" _) Z9 c/ C: n/ f5 @% ]
}
+ j5 b8 {6 }+ g& M3 u; Z
closesocket(sClient);
( s! A+ f) X: j
1 R: V% }" @0 u* H# f$ w# X! u
WSACleanup();
' B6 `, A0 U z) U
return 0;
) L- @% n1 s$ `# x
}
复制代码
服务器程序:server.cpp
; e# G3 C5 |9 p3 s: V
#include <winsock2.h>
$ j8 K/ f6 v6 N" }$ k8 O6 }
#include <stdio.h>
; ?: O% r U1 s, n p. N
#include <stdlib.h>
$ B% k' V) v/ ]9 b
6 ], \- o4 e& r+ {% X
#define DEFAULT_PORT 5150
# j1 f" j, d! n; O0 p2 Y# W
#define DEFAULT_BUFFER 4096
- }5 u8 |6 \ ]
1 F0 g0 }+ M' ?) r
int iPort = DEFAULT_PORT;
1 Y+ m+ l9 _" c5 j: n! y7 W& ?
char szAddress[128];
& `8 y; O! U% u+ z8 a
* ?; Z- ~* G: B* m1 ~# Y
DWORD WINAPI ClientThread(LPVOID lpParam)
0 @+ H @5 O3 d
{
- }6 [8 @% O1 S$ O- ~
SOCKET sock=(SOCKET)lpParam;
# d5 z, I3 B w+ e8 i/ I1 S
char szBuff[DEFAULT_BUFFER];
& U5 y% {# F$ i4 Z/ s. Q9 F
int ret;
) `; }) T# s$ d- y& y
- _5 i, k4 `" f& \7 }* e4 G
while(1)
9 ]) |: s+ P# ~8 t
{
2 t5 L4 f! @$ G M& ~! v, W: j
ret = recv(sock, szBuff, DEFAULT_BUFFER, 0);
5 n0 j6 T8 W7 F6 N2 R$ a* `' f
if (ret == 0)
5 u7 Y3 K- T! [( I- o
break;
]& A& e! E" V" M$ _
else if (ret == SOCKET_ERROR)
" K+ Q8 z+ P" H, y3 D5 r
{
2 a& q$ s. S9 m+ Z2 w
printf("recv() failed: %d\n", WSAGetLastError());
1 V8 ]* d- `. j& f6 v2 H/ h! _3 O9 O
break;
1 R+ b" b$ l' E
}
6 L) S7 d4 C# Y" H- f9 b
szBuff[ret] = '\0';
! `6 Z" u1 R* m6 a# N: s, q; }; B
printf("RECV: '%s'\n", szBuff);
. a2 T Q0 C0 m7 a" t1 P" x1 h! ^5 ?
if(strcmp(szBuff,"abc")==0){
. Q3 C1 i- }9 A& Q# I
memcpy(szBuff,"Send the correct string!",25);
& T5 V0 I4 P( _5 Y3 N, A& f
}
5 r9 _) `+ h+ c5 d _2 ?* ~
else{
* k$ @- [ \4 }* E5 ]( z
memcpy(szBuff,"Send the wrong string!",23);
9 F9 p, x0 @' Q( }( { j: q5 C, d: R/ @
}
) i: J2 G' N: n t2 W X5 W
ret = send(sock, szBuff, strlen(szBuff), 0);
8 `+ {) m, w0 J5 d9 {
if (ret == SOCKET_ERROR){
& \: C! I$ k% ~6 U ^2 |0 ^( H
printf("send() failed: %d\n", WSAGetLastError());
6 O1 n9 C- i {# G2 R1 }
}
0 A* h& X- U' A" `9 B$ I2 X
}
/ Y$ Z2 m% o* g) {
return 0;
: D# l! W8 V4 j& Y+ Y5 A
}
5 A8 @3 [* K; C) L$ Y1 s. x; |
2 U* v/ Z0 l) f. _6 l% i" o" d
int main()
! O* `$ r5 N0 g! {/ N& s
{
+ }4 z) n X! v( F% ?' @
WSADATA wsd;
) `, a0 j/ d- j8 u$ |
SOCKET sListen,
% ~* F$ W# y4 E5 k
sClient;
% ?2 X! `6 q: p
int iAddrSize;
: ^1 ^* q! R" ~ V9 `# G
HANDLE hThread;
! y i0 Y5 h5 t( Z) [4 Y: h
DWORD dwThreadId;
4 r c% V# A) O; G& L, ]
struct sockaddr_in local,
8 H1 g$ X' H, n, P( [
client;
8 K0 ], D w. S$ o" V, ?
0 ^4 G D7 n5 M+ V
if (WSAStartup(MAKEWORD(2,2), &wsd) != 0)
3 M5 O0 y0 D% C( V6 ~/ ^
{
* \. ~7 n- V" d. x
printf("Failed to load Winsock!\n");
$ n& {/ ]$ f* E' Z8 I+ t
return 1;
' q: k9 y& D# N6 \ y1 C, o/ H6 _
}
9 Q" h% f( P ]9 B% Y0 e
// Create our listening socket
0 D# T( l# |: L1 ~% [) N$ i
sListen = socket(AF_INET, SOCK_STREAM, IPPROTO_IP);
/ B* I( D( o& H& g+ { N
if (sListen == SOCKET_ERROR)
$ O \$ @( ?) A/ Y) Y
{
# a4 V4 |5 V9 L; R* _+ t f
printf("socket() failed: %d\n", WSAGetLastError());
( O1 j( H7 u" o) m) K; Z. b- O. S
return 1;
6 N+ l! L7 v0 ?& D
}
% P/ m( J" H9 ~8 Q6 J; \9 j
local.sin_addr.s_addr = htonl(INADDR_ANY);
: V& |5 [9 q$ K9 Z' G
local.sin_family = AF_INET;
+ F. w' _+ B- I# q
local.sin_port = htons(iPort);
4 {% S- h- N8 N7 B3 |. i9 _: W
+ B% G6 r, r9 @- F, h+ l# t
if (bind(sListen, (struct sockaddr *)&local,
8 G5 p0 K! L8 U2 a$ [* a
sizeof(local)) == SOCKET_ERROR)
/ z6 F( D/ a* T+ m
{
0 N0 L* J0 @ D4 d
printf("bind() failed: %d\n", WSAGetLastError());
G3 ]$ l( Y- Z" N) S9 ~
return 1;
1 J8 R9 g1 s7 E
}
( O5 c' }- L! B( ]
listen(sListen, 8);
5 @ h Q. |. t1 S9 X; B! n+ f
// In a continous loop, wait for incoming clients. Once one
8 _6 P4 n1 B' P0 n1 o- O* ~
// is detected, create a thread and pass the handle off to it.
6 x9 p2 B6 n* o' a& W
while (1)
, i: a8 g, _5 D( x. B! ~
{
, S* S; N8 w- |! a0 x; q% i# W
iAddrSize = sizeof(client);
, @: Y0 I; y1 c n+ }( ?' h; B% n
sClient = accept(sListen, (struct sockaddr *)&client,
' u" G4 X- _' P0 S4 G3 W
&iAddrSize);
! r" E9 r* K6 c/ X& B" L6 I0 {
if (sClient == INVALID_SOCKET)
+ {0 d7 a& a) K$ `: ~4 x
{
- t+ M4 O- O7 ~7 d
printf("accept() failed: %d\n", WSAGetLastError());
" ]0 @+ m# \3 \- a0 u
break;
7 \) T, ~, w/ x# Z! i3 |
}
# ?2 w- {5 b% ^& h, n
printf("Accepted client: %s:%d\n",
0 F4 |1 ^# E* B) ^/ t; P; ^
inet_ntoa(client.sin_addr), ntohs(client.sin_port));
9 w- Q# J7 S: p7 ?# s w
7 j% `$ [0 e; w3 E3 d6 n
hThread = CreateThread(NULL, 0, ClientThread,
% H# U b( Y5 ^0 V( T: H
(LPVOID)sClient, 0, &dwThreadId);
0 H8 Y5 j# ~5 X8 z6 S
if (hThread == NULL)
$ r! B% T$ C- a' u( C
{
& g6 Q! M) T1 E5 x
printf("CreateThread() failed: %d\n", GetLastError());
b2 _# x9 E% l3 T. p# @
break;
& L/ ^ B! |) l6 p. K4 T
}
1 Z/ r5 e& G4 Z6 v
CloseHandle(hThread);
9 a2 [ \4 d! k7 [: W
}
1 L# o8 y9 K! L) A$ P! W
closesocket(sListen);
3 L6 ^: ?' U2 o' O0 }% x
G0 ?6 ]/ A) v) g% g" R
WSACleanup();
4 ^7 u& F; \- o
return 0;
3 R9 O' x) g" A8 F! g
}
复制代码
) [' l9 i7 B) Q5 F: d; d
, s' o5 L' @- @) v
A. v$ O! q- c, b& o
9 M+ D* m# Z9 E
4 Z6 O6 U. Q4 ^5 Y& C5 h. x c
作者:
admin
时间:
2020-5-9 02:16
作为服务器,你要绑定【bind】到本地的IP地址上进行监听【listen】,但是你的机器上可能有多块网卡,也就有多个IP地址,这时候你要选择绑定在哪个IP上面,如果指定为INADDR_ANY,那么系统将绑定默认的网卡【即IP地址】。
+ r6 y) }1 z& \% v
1 x' \( Q4 W5 _4 n! m7 X
作为客户端,你要连接【connect】到远端的服务器,也是要指定远端服务器的(ip, port)对。
9 o9 t% S8 {" W1 h8 w, ~& y
当然,在这种情况下,不可能将IP地址指定为INADDR_ANY,系统会疯掉的。
0 j& V% s$ O) _6 V! g5 t% l/ } |
" i0 u/ n0 Q/ P: @' ^
Server:
$ h+ |5 Q+ j% ]( u$ ^, t/ f3 l
#include <winsock2.h>
. @6 e- G+ q6 U
#pragma comment(lib, "WS2_32.lib")
8 D& \6 M3 n" _7 e; Y
/ ]8 L1 k. S `) a# f
#include <stdio.h>
3 [' a; g% P! F! X: g
void main()
/ l& c) E# Q( j1 Y$ Z
{
" Y5 _3 m( h' @" e& G1 _* X3 X
WORD wVersionRequested;//版本号
# {+ L, C# q, Y6 c- w
WSADATA wsaData;
0 \$ P( ^& R) S" X% N( U' ?
int err;
* _; c3 |3 J) ?9 \
) ]+ W# q" c6 q% t5 B
wVersionRequested = MAKEWORD(2, 2);//2.2版本的套接字
. h" R9 E# N6 J1 v. o2 Y, p# E3 u
//加载套接字库,如果失败返回
S# F0 v4 I+ j: _# L F- x# E
err = WSAStartup(wVersionRequested, &wsaData);
) C' a, ?6 I. X/ K
if (err != 0)
7 c0 D8 R1 Y, u" v2 V
{
& h1 k! f7 D4 [4 F6 }" q/ U
return;
9 o2 v7 F) ~+ R4 Y/ H/ G! |: n
}
( \# l+ B; C0 m- }/ v: n5 M
5 n0 x* C; W: L/ s F; F
//判断高低字节是不是2,如果不是2.2的版本则退出
# I- A: J/ m8 x4 `# K' X" t: U
if (LOBYTE(wsaData.wVersion) != 2 ||
9 T3 k$ r3 P/ t K( Y
7 U7 H; J+ G0 F1 b
HIBYTE(wsaData.wVersion) != 2)
: a& W: C: D7 i+ |' o7 A. A
3 F. `/ j$ j4 p" K! L5 L
{
) |0 F7 M& V' J u2 G$ {6 y
return;
. O; A8 e5 j; \* h" u0 L
}
6 S9 [0 R0 R: I
! i2 ] }2 a9 ~. d+ z8 e
//创建流式套接字,基于TCP(SOCK_STREAM)
, b0 Z8 z1 p, z
* o: f* j# b6 f7 `0 v1 z
SOCKET socSrv = socket(AF_INET, SOCK_STREAM, 0);
( r: d8 Y4 N* T1 U M. e Z1 P
' A, e' J- D; q! B
//Socket地址结构体的创建
7 [4 t7 y, M. g6 {* y0 [2 w3 ~
& ]9 M1 P$ R0 q1 O
SOCKADDR_IN addrSrv;
1 d6 M" X0 h; [: k5 ^
: v8 G! @0 _* J, p/ U& G9 C+ B: P
addrSrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY);//转换Unsigned long型为网络字节序格
0 ^$ t* W# n6 f& P
addrSrv.sin_family = AF_INET;//指定地址簇
, m5 X" v: U3 o; g2 t& |
addrSrv.sin_port = htons(6000);
5 K+ {; h2 e2 [8 G3 H3 U
//指定端口号,除sin_family参数外,其它参数都是网络字节序,因此需要转换
2 W* f7 e& P- f0 d# k0 h
6 z! e- {6 `$ F' ^5 Z
//将套接字绑定到一个端口号和本地地址上
( i8 F" }0 P5 l$ x5 f# v' s: @
bind(socSrv, (SOCKADDR*)&addrSrv, sizeof(SOCKADDR));//必须用sizeof,strlen不行
6 b% m% b0 Q9 u( f1 E9 K' L/ ?8 v
- F+ X+ J( I0 h( q* L
listen(socSrv, 5);
; h: E* p! H7 r# c# G
O/ }: F7 W" i# w
SOCKADDR_IN addrClient;//字义用来接收客户端Socket的结构体
5 `# c# k: ^; l; Q( I) }+ \
5 A) y7 y: M3 _9 D) A
int len = sizeof(SOCKADDR);//初始化参数,这个参数必须进行初始化,sizeof
, P. {: X2 \& n- Z+ N
+ N8 e/ h6 G& o* v5 k3 V/ E( i
//循环等待接受客户端发送请求
) s( J' W/ J- ?7 G$ r
( P* Y* N- |- Q1 q
while (1)
, E5 l- y X% w# z
{
, t! x/ v. a0 f
//等待客户请求到来;当请求到来后,接受连接请求,
5 x% \% E( c1 t4 V4 Q0 n
Q9 i* ^" n: h$ Q5 a+ F7 k1 C
//返回一个新的对应于此次连接的套接字(accept)。
! o( s- N! {, Q) F
//此时程序在此发生阻塞
) r7 G+ i! @( ]& O2 s) S0 A
" H* e$ y+ I6 r* d9 ]1 { [
SOCKET sockConn = accept(socSrv, (SOCKADDR*)&addrClient, &len);
1 `% p/ `% |) u# U- o5 r, S
, X: P" t3 K/ ~5 P: p9 u3 r
char sendBuf[100];
7 W; P7 g. _7 |! q
1 m1 M+ n9 g0 v
sprintf(sendBuf, "Welcome %s to JoyChou",
' l. W( J% t0 s' l$ b; Z& p
1 g. F U+ s& X+ K9 o8 t r
inet_ntoa(addrClient.sin_addr));//格式化输出
- F$ T H) c: r( {; I3 o
( @9 m x, g2 D
//用返回的套接字和客户端进行通信
8 t- \4 \" `) E" i5 s6 ]: [
: b9 t: x3 G% A2 q" w: @* w+ L# }7 P
send(sockConn, sendBuf, strlen(sendBuf)+1, 0);//多发送一个字节
$ h( A- D2 y4 A0 t0 s2 [
2 d6 r% K; O6 V W
//接收数据
( J0 m" K) g, ~3 Q
! W( Z2 @: [6 T
char recvBuf[100];
& x+ Z4 `' n4 P6 ~4 D- H; `
" B! N5 u2 {, d/ c; s3 F+ w; z
recv(sockConn, recvBuf, 100, 0);
3 ~1 X c4 C+ V. j0 X! l y
7 Q1 W$ F+ |* }, d
printf("%s\n", recvBuf);
: ]) o- g6 J2 Y
closesocket(sockConn);
4 w0 I- C3 @+ L8 m1 v* a
3 @& s8 a+ k! r' t) [0 v
}
6 g0 x5 I2 f& {. z( e- L. C& W" ~
}
7 o8 Q3 H0 X1 ]$ @
3 D8 q/ `& j8 X2 Q! z
8 G) W5 R% F5 u4 ^% I! Y$ ]
Client:
3 ?8 p8 L8 @7 B/ @/ g
1 U! i9 W& m$ S
#include <winsock2.H>
% ?8 O/ }9 |) D5 R
#pragma comment(lib, "Ws2_32.lib")
' L) D) e) R& z/ i$ k
#include <stdio.h>
+ ?3 T/ U: i$ _+ u4 u
#include <string.h>
" ?; {4 _4 u, u. F( n
+ Q1 o3 X9 u4 r4 I% T1 R5 \
void main()
8 @; c6 a; i+ S
{
$ m6 R4 y! H( B- V, k
WORD wVersionRequested;
4 V- U( x& W2 I% F3 d( t; ^
WSADATA wsaData;
# ]. h: R3 a/ {/ B& [% g
int err;
9 @& g4 Y: R- f1 a6 V# j R d
, g' |# A; F: Q' ?: u* `( f/ H
wVersionRequested = MAKEWORD( 2, 2 );
- w. i% W7 g% _
2 _1 M1 c" p9 m4 b, [6 U7 x/ q
err = WSAStartup( wVersionRequested, &wsaData );
0 c# j/ c. z" o+ C. r/ m: {1 B. l
if ( err != 0 ) {
( q% s: i L2 K
: L+ ?# n. n! o) @& h8 H: a/ V H
return;
1 O; x+ n: p# z" |1 a2 q* _) w
}
* z3 |# h9 L$ S9 E* C
& n7 b) ~/ _# o8 g3 ?
$ K6 v8 D; K& W9 N+ d9 {9 J
if ( LOBYTE( wsaData.wVersion ) != 2 ||
: u: K4 b/ Z+ ^: S+ C2 f. u4 c
HIBYTE( wsaData.wVersion ) != 2 )
+ D6 y) b ?+ B7 c2 M. A% g
{
$ D b/ M5 r0 F, h
1 o% P0 Z3 T9 X5 l
WSACleanup( );
! X9 ]; z6 \' J1 V' S; Z
return;
* Q7 s% {/ p* M {- M
}
* z4 N+ k# d& j- t: W4 l+ P
SOCKET socketClient = socket(AF_INET, SOCK_STREAM, 0);
% P9 [ L6 `3 X
SOCKADDR_IN addrSrv;
" L1 }' ^! Z% Z6 V6 N) O
addrSrv.sin_family = AF_INET;
% F/ q q H( l$ x. W9 J
addrSrv.sin_port = htons(6000);
+ p* n3 x. U6 ?6 b
addrSrv.sin_addr.S_un.S_addr = inet_addr("192.168.1.101");//服务器端的IP地址
- y7 |- ~" y4 e
# v: n- R) |- ^. H
connect(socketClient, (SOCKADDR *)&addrSrv, sizeof(SOCKADDR));
$ N$ p9 G' p7 l- q% N
char recvBuf[256];
) I* _4 u* i$ Y n5 }" G
char sendBuf[] = "This is Joychou";
3 C1 g0 p2 h/ u* ^6 M7 h# S
recv(socketClient, recvBuf, 256, 0);
' `( f5 [7 v% L4 [
printf("%s\n", recvBuf);
4 O6 f( p; Y S+ k) q
send(socketClient, sendBuf, strlen(sendBuf) + 1, 0);
) C. j0 Q/ B) I& A; P$ o( x1 h }
closesocket(socketClient);
! S5 P8 G1 \# X
WSACleanup();
8 i; e- k, e9 [+ C: w
8 q% f7 E7 v' Y3 i* O2 H! I: C+ i( O
}
复制代码
* j0 p. `7 l. L& ?
( ?5 Z5 z' D6 }2 s5 _" K! _: {- A
欢迎光临 cncml手绘网 (http://www.cncml.com/)
Powered by Discuz! X3.2