管理员
   
论坛积分
分
威望 点
贡献值 个
金币 枚
|
程序很简单,windows环境下的,客户端和服务器程序都在本机运行,在客户端输入发送给服务器的字符串,服务器收到字符串后会打印出来,同时与"abc"比较,与"abc"相同就会返给客户端,输入的是正确的,不同会告诉客户端输入时错误的。
( z8 E! O1 E& H% W4 h客户端程序:client.cpp0 @, h: B& {' r, A: Z
- #include <winsock2.h>& z# q# t2 H5 D7 o: [) z: T
- #include <stdio.h>! `8 ^2 L7 b8 Y$ @ y0 `% S+ [! k
- #include <stdlib.h>
^$ \/ Z1 l% P B8 y1 p) s9 u) o3 j, a - 7 Y @& B G8 K8 q
- #define DEFAULT_PORT 5150
( W4 V( ]9 L# O- t/ H - #define DEFAULT_BUFFER 2048 }: b2 n1 e. v
5 r4 d0 t( g. i4 K: z- char szServer[128],* s. P {- s3 p( ?8 V) _, Y# n
- szMessage[1024];
. D6 R3 Q. |/ n0 t- Z' }# E - int iPort = DEFAULT_PORT;
. p5 ^4 c8 y# X- b! g& } - : S/ H p' m3 X+ s7 N m
- int main()2 ^* I5 B5 m0 K2 X% g! f
- {
# J# b c4 Q6 K" G1 x. ~ - WSADATA wsd;- F( |- c/ E; B9 V( }% }& W9 s- o
- SOCKET sClient;9 X( u5 ?7 q' f: L; u7 G7 l
- char szBuffer[DEFAULT_BUFFER];
3 A( K- B) I1 Q8 P! K$ f/ ]. x - int ret;
" Q# q! b* @' j' T - struct sockaddr_in server;
! I0 g& F$ S d; y! K; o/ g - struct hostent *host = NULL;
2 j: c2 X: r9 u! F) N4 G - if (WSAStartup(MAKEWORD(2,2), &wsd) != 0)5 [( l! S7 Q) s+ X
- {
* c+ h4 P: Q" c( q) n) q - printf("Failed to load Winsock library!\n");% S6 J, V3 S4 K2 s' r
- return 1;0 r% @/ U& |; m* Q" k: T( x8 d
- }
8 v) j- f. a; p) }: ~. @7 S, C - printf("Enter a string to send to server:\n");* o6 g% a F' u+ R+ ]
- gets(szMessage);' t' l% V: A& {: p! J
- // Create the socket, and attempt to connect to the server
- X* w& j% U2 d( H* `6 r0 U M - sClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);1 D# ] B2 `6 R4 z5 |( C
- if (sClient == INVALID_SOCKET)
4 M- v; J& D/ h, m1 H - {
1 b, j5 V: \$ u. N4 |' \ - printf("socket() failed: %d\n", WSAGetLastError());
: q f( K7 O" `" \% G r* i/ W7 D - return 1;1 p6 |4 M+ Y! R" k u
- }
( l3 O# n) _3 |) V - server.sin_family = AF_INET;
' k7 P9 ~+ q" { o N - server.sin_port = htons(iPort);" D! l- E L; P$ T) |
- server.sin_addr.s_addr = inet_addr("127.0.0.1");
m8 _$ D; i) T, j! c- R - " V( i: B6 D" a) u
- if (connect(sClient, (struct sockaddr *)&server,
1 R: J& n' R* ^6 y6 _ A1 N* m - sizeof(server)) == SOCKET_ERROR)
3 u& S) h% q4 e - {
4 O: l! ]- f' G# Z8 F - printf("connect() failed: %d\n", WSAGetLastError());( h5 u( S L) F
- return 1;7 z' g0 V9 K2 S8 Y
- }
" n$ A6 |" u" L) k+ o. s - // Send and receive data* X) `0 t$ Y" z# N( Z" d1 i( f3 r
- ret = send(sClient, szMessage, strlen(szMessage), 0);! w( A6 [* l( G7 |8 n
- if (ret == SOCKET_ERROR)
7 h6 {( b4 [ @7 N$ a8 k1 ^ - {
* U: t/ h A$ F0 _0 _ - printf("send() failed: %d\n", WSAGetLastError());
+ C. [1 Z/ x, f$ J7 A8 b! @ - }
* G% N( v$ F b# K& o& ? - else{
) V! g: _, Z( S( n - printf("Send '%s' \n", szMessage);: O0 B; G& L" P: A
- ret = recv(sClient, szBuffer, DEFAULT_BUFFER, 0);) [ X# z, |5 H% ?
- if (ret == SOCKET_ERROR){
7 H) j7 Q* y @ - printf("recv() failed: %d\n", WSAGetLastError());
1 W6 c5 h$ ?5 G8 D% c; b - }2 ]0 w8 Z6 f2 f6 p! m" K
- else{
; K6 r- {% M% d - szBuffer[ret] = '\0';
3 S+ C* V' x1 w. E" y+ [0 M6 p( p - printf("RECV: '%s'\n",szBuffer);& F) U4 n. X( V9 f
- }3 a) Y& e1 O6 }) K$ R
- }3 H' O% F9 i! X' o1 c
- closesocket(sClient);: z) P4 c+ w: A' h9 Z
- 2 \2 z7 D c$ d) _$ n
- WSACleanup();
1 x" t8 g* @7 y, G - return 0;
) A6 B! J' E, k - }
复制代码 服务器程序:server.cpp
* _/ N4 V8 j- ~ i; ^- #include <winsock2.h>
4 K7 j- ^$ L; ?$ Z( Q- T8 R" H - #include <stdio.h>% H9 Y8 M# g9 a
- #include <stdlib.h>
/ o3 h6 L6 q* J' Y/ p
~6 Q9 d" a6 c. p, w- #define DEFAULT_PORT 5150' s- ?; `5 ?: p/ ^/ }2 D( s+ f
- #define DEFAULT_BUFFER 4096
3 U7 N) H$ t% |* T' U$ z% U9 X
# E3 ?. @4 R0 d0 v1 D2 J1 U- int iPort = DEFAULT_PORT;+ d. U* c8 K/ i! ~
- char szAddress[128];
/ q. y2 B4 m+ h/ j
; a. J" P8 \6 r# k( a9 [- DWORD WINAPI ClientThread(LPVOID lpParam)
/ k6 O6 ~7 _% P: z) h - {
2 a3 Y9 a5 u% p: P5 J3 Y8 M( Q, z - SOCKET sock=(SOCKET)lpParam;
& }/ C( k' P, g6 t& k, k: P$ U8 V( | - char szBuff[DEFAULT_BUFFER];+ n+ D' ~, Q% [
- int ret; l% O4 g# |! h' H1 z1 h9 Z
& z1 Z% m y6 ~7 ]0 `6 c- while(1)1 q( J( I0 J0 y8 j$ p2 }2 C
- {% V* i$ q9 \ d' a" ^! h% @
- ret = recv(sock, szBuff, DEFAULT_BUFFER, 0);, ^2 a+ \2 h- A9 z, W
- if (ret == 0)
' [+ h* I) [3 G+ E$ L - break;
, _0 R1 G" t* r4 w) L( o - else if (ret == SOCKET_ERROR)
6 s* P6 u5 Y& W7 i+ T" N - { G, o2 a8 z2 ~
- printf("recv() failed: %d\n", WSAGetLastError());6 n$ s( N; Y o/ t# W. ?
- break; a' F, G5 Z, Y P7 w
- }
" G! k2 G' W3 f1 H' ]( Z6 W2 u - szBuff[ret] = '\0';
4 @5 d/ j1 ] b! y - printf("RECV: '%s'\n", szBuff);0 e& N# H. F) K0 d3 n2 v
- if(strcmp(szBuff,"abc")==0){
' a% d7 V" B4 p9 W3 n7 _& C - memcpy(szBuff,"Send the correct string!",25);( `" H0 |6 h) n/ _8 d. W# ]: G! ~0 x
- }
* y8 X1 K5 {% F" t6 A# s - else{
- a3 s& e' `# ?- G$ ]3 U - memcpy(szBuff,"Send the wrong string!",23);
9 e3 S7 i) v) n6 k5 \8 s3 { - }
# {' k7 \! P- P; Z - ret = send(sock, szBuff, strlen(szBuff), 0);
+ R/ y4 Z# b- I/ g4 l3 H - if (ret == SOCKET_ERROR){
+ @0 e' b! e8 s) C" h - printf("send() failed: %d\n", WSAGetLastError());, ^$ t4 z, I, j( A3 w
- }
$ h1 | V0 X$ L8 ^- F5 y - }; `$ v) S" W- d% I' \* h
- return 0;$ Q+ h" ]' D$ ]& Z( z1 e' k
- }
6 N* @4 ^% Y7 v, B - $ q; T8 O/ I) ]" U) V( W8 J
- int main()) O1 ^4 `9 B- h% a4 a0 j
- {
+ g) Z: V" T' @/ E - WSADATA wsd;( e" F1 w! P; B
- SOCKET sListen,2 C4 }; i6 A/ k6 B9 D
- sClient;
k! Q' Y, s; {) l' C* j" ^0 s: P3 D5 R - int iAddrSize;: J6 c* e* U2 M3 G. Y
- HANDLE hThread;- C# ?+ R! g1 O5 j) s7 {
- DWORD dwThreadId;3 m {2 d/ f2 d% i& q2 s! C) T* t/ G( m
- struct sockaddr_in local,
* p6 [% m) N) S8 } - client;
1 j/ @+ b5 Y; Z+ H3 M, }6 | - 7 m3 z) m! b0 `5 i! { {2 F
- if (WSAStartup(MAKEWORD(2,2), &wsd) != 0)# A( h6 ~: y' n
- {
+ q5 S6 I( f' o& _# k - printf("Failed to load Winsock!\n");
3 ]) J0 H1 y' f8 @' v% m6 [ - return 1;
# L# D4 f* P3 \# `- H! S+ } - }. B) w7 \2 j e! W& E
- // Create our listening socket) W, _/ x* H) u( T8 T
- sListen = socket(AF_INET, SOCK_STREAM, IPPROTO_IP);' R u; o: y2 `) Q$ E6 g8 E
- if (sListen == SOCKET_ERROR)
3 G1 ~8 X% d* W. [ - {
) B- F7 ~9 Q; D' N6 _ - printf("socket() failed: %d\n", WSAGetLastError());
* z3 |0 Y. s8 b% @; f, o - return 1;
+ s/ z5 X4 H a* N, M0 w/ ^ - }
9 {5 d) P9 g+ D! H% i1 f; k8 L( v: p - local.sin_addr.s_addr = htonl(INADDR_ANY);( m* ~7 _2 Z% V- Y( Y$ M! G
- local.sin_family = AF_INET;/ h9 ~$ W6 ~& e* @1 F: ?' c
- local.sin_port = htons(iPort);
- _. a: L/ F& K& ~
0 F' N; C9 e8 ]7 |+ v& n8 ^! P- if (bind(sListen, (struct sockaddr *)&local,8 b+ Z3 h' w/ M
- sizeof(local)) == SOCKET_ERROR)2 T% U; s. V, Y, [9 s$ ~
- {
: o* L' `; D2 E# W4 Z6 R; [ - printf("bind() failed: %d\n", WSAGetLastError());# G, v$ b0 m+ K% E0 l
- return 1;- Q5 x9 o, |" M
- }
% h6 q; _( c5 A% y {" U% m [ - listen(sListen, 8);9 k+ w* ?( M" z0 I8 x% {$ N3 [
- // In a continous loop, wait for incoming clients. Once one3 M3 c$ W! C$ r- N+ U. [
- // is detected, create a thread and pass the handle off to it.) G5 O2 f" V/ R% \* ]
- while (1)2 a2 J4 p# Q, N, S9 ~
- {5 e% s% k0 @+ X% G
- iAddrSize = sizeof(client);
6 G" E% n' G+ m4 p* j! d - sClient = accept(sListen, (struct sockaddr *)&client,
. F9 v' F1 {, c* e$ X2 i - &iAddrSize); 7 d* c% U+ D) A5 L/ q6 H3 ]
- if (sClient == INVALID_SOCKET)
! |, x, _6 J, J( I) t9 {7 k - {
# k$ C. Q, v2 Y" m0 m' z) m - printf("accept() failed: %d\n", WSAGetLastError());
8 E" l k" Z# B2 U$ v - break;! D. G( |4 v( R) M8 r* |/ x. m
- }6 y ?2 {* s1 F9 {3 _9 I
- printf("Accepted client: %s:%d\n",
5 Q3 G, y4 B. ]" f - inet_ntoa(client.sin_addr), ntohs(client.sin_port));& `8 R7 K5 l9 U6 O* h
- g* o5 @3 Z3 Q6 U6 ]# b
- hThread = CreateThread(NULL, 0, ClientThread,
, B% ~5 t: u. a" _0 c6 @ - (LPVOID)sClient, 0, &dwThreadId);
6 E- J: W4 X9 ^5 o) q5 x- z& B; v - if (hThread == NULL)" m! I5 D9 v; R! ? r6 s& a7 Y9 L
- {
; [8 K) M8 D: ]# j - printf("CreateThread() failed: %d\n", GetLastError());" J. g$ n1 J) x
- break;) W# a: ?4 u! W! m! ~2 H6 h
- }/ i- D# `6 N# ^. ^
- CloseHandle(hThread);
$ J* _2 Y+ y% m% S, T - }2 h% x/ c9 ~' {( z
- closesocket(sListen);. a3 l- L0 v* {2 x$ a: V
-
5 U. `$ v& G; H) c. u* j% A- ^ - WSACleanup();
% k4 n2 F+ x: P' l - return 0;
4 f% ]$ D. L3 [9 K - }
复制代码
- }8 E; I0 i8 q
' d, D E. i7 n3 G3 S, d. y% D7 ^' L+ j' M j
- b: h S, F1 M) Y! ^4 N( x9 O
d4 x% ~/ u- X
|
|