管理员
   
论坛积分
分
威望 点
贡献值 个
金币 枚
|
程序很简单,windows环境下的,客户端和服务器程序都在本机运行,在客户端输入发送给服务器的字符串,服务器收到字符串后会打印出来,同时与"abc"比较,与"abc"相同就会返给客户端,输入的是正确的,不同会告诉客户端输入时错误的。
l1 R" d$ V1 D4 B5 ` b, S$ N1 f! ~客户端程序:client.cpp
+ B% r! A: h! K! _- #include <winsock2.h>7 h! e$ ?$ p n) S3 y# G" z
- #include <stdio.h>) q* f" n' I- a2 I4 T2 M
- #include <stdlib.h>
' H( C; Q- p% Q* {. K
8 f' p: a0 v4 A; y- #define DEFAULT_PORT 5150
% q8 E) |$ g1 k% |+ i2 k - #define DEFAULT_BUFFER 2048
- z, w2 C* G3 y+ n3 L
! ]( m: f* Q/ T' F1 x- q/ E! Q- char szServer[128],0 S0 K; r6 {4 w8 a' \7 P
- szMessage[1024];
5 ]8 [( T& a( L$ z; m; Q2 g - int iPort = DEFAULT_PORT;
4 a) T* N+ Y% E3 g
8 `- H5 A5 S4 _0 w- int main()+ k- k, ?$ l4 q, E9 p% Q/ S' W( q5 n. q
- {3 S! C( F4 e: o
- WSADATA wsd;
) \+ M: L2 e6 v, W% |# v - SOCKET sClient;" L+ c1 x; t# O: e3 O
- char szBuffer[DEFAULT_BUFFER];; L4 t- ^0 U* X% a: R6 o$ a+ b6 n
- int ret;
' W! w- `5 g" I- a5 k - struct sockaddr_in server;( v! i( X. I% _3 }! g; n$ O' |
- struct hostent *host = NULL;
1 p$ M& m1 n! E1 K# N' L - if (WSAStartup(MAKEWORD(2,2), &wsd) != 0)% x$ v* O$ c, `+ o2 B% x+ c% f1 Q
- {
. h! _9 x0 g/ u/ g$ l - printf("Failed to load Winsock library!\n");! ^! E2 u5 b, V( k- J# Z. ^$ ~# L
- return 1;$ o8 C+ C1 }* x; o4 V( x
- }4 o4 ?6 y1 C3 A5 |# R
- printf("Enter a string to send to server:\n");1 _3 j; c$ E8 b$ p# W- B2 ^' j
- gets(szMessage);
/ A% G: i+ o4 M - // Create the socket, and attempt to connect to the server
' O' p' D4 W( B! v - sClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);8 F! r7 [2 r- T% T
- if (sClient == INVALID_SOCKET)
# l5 W1 P! Z$ Z3 ]& u+ `1 m - {
3 S5 b$ f) V# l - printf("socket() failed: %d\n", WSAGetLastError());" w6 N6 l7 q$ _) f7 r
- return 1;
7 m8 v9 v4 z- s* J1 D) o5 q6 t - }
7 @- q6 e |& [6 M ?" c - server.sin_family = AF_INET;
0 _, j5 i) C8 a4 e+ V4 V - server.sin_port = htons(iPort); s5 ~9 K* f' ]
- server.sin_addr.s_addr = inet_addr("127.0.0.1");
; `1 i5 P- f& S
8 G/ I, V" p! y6 {# j% D- if (connect(sClient, (struct sockaddr *)&server,5 J3 |# Z J4 \' ^5 [+ K# A
- sizeof(server)) == SOCKET_ERROR)
& }! z/ E. D8 n - {
+ N6 R# E1 y; j( L9 h - printf("connect() failed: %d\n", WSAGetLastError()); e- }; k6 Y! p& A$ Y7 M. q
- return 1;
: L2 N7 Q& m1 X* P# f+ g - }
0 c- o) N4 V" f: }$ f/ Z7 P5 S - // Send and receive data* g+ q' ? x" j5 i* Y% Z
- ret = send(sClient, szMessage, strlen(szMessage), 0);2 x+ b/ G" W: \$ ]
- if (ret == SOCKET_ERROR)& x: v$ y9 Y& w
- {
, H0 l i0 f3 T; l; H- b' t8 r - printf("send() failed: %d\n", WSAGetLastError());6 ?! D( ^, h6 V) B4 ^
- }
' x" E3 H- H( W7 p" q( I - else{! o5 @! w# p2 u
- printf("Send '%s' \n", szMessage);
5 ]6 N& ?+ C! R2 D" X$ S$ t - ret = recv(sClient, szBuffer, DEFAULT_BUFFER, 0);
3 R) M l4 l& X7 G$ Q8 [ - if (ret == SOCKET_ERROR){
* \& L+ _- w6 N- `7 t - printf("recv() failed: %d\n", WSAGetLastError());
8 B6 R* E. L4 P - }
/ f& o4 X# r" A/ {5 u; Q - else{% l) @, g" Z5 M' l: Z
- szBuffer[ret] = '\0';% A! k& Y' {6 @
- printf("RECV: '%s'\n",szBuffer);
# Z$ i1 B3 c' E3 E - }& R5 U9 ]- E. F+ C
- }
, m. B& l3 |* e4 ?* j5 a! v0 S - closesocket(sClient);; ^5 s9 p+ v: Q1 t+ n8 t. f& n1 ~
- ) Z( k" \! R' \8 K! q
- WSACleanup();
0 c; o# Z: N [" A - return 0;
' O9 Y: m) c% V8 H( U - }
复制代码 服务器程序:server.cpp5 v* ]" v$ h" c b W8 ~+ f' q
- #include <winsock2.h> M; L/ Y' Y4 y9 |* o! x
- #include <stdio.h>, m4 s/ C- p( A% U' E
- #include <stdlib.h>
* h% w% d& E% I+ z0 ^, U1 U0 v, P - " N3 A. }" T5 d! v G( Y8 _
- #define DEFAULT_PORT 5150
: _! ?( q* k1 D - #define DEFAULT_BUFFER 4096
8 s$ I' o& u4 G: a9 M" a
. Y6 E$ ~! J6 @7 ]5 g9 D- int iPort = DEFAULT_PORT;
6 _. |5 w( ?# ?4 o R - char szAddress[128];
7 f4 {- l5 [6 W8 h+ j
* B! d" L2 Z3 o5 \* L- DWORD WINAPI ClientThread(LPVOID lpParam)
( T1 Y0 d( r, U/ P - {! W, a: D- ?8 N6 ]8 s o% [( F
- SOCKET sock=(SOCKET)lpParam;
+ l1 h T/ X% `# J - char szBuff[DEFAULT_BUFFER];
8 J6 E) ^/ Q8 `) A/ V - int ret;$ C8 z" a7 d5 I, h; M
- & F9 B* @* e5 h" n, P
- while(1)6 e! \1 C4 L8 J+ l5 K& Z
- {
3 z0 f. e% l. y- F5 d; R8 f1 ?7 [7 K - ret = recv(sock, szBuff, DEFAULT_BUFFER, 0);
9 d& d/ Z5 W# O t- D - if (ret == 0)3 G0 C% c2 o+ e2 L1 `& x' e1 U
- break;
/ w" o, `5 d2 v. u; ?+ J - else if (ret == SOCKET_ERROR) ?6 E: B) W& Q; `9 q! q
- {- u% F+ s, l/ E- u5 {' g
- printf("recv() failed: %d\n", WSAGetLastError());
1 x& [0 ]6 x0 I5 x! J - break;
# }/ N& |, ]& [6 s- V - }
5 o* l2 W* M) W& ]6 k1 x - szBuff[ret] = '\0';2 s2 ]: ~/ I7 N% g; H' K
- printf("RECV: '%s'\n", szBuff);4 B5 o5 }0 ^, l. I7 a
- if(strcmp(szBuff,"abc")==0){- ^, d4 \0 C: A) r
- memcpy(szBuff,"Send the correct string!",25);0 G6 U# U0 n9 |
- }+ Q; ?- U* Z) H' F
- else{7 g( B# r# J& L2 O! Y5 U+ k0 O
- memcpy(szBuff,"Send the wrong string!",23);
7 Y) D% M! Y i+ ` - }) @$ ^/ b V: S3 B x& E) G% t
- ret = send(sock, szBuff, strlen(szBuff), 0);! S) Y: }9 ?4 I7 E
- if (ret == SOCKET_ERROR){' g. G3 x9 z/ J4 v7 x
- printf("send() failed: %d\n", WSAGetLastError());2 F, z: u. c' v
- }
) I/ g* g# ]1 v# S# h$ j& ^ - }
+ c& }1 p" ^ o9 z - return 0;
) p1 j, p$ O z8 p - } E& A9 ^+ O1 b, m
! Q& N5 f, H g Q) Q8 H( X- int main()
! P X% S5 ]7 k5 O% c7 y - {
% S+ D3 Y1 {% ~; \ - WSADATA wsd;
* J, j5 O/ W8 F) p( a1 V. A4 F - SOCKET sListen,2 ]1 U$ p% Z+ c+ E5 e0 {( Q
- sClient;: n1 `* e0 F: c1 ]1 ?0 l
- int iAddrSize;% _$ F8 |8 ^: [9 U) \' A6 X* V
- HANDLE hThread;
; p" ^, ]' @6 k) \; K0 I$ Y# [ - DWORD dwThreadId;
1 E9 Q1 I; u! D6 R: B- e) m - struct sockaddr_in local,0 Z# L2 q. M' _5 y+ a: N
- client;
# t L( ?/ u5 z" c/ Y - 6 K2 x8 {" @$ m6 I( x- o
- if (WSAStartup(MAKEWORD(2,2), &wsd) != 0)
3 K# M; Z W4 p - {* M5 E4 J$ a5 \/ K2 K
- printf("Failed to load Winsock!\n");0 x9 M. J8 a; J& T6 V, v+ c
- return 1;% x, o& w! O! M
- }2 e! w3 Y/ E% O& W& E7 K8 Y
- // Create our listening socket# e# _3 _ o% O6 _/ A1 p1 s
- sListen = socket(AF_INET, SOCK_STREAM, IPPROTO_IP); p, ^- A% B% f3 F% V- d( e( r H; }
- if (sListen == SOCKET_ERROR)# T1 A$ W4 V4 |
- {& L0 b8 N9 X. ]( F6 E
- printf("socket() failed: %d\n", WSAGetLastError());, a; }& }+ w# y1 I. g) `4 v; ?
- return 1;
, k6 p- C- I$ u% H - }5 U- k& S' }- @
- local.sin_addr.s_addr = htonl(INADDR_ANY);
; m+ s, l' w# [" ?, ?2 B0 Y/ j6 \+ ^ - local.sin_family = AF_INET;: \) x7 {5 Q! w
- local.sin_port = htons(iPort);: g- e% O; H1 j5 A1 [8 U: S
- 1 r, I! a" p) k5 R* [0 a
- if (bind(sListen, (struct sockaddr *)&local,
$ ~# B% i7 i2 Q6 {5 } - sizeof(local)) == SOCKET_ERROR)
& O( m% k8 m2 |8 P! h$ Q - {% v9 y1 c- v& E6 {; n
- printf("bind() failed: %d\n", WSAGetLastError());
! |' M1 _( L ^6 M" N6 j( Q& S - return 1;
. }" g" w0 M, }" j3 p' U9 r - }' ^7 H2 o5 t# B0 I, {
- listen(sListen, 8);
# U9 N; J8 |$ g7 j# q/ D6 @$ z - // In a continous loop, wait for incoming clients. Once one$ j' n' c# p1 t ~1 [
- // is detected, create a thread and pass the handle off to it.
( H* F9 u; [/ Q7 u - while (1)
/ D9 U4 Q+ n: f: } - {5 A# b/ N0 s$ t% K
- iAddrSize = sizeof(client);) O1 C& L1 K6 |/ E( @
- sClient = accept(sListen, (struct sockaddr *)&client,
6 {" M+ |: t2 Y- Q k6 a: ~$ t' U( t - &iAddrSize);
. p3 I1 I; y: r0 l" q/ e6 V5 I - if (sClient == INVALID_SOCKET)
$ u' ~5 t( X3 B- T" D - {
# t7 z, q9 @# |, {. x - printf("accept() failed: %d\n", WSAGetLastError());
8 a# K5 W$ X1 \# y% b! V% | - break;
: X, ~! T. i$ }% U. S - }7 f5 M( N5 r, o: d/ f3 ]
- printf("Accepted client: %s:%d\n",
4 N* H* w' E/ y0 Q - inet_ntoa(client.sin_addr), ntohs(client.sin_port));
4 l9 o }$ g5 p G - + u0 x3 I! }( w3 e
- hThread = CreateThread(NULL, 0, ClientThread,0 D+ F! O" T9 [" |4 X
- (LPVOID)sClient, 0, &dwThreadId);, e& t. b# J9 N3 r7 c
- if (hThread == NULL)6 P3 t" B* H( d S7 c* V2 g
- {
; C: F! s6 _+ t& n - printf("CreateThread() failed: %d\n", GetLastError());
0 X- w3 t- M% U# J& O; G - break;, p- t; Z X( `; `
- }+ T# K( w, ]7 |. Z. B
- CloseHandle(hThread);$ a) P- q% L, X/ G! \; V$ Q
- }
3 s- o6 A b! K: o! u, c - closesocket(sListen);
3 H- M5 `6 m0 c2 Q% }+ { -
0 I# N7 b7 D* x" X2 k1 Q4 h" l - WSACleanup();7 g# m* o. [- d6 j
- return 0;- L5 T! A5 m& Q0 x' G$ o
- }
复制代码 ( M& |/ L+ l& A' `( m- q( Q
) H4 W* k# q2 L
0 ^ n, D( \, }6 F# i# I, P0 ~
0 f$ ?8 V3 K+ I6 J( X3 J
# @) \* ] r0 S8 I P |
|