管理员
   
论坛积分
分
威望 点
贡献值 个
金币 枚
|
程序很简单,windows环境下的,客户端和服务器程序都在本机运行,在客户端输入发送给服务器的字符串,服务器收到字符串后会打印出来,同时与"abc"比较,与"abc"相同就会返给客户端,输入的是正确的,不同会告诉客户端输入时错误的。% c! l3 j8 J# _/ c' X+ g" S
客户端程序:client.cpp+ ]) i6 T/ y1 t' {7 z
- #include <winsock2.h>6 [. F( T& j' P& L9 P
- #include <stdio.h>2 G/ c z' ^; O/ f9 K
- #include <stdlib.h>
% h+ P* \, x# p. {* R( w' j6 [; n
, T) O3 w/ Z% B% r- #define DEFAULT_PORT 5150
. x2 m; i+ `. w( I% ?7 H' e - #define DEFAULT_BUFFER 20483 n+ w9 f; G6 p3 l; D* B& x
* v7 ?- N* ]9 r5 t0 J+ H. \! x4 w$ Z- char szServer[128],
3 w* l% S, j; }( q2 u0 U9 B4 T# h* b - szMessage[1024];
. `- ?6 Q! {( X4 j - int iPort = DEFAULT_PORT;
5 _4 N/ K: P/ h( E6 P
& v1 s5 v/ y2 n" Q" w* C6 z- int main()( E S$ u! Z- B9 K9 ^6 m0 b. b5 h
- {: P, O, V s" |+ P
- WSADATA wsd;
+ Z$ i# i" F( C4 U. p - SOCKET sClient;; N$ P" C' h \: {( C! ~
- char szBuffer[DEFAULT_BUFFER];
8 h) \; T7 W9 x% M H. h - int ret;$ ?. B& X8 i7 |9 U
- struct sockaddr_in server;/ m t7 \% x: t- J4 D% J
- struct hostent *host = NULL;5 b7 A% M3 L; N+ x, J$ D4 t
- if (WSAStartup(MAKEWORD(2,2), &wsd) != 0)3 h \, E K7 h# U3 u' F
- {
& b; \1 i* I" i% r - printf("Failed to load Winsock library!\n");! E9 W. D$ v% ]0 a
- return 1;
3 D! ?! w& W o - }
d3 I3 |# _ r& y - printf("Enter a string to send to server:\n");
7 m- N9 R8 L* M' @- ]( O - gets(szMessage); _: n% X- h2 k; q( H/ ]
- // Create the socket, and attempt to connect to the server
2 O! V% G7 S* ~6 h, c8 a - sClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);4 N% h# {' S9 S
- if (sClient == INVALID_SOCKET)" E3 d0 l# d5 c D
- {6 V! Y5 w7 O1 w) S' b/ [7 b
- printf("socket() failed: %d\n", WSAGetLastError());
1 ^' ^) Q, s+ d - return 1;* l3 T' b7 Y q# F
- }
X$ |& f$ H y. h1 R7 h4 d - server.sin_family = AF_INET;
0 F( i1 y8 F W& R! x" Q - server.sin_port = htons(iPort);
; y6 }% R: f5 }7 i0 W6 E' k5 W - server.sin_addr.s_addr = inet_addr("127.0.0.1");6 f4 J' I4 K, D
- 2 w) Q: @$ y/ U: J% ~, c
- if (connect(sClient, (struct sockaddr *)&server,/ X; X( }! b; `$ S& c5 ?
- sizeof(server)) == SOCKET_ERROR)
5 _2 m8 M, ^% B: L( K* d - {4 P4 B9 ?$ M* h
- printf("connect() failed: %d\n", WSAGetLastError());; t' ?! u( l1 T
- return 1;
. l2 L+ y: V8 K, D6 ~% L$ b- O, @1 F - }
8 P) @8 m5 h8 m' ^# h, ? o - // Send and receive data8 p' X( s. t4 w( w: u
- ret = send(sClient, szMessage, strlen(szMessage), 0);
) G# z& y0 t: j' C - if (ret == SOCKET_ERROR)
+ ]+ U2 O; Q4 h4 Q) d - {
" r3 L! L% o2 S& e5 W - printf("send() failed: %d\n", WSAGetLastError());; S% i2 g6 N3 j0 S0 ], N, r
- }
, m% f8 R0 r, b* r9 {! H( z - else{: v9 [3 q2 L, V5 a
- printf("Send '%s' \n", szMessage);! f% Z" y7 f9 w- W. U3 u5 x
- ret = recv(sClient, szBuffer, DEFAULT_BUFFER, 0);$ p6 u; P6 ?; {1 b3 g8 j
- if (ret == SOCKET_ERROR){4 ?1 Z9 M/ ~3 M9 Q D4 v6 F% I6 H
- printf("recv() failed: %d\n", WSAGetLastError());
, O3 u6 J" s& z/ e; i# z - }9 b/ ]" ^% d0 ^; g* q% O
- else{4 j8 `' E8 l7 H) }; s/ |" N$ b0 ~
- szBuffer[ret] = '\0';
! a/ w9 v2 A$ c, O J. h& l4 } - printf("RECV: '%s'\n",szBuffer);) P& e9 ^1 `$ U6 O
- }) j# ?6 E) z6 Z( X k
- }
% }2 {/ U! b1 b! |" J7 t' n - closesocket(sClient);
2 u* X4 [% a9 Y$ \7 Y; I5 A - $ u+ }/ ^, h" l
- WSACleanup();( @' C- h. I+ w8 Z
- return 0;
; N- E3 O# q* w" u$ N1 q - }
复制代码 服务器程序:server.cpp% c- |3 S- O3 y1 f
- #include <winsock2.h>
7 k' f, e+ g$ Y. i8 x/ Y- J$ C- w$ c - #include <stdio.h>* A4 ?; Z0 w2 q/ k, T- g# u
- #include <stdlib.h>
. Y7 T. E% v K7 L - Y, G) t6 }9 f X- C! V3 E, d
- #define DEFAULT_PORT 5150( T, T3 ~: F5 c# ^ F$ x
- #define DEFAULT_BUFFER 4096$ S) ^# {& o# n+ m2 k- u2 ~ a
! Q+ c9 G! X3 D, A- a- int iPort = DEFAULT_PORT;( I/ {6 E5 {% {' Z
- char szAddress[128];/ z/ W5 B: v2 j0 ]) l. p1 _
- 4 _/ N+ ?, `% `, g
- DWORD WINAPI ClientThread(LPVOID lpParam)' ~% M, @) Y4 l2 j6 q4 N' e+ @( [
- {# \* M' B0 F' ?4 a0 R- l3 X
- SOCKET sock=(SOCKET)lpParam;
2 I5 R: e; x# {) U$ k - char szBuff[DEFAULT_BUFFER];! ]. l* H2 m! O$ V9 w' T
- int ret;/ q! H% I5 j" [6 r5 m y- K
2 p) Q- _, \0 V- while(1)
% U+ z2 M: F) B3 _! b: F - {
1 g1 F3 Y, |! n# P8 y* j - ret = recv(sock, szBuff, DEFAULT_BUFFER, 0);( f$ X+ ?" u8 k2 k8 @1 t/ E7 I
- if (ret == 0)/ j1 [2 Y& c9 l# O _! |
- break;: _: y- J" x: B
- else if (ret == SOCKET_ERROR) W: N6 o4 t5 A' `- D# b, @. M
- {3 f( B' S$ H6 n, ~+ x
- printf("recv() failed: %d\n", WSAGetLastError());1 x1 K% f% j( ~3 m
- break;
9 z+ N5 e, F) I7 b - }
" C) k0 g" }! C% [0 v+ s - szBuff[ret] = '\0';
- U2 T% t) c# p' O8 w - printf("RECV: '%s'\n", szBuff);
0 @4 H q! e! p - if(strcmp(szBuff,"abc")==0){ _" p! p5 s0 f& P# m
- memcpy(szBuff,"Send the correct string!",25);
. t7 L2 z) g7 |/ L3 q2 o! ]# z* t - }6 G; L6 k- ^: D% W4 N
- else{. Z/ t( ~% q9 W0 i/ Z% @+ K. c
- memcpy(szBuff,"Send the wrong string!",23);
1 I, G6 Q* H: Q/ N; C f - }+ ^" ^+ Q9 u' P! b2 U
- ret = send(sock, szBuff, strlen(szBuff), 0);' z- F/ G; G- Q
- if (ret == SOCKET_ERROR){1 r: R3 r. A( s/ Y9 q/ E3 j
- printf("send() failed: %d\n", WSAGetLastError());
/ r8 _, E; r) ^1 R! ^ - }7 P3 a* k2 d; m& W' g- P9 S+ p; V
- }0 B: u9 `: d5 b6 z; {4 I+ m
- return 0;' b: l% j0 r0 `
- }( |9 i* R n0 n- p7 G' y* y
- , i' F0 h; S% W* b* `
- int main()/ e3 b( o) y+ q1 p' ]" M
- { R6 @4 \5 I! [3 K4 d5 ]
- WSADATA wsd;2 |, g, Z& d# o" n! ?
- SOCKET sListen,
" ?3 `7 n0 Y- o5 n - sClient;0 h; D: c5 @2 A; I' y
- int iAddrSize;* c0 z' Q* A$ p9 h
- HANDLE hThread;7 }5 L9 @8 l1 p! |7 J) ? t
- DWORD dwThreadId;
( a _1 g% E/ P; r7 C - struct sockaddr_in local,
0 V x; b: O; h7 g - client;
* B: F6 r! e, d+ h# ~9 y! e2 F
* o! t& k, u% V6 h" g) I! ?- if (WSAStartup(MAKEWORD(2,2), &wsd) != 0)& s# ]' h, ?* ~$ n% r& W' e1 w
- {
% x6 f$ [* ?$ p9 D$ z - printf("Failed to load Winsock!\n");
- X! k* H$ T0 O; S7 S' u/ l - return 1;- U# |( p- o# s
- }3 f# ]2 y1 K, ]& c. M
- // Create our listening socket
2 q$ d+ M2 L V5 |; E8 D - sListen = socket(AF_INET, SOCK_STREAM, IPPROTO_IP);
+ s0 [" C5 K" [ - if (sListen == SOCKET_ERROR)) o% e9 h7 D5 M$ x! Z- ]- G
- {
( d$ z. t, N9 B' ^( b4 f7 P1 a - printf("socket() failed: %d\n", WSAGetLastError());6 x/ t" G ~; X
- return 1;
5 Y A" q$ U: [( w - }
9 A5 r1 M/ q9 t7 V2 }' f - local.sin_addr.s_addr = htonl(INADDR_ANY);0 Q' v$ n9 L X' y- z/ Z# g
- local.sin_family = AF_INET;
9 K9 k3 o- ]* t2 h - local.sin_port = htons(iPort);- W+ P0 m7 Y5 r% N
- , y+ C& v" g% {) b0 H7 ^
- if (bind(sListen, (struct sockaddr *)&local, B$ F9 L: i, [! w- A; c% K: h5 W$ k
- sizeof(local)) == SOCKET_ERROR)
" o2 B- O& a) E& }3 f - {$ a6 {6 F4 ]9 t9 S$ @; b& X1 A
- printf("bind() failed: %d\n", WSAGetLastError());( Z% W, _. U- X* l, U2 o! A, K
- return 1;
! ~ t1 d. K8 {! \ - }
1 V' ^: C& g( |9 m - listen(sListen, 8);
0 O0 `3 M8 l9 H d: c. e - // In a continous loop, wait for incoming clients. Once one$ ~0 h8 W& L& w4 ?2 f, L
- // is detected, create a thread and pass the handle off to it.* K* z/ `0 y( E/ ?. a) D3 D$ j, c8 e
- while (1)8 r& }( k' Q4 F
- {
6 h' J. r3 G5 e4 w0 s0 _" G - iAddrSize = sizeof(client);, O. t0 j7 Y5 f4 G- X h! s+ e5 u
- sClient = accept(sListen, (struct sockaddr *)&client,
5 j9 v a. ?1 z- ~; o" A - &iAddrSize);
3 K1 c( q3 I, c% x" c% a. g; B - if (sClient == INVALID_SOCKET)! k) L. { J9 b3 U& s
- { 7 C s0 V4 Q1 l6 l) |
- printf("accept() failed: %d\n", WSAGetLastError());
& ]6 W0 @7 ^: k2 u - break;2 v S7 U Y5 U6 m8 U) y- N2 r
- }) H+ i; @- u! `- k' l! |/ W V
- printf("Accepted client: %s:%d\n",- q Z# S% w0 k1 V8 r& \1 R
- inet_ntoa(client.sin_addr), ntohs(client.sin_port));
+ M! d* G2 ^& i9 D7 C
% P: z! Q! v7 \) C* b9 y- j* x( a- hThread = CreateThread(NULL, 0, ClientThread,
7 B( e* V$ o3 |6 n5 v3 g9 l - (LPVOID)sClient, 0, &dwThreadId); F% ?7 d0 T0 |# P' U8 C9 ]. G R
- if (hThread == NULL)) a4 s, J( P# f) Z7 Y# I
- {$ V* k$ q9 ~# c; n
- printf("CreateThread() failed: %d\n", GetLastError());
# `7 e8 j5 F9 R0 T0 O- N- X2 y - break;
% V7 G% E* f" \& G# y2 u5 e - }/ x- p! o4 y: D, i# ^+ {# J1 y2 w [* v: c
- CloseHandle(hThread);
& K' P/ S9 B+ C$ w+ E - }- u6 Q% T. z5 z6 ]
- closesocket(sListen);( }# u/ j' k! C! S
-
; M9 V& [/ N! E2 T - WSACleanup();! E0 c( t! _/ r2 G
- return 0;7 e- X% {7 X( g- E
- }
复制代码 3 Y1 h5 g+ Z- r# Q" B
2 p) I8 G* h$ S4 h% j0 |' w8 t1 L2 t) O( F$ [$ r' V
; V" R q" y% i( }; w- Q1 R- o
" e* h5 p5 C! i" X: n
|
|