管理员
   
论坛积分
分
威望 点
贡献值 个
金币 枚
|
程序很简单,windows环境下的,客户端和服务器程序都在本机运行,在客户端输入发送给服务器的字符串,服务器收到字符串后会打印出来,同时与"abc"比较,与"abc"相同就会返给客户端,输入的是正确的,不同会告诉客户端输入时错误的。7 z$ Y2 @# z+ h% }; s3 \) W1 {% G
客户端程序:client.cpp
2 c) N) ]: G8 N" W- #include <winsock2.h>- e8 H/ J. p( c6 p
- #include <stdio.h>$ P2 a! M, t$ v% n% [
- #include <stdlib.h>/ |( \( A! M6 G9 K: ]
- 4 t: J0 m; X( s/ B. X+ @
- #define DEFAULT_PORT 5150
2 K! z5 }6 Q. s3 H2 S5 d; F - #define DEFAULT_BUFFER 2048
5 c; t5 q- y8 A: W, y
3 Y$ x( i' O8 C- ?& ?- char szServer[128],
, E. o! I* Y) u/ P$ d - szMessage[1024];
0 F' P3 w4 u3 R0 E9 B5 | - int iPort = DEFAULT_PORT;
# C2 q" g5 r$ a5 s! d - 9 [+ c. N0 T% \2 M
- int main()7 d% m" o j* {- X# r
- {
* b& T) S+ @' l- c+ }4 y - WSADATA wsd;2 L7 o) K$ _9 d, V
- SOCKET sClient;; i9 R7 t: U8 Z* ~- m7 O
- char szBuffer[DEFAULT_BUFFER];
8 a) n, Y" \7 U' p x - int ret;6 j4 W2 c O) @6 D# G1 s
- struct sockaddr_in server;0 P2 s& |% U' `+ _% L; c
- struct hostent *host = NULL;
+ T0 u3 _6 z) D+ Q0 \8 W! g - if (WSAStartup(MAKEWORD(2,2), &wsd) != 0)8 M' S$ E* T% c( M7 F0 Z
- {
3 A1 K# ~: M, A& u! }9 n% ` - printf("Failed to load Winsock library!\n");
( q3 T) I* U8 E. F v, q; I. x - return 1;, g$ ~7 Q' O0 K# \/ H! W
- }
, Y$ V, _/ |) q - printf("Enter a string to send to server:\n");
( d% B W0 G7 D- i7 H( y# c - gets(szMessage);
- Y) T3 f6 ?0 @, p - // Create the socket, and attempt to connect to the server; D6 Z& _, J, l1 K/ t
- sClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
% {: D, V, U% U% o' o. @' s - if (sClient == INVALID_SOCKET)
. I8 v1 ~9 \4 F' a, H - {. f! w H9 p) [
- printf("socket() failed: %d\n", WSAGetLastError());
6 `, ^6 |! N) y+ E - return 1;
$ e \0 v$ J# u* I - }
2 R D5 S0 W1 K - server.sin_family = AF_INET;- Z7 V" ~! ?1 L) n4 _ R
- server.sin_port = htons(iPort);
3 z; U7 K; N" J1 ?9 I9 c% { - server.sin_addr.s_addr = inet_addr("127.0.0.1");1 R8 k) F K O7 f4 p5 u) U0 f+ X- o
- 0 |) ^% g8 D# ~2 l) s: Z c7 r
- if (connect(sClient, (struct sockaddr *)&server,
) g9 r- F- M) Q5 A3 U1 P - sizeof(server)) == SOCKET_ERROR)
5 ]" l( K! R f3 s+ Z/ a - {0 X g7 o) D& i
- printf("connect() failed: %d\n", WSAGetLastError());
0 S( N4 ^" w& C5 z* x; K6 F - return 1;' v4 H1 r3 {" D- p6 |3 A5 L( h
- }; f9 Z1 V: t+ i1 j; u
- // Send and receive data
1 b$ R3 [8 [5 h - ret = send(sClient, szMessage, strlen(szMessage), 0);
+ o0 V7 X% i1 l: V$ H! i1 n) H3 C( k; h - if (ret == SOCKET_ERROR)! n' o' q$ s. l4 K& H# ~# e
- {
2 }1 \# q# N/ Y/ s: e2 y - printf("send() failed: %d\n", WSAGetLastError());6 }/ d& K0 \+ f7 s$ C
- }
% e5 r+ b p& F. q - else{
( b+ z+ _0 i: A. E/ k - printf("Send '%s' \n", szMessage);3 c1 O: r9 x+ ~2 K
- ret = recv(sClient, szBuffer, DEFAULT_BUFFER, 0);
; k: o! e2 x$ h3 Y8 a. P; m: d/ } - if (ret == SOCKET_ERROR){
; g E/ |3 _/ J" g% q7 |8 h- g8 f& Y - printf("recv() failed: %d\n", WSAGetLastError());
1 S; a! Z8 A$ K% F - }8 Q( Q& s0 `/ _" I& q" \
- else{
5 K o, |5 t6 W4 V, r - szBuffer[ret] = '\0';
3 k6 `; k; ~5 [& G ~/ |2 i - printf("RECV: '%s'\n",szBuffer);
7 d( @3 }+ d8 K - }% Z ^$ U" o+ ~8 B- g; \* L
- }
/ `: q3 w Q% q: L/ ]5 @ - closesocket(sClient);% g3 f/ f' ?6 o8 D1 L
- 8 |: S( J7 t* o# a& m
- WSACleanup();* m# o% g h* \, b6 u
- return 0;
1 M3 \: f" x6 w! K - }
复制代码 服务器程序:server.cpp# a0 Q a O! f3 m3 _- J3 f
- #include <winsock2.h>
) L5 C. S) d4 H/ N - #include <stdio.h>& o2 J, A& o% V2 f' A. W5 r
- #include <stdlib.h>/ Q. | P& o6 E& z
- ' W) X5 i5 ~; p L ?! H5 G
- #define DEFAULT_PORT 5150
- i8 X* ^! \0 }' Y* } - #define DEFAULT_BUFFER 40961 s9 L1 S8 \9 V
- 1 s7 T2 b$ q) X3 c. F5 o. D$ z
- int iPort = DEFAULT_PORT;8 j& L$ J) Y9 V) C* L+ o
- char szAddress[128];7 x2 x' ]8 I: Q) v
0 y# V$ J3 P. ]( I. r1 W- DWORD WINAPI ClientThread(LPVOID lpParam)
+ w- D, ^- Y, j1 h G2 P0 i7 u - {
* L+ t4 n3 Y* S1 R$ s: G" n3 H - SOCKET sock=(SOCKET)lpParam;$ I# N" o6 l$ K; J" U
- char szBuff[DEFAULT_BUFFER];
]9 P* E5 |5 I, U: G - int ret;0 z: Q% c- B4 S( F9 M6 k/ p
- : d8 f: q, P! f5 ~0 d
- while(1)
, C( a7 |& ~* N/ q5 R; O+ k - {$ Y: R/ q" D* o% X
- ret = recv(sock, szBuff, DEFAULT_BUFFER, 0);
' }! ]6 ]7 q- C8 z7 Z; F- i - if (ret == 0)
) `3 a1 i" g% B1 h4 I- A r - break;
- n" |9 j' g0 ~+ p - else if (ret == SOCKET_ERROR)) P2 p* s$ ?9 O' G( W1 x
- {
$ A4 B: `% J6 h% p/ \ - printf("recv() failed: %d\n", WSAGetLastError());$ s2 I) `9 x! n) i: G! p/ p
- break;3 C" o3 Q% i9 m- I3 N
- }
, f) |1 O! Q4 }" l: n - szBuff[ret] = '\0';* Q; r5 B$ n1 g8 O- b
- printf("RECV: '%s'\n", szBuff);* W( C- | B% y0 }7 j
- if(strcmp(szBuff,"abc")==0){
* q; X4 p: O9 _8 X ]" p, h - memcpy(szBuff,"Send the correct string!",25);9 V( U) }* A4 ]
- }' C4 y) F2 t4 n% X6 m# B$ j
- else{. S# f6 B$ s i& d
- memcpy(szBuff,"Send the wrong string!",23);
2 @+ r( t- L6 C1 C# { - }6 P+ E0 r* |: g4 R" F3 j6 S
- ret = send(sock, szBuff, strlen(szBuff), 0);: R6 v; C. [# G
- if (ret == SOCKET_ERROR){/ y9 Z+ n. L: X" e
- printf("send() failed: %d\n", WSAGetLastError());+ ?% r- [* c/ x2 ~4 m8 } A
- }* t7 @7 W. t; {, g& G
- }1 G) p! r' f! |0 W( j9 O
- return 0;: ]# x6 e* E0 A9 O6 {- r' L! M
- }) w; H! n$ D' z. t# P. L8 g( ?! P
- 8 X& A5 x, I( n+ H+ T
- int main()- r9 I9 w% b) w3 |& C
- {
4 E3 V j( g. A* R5 _2 x7 X$ L1 O0 r ` - WSADATA wsd;
( e' m& e5 _$ n* l+ i - SOCKET sListen,) A6 n" u, t! Y6 {! ^9 } N
- sClient;
' Y. z8 t7 f1 F0 p; Z6 U) o* ?7 H! n - int iAddrSize;9 G! w/ T ]- O2 N+ P1 h' ~" l
- HANDLE hThread;, N; W3 `+ O$ k
- DWORD dwThreadId;1 l8 _* F/ ^3 Z: x
- struct sockaddr_in local,6 b4 t& W9 T, f5 z) q$ R/ h
- client; D2 V9 M8 X( b n+ C' {2 V* }- J# m
4 j* n0 x' @ a" k- if (WSAStartup(MAKEWORD(2,2), &wsd) != 0)
( L% Q" {% S; P" N- ^. }# `9 D; z - {
. r( l8 J/ ~# l - printf("Failed to load Winsock!\n");# w8 d5 R$ e! ? S/ ~7 t
- return 1;; i& w8 @: l% Y! D
- }& X; C4 t1 w2 v+ w0 z8 ?# N
- // Create our listening socket
/ w! p! R( G, Q9 W0 ]) g9 T - sListen = socket(AF_INET, SOCK_STREAM, IPPROTO_IP);
0 u1 ^3 \/ K2 s6 g! L% [ - if (sListen == SOCKET_ERROR)
! q- s* J# I' h9 g: P - {
, y3 ^0 m3 I. c! |8 ?# l2 C: } - printf("socket() failed: %d\n", WSAGetLastError());+ k! \2 x/ I- ]( X- I
- return 1;2 \7 C# e; G) y2 R5 C H
- }
% s3 H: W3 g n) u* f+ a* Y - local.sin_addr.s_addr = htonl(INADDR_ANY);- N7 v: ?" z8 ~( Z5 J3 b
- local.sin_family = AF_INET;
' |, U! {( N+ h. U$ z' [. r - local.sin_port = htons(iPort);
$ b8 B5 p5 l4 g6 Y5 Q - / f/ k( _# N5 E+ I9 @6 p9 i; s& n
- if (bind(sListen, (struct sockaddr *)&local, s8 c- H6 ]& q( ?5 {6 A2 t
- sizeof(local)) == SOCKET_ERROR)* N2 p* V- c, c! e. m7 h. d: s7 c7 q
- {
. @5 B4 E2 t( G5 P2 u - printf("bind() failed: %d\n", WSAGetLastError());: d( [3 v9 I4 c, F6 i2 e
- return 1;- y" w. o! h7 \' D8 p% I5 }( c
- }6 z' ~3 D/ @! _" a
- listen(sListen, 8);/ K5 w7 i! x3 w' H3 Z0 Y- g9 Y
- // In a continous loop, wait for incoming clients. Once one
$ ~/ [) n7 e# k1 I0 _ - // is detected, create a thread and pass the handle off to it.! U: ~2 w& ]' _
- while (1)% l8 P+ T) `/ O5 Y7 V
- {+ c2 i/ d6 W! B$ t2 P) l
- iAddrSize = sizeof(client);& C( @% ^0 R( C9 i1 T9 z3 {
- sClient = accept(sListen, (struct sockaddr *)&client,% I# ]+ v# |5 G) S g4 F9 J2 _: T
- &iAddrSize);
4 G! P2 w9 t+ b - if (sClient == INVALID_SOCKET)
2 Q- _* L% Z$ m7 k# G* r1 Z4 _ - {
+ }5 o% O; F& T; ^ - printf("accept() failed: %d\n", WSAGetLastError());
2 U8 Z5 a8 [0 N4 |0 N! {$ ]( B - break;& N0 A9 e) a! z# g. D, D* X
- }0 |0 g+ [* }6 b- o7 P& c7 ^/ ?5 n: @
- printf("Accepted client: %s:%d\n",3 r* z o5 ^$ Z8 u( O4 N) v3 j
- inet_ntoa(client.sin_addr), ntohs(client.sin_port));
, b+ j0 Z5 L7 l3 I0 L3 o8 f4 x# f
6 ?; P! m+ o0 Z: ^. C- hThread = CreateThread(NULL, 0, ClientThread,# L+ @' v. L/ a6 `# u: |
- (LPVOID)sClient, 0, &dwThreadId);6 M, x5 j1 a- J5 A, i5 x
- if (hThread == NULL)9 w( x4 v+ R6 O/ M1 {, Y2 C
- {2 `5 N% Y7 n m* O8 h
- printf("CreateThread() failed: %d\n", GetLastError());
1 h0 u5 N! n3 b& V, U - break;
4 z- n% |0 ^. I% l - }
. h; b4 ^( J2 v' X a - CloseHandle(hThread);
m- X0 g$ Z+ j8 _4 z8 U - }, Q; t; v/ p2 L' d
- closesocket(sListen);3 |# O5 h% @ l+ B
-
0 F o- p' v2 `6 _1 N. s& u - WSACleanup();
( ^. x' b/ d0 A( W - return 0;5 O, S- ]/ h9 ~+ k# `3 ?6 _5 e5 c
- }
复制代码 9 F- g m/ a+ I4 X) k0 O7 X' d. o
' d7 t. f6 v- R! B
( ^8 _) z# Z v9 m" t
0 E. ?4 s0 X8 {4 O7 ]8 ~* Q, T; x' {, q% D) `
|
|