管理员
   
论坛积分
分
威望 点
贡献值 个
金币 枚
|
程序很简单,windows环境下的,客户端和服务器程序都在本机运行,在客户端输入发送给服务器的字符串,服务器收到字符串后会打印出来,同时与"abc"比较,与"abc"相同就会返给客户端,输入的是正确的,不同会告诉客户端输入时错误的。/ Z, L% O+ M: o7 D p
客户端程序:client.cpp
$ @7 q/ P/ Z2 e4 c! D+ k. Z- #include <winsock2.h>& Y$ R4 M7 w4 k% w, {
- #include <stdio.h>
8 F2 F; N3 l7 f0 \; b* O9 i - #include <stdlib.h>
, V# [- \8 D [$ C- k - ) A* w& _ R7 X- f0 A
- #define DEFAULT_PORT 5150
) I6 b: Z; S) T7 w3 E0 w - #define DEFAULT_BUFFER 2048: G* z6 }* _! }/ z7 c, K, F" o
- i K. i: q+ w K
- char szServer[128],9 n& w; V% w4 z
- szMessage[1024];$ T1 a, B1 A" L- V% }
- int iPort = DEFAULT_PORT;
U3 r5 o# S3 F5 s( y/ E
9 U8 o, W# ]; E9 A( k4 H) w% Q- int main()
+ [& h# n3 Y8 }6 H - {
* A% Y- G: U( ~, p" Q5 Z+ a# q - WSADATA wsd;
( b. J2 M# a2 _2 j& @ - SOCKET sClient;, J8 v6 g/ J! J' w6 X4 j
- char szBuffer[DEFAULT_BUFFER];% P! G/ b y) e" V
- int ret;& S& i" t s+ Z$ L
- struct sockaddr_in server;
( t4 o# y- K( k3 J - struct hostent *host = NULL;, J& w4 u' j$ |6 Q' e. G5 n" f
- if (WSAStartup(MAKEWORD(2,2), &wsd) != 0)
3 z0 z9 d4 f( U - {. B3 A. `* e; \
- printf("Failed to load Winsock library!\n");
: S- E& ]; _# t6 h& W! U - return 1;, q" S/ R8 b0 g' ?9 k
- }) K9 t3 j9 y7 b) c
- printf("Enter a string to send to server:\n");' x9 Y4 s4 a2 x& @- e D5 j
- gets(szMessage);# f& p, S6 D9 ~ \2 o. X
- // Create the socket, and attempt to connect to the server G( \" v. x7 I$ @1 H# c7 E
- sClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);3 N* R5 O6 Z6 w) P& F, Z
- if (sClient == INVALID_SOCKET)
% t* L4 [; f1 U - {
9 @) F7 u! q5 p - printf("socket() failed: %d\n", WSAGetLastError());6 Z7 i2 H* ]# A% y) W' d' g# f1 @
- return 1;2 K& Q# k1 f, N% j2 j
- }% @% O, z4 d! o8 O f# i
- server.sin_family = AF_INET;5 x9 v; ]( V" N) J/ |
- server.sin_port = htons(iPort);
6 p+ b8 A7 [" W3 ^3 X) H/ r - server.sin_addr.s_addr = inet_addr("127.0.0.1");1 K* M w0 F& ^
- f. |3 b* w0 a5 _/ ] @9 T- if (connect(sClient, (struct sockaddr *)&server,
0 c4 x$ [+ L# A. p+ g& Z - sizeof(server)) == SOCKET_ERROR)
6 x+ A k6 l G5 y0 ^" k - {
! p/ v L8 _+ D4 q$ j - printf("connect() failed: %d\n", WSAGetLastError());
6 @+ {0 @, ~ Q) q - return 1;, N( U; k; q) Z* g7 l) k7 _2 S
- }
5 }3 h3 M/ i% Y6 _ - // Send and receive data
- x& V. [) e& g+ x - ret = send(sClient, szMessage, strlen(szMessage), 0);
; {) F. ?; L1 t: W1 Y7 o/ W - if (ret == SOCKET_ERROR)9 I7 ]4 t( n6 b7 U% ?! y
- {7 b: }/ D1 W! E! \* Q0 D2 s
- printf("send() failed: %d\n", WSAGetLastError());$ m5 V3 Y# b3 Q9 E6 ~; X4 y9 c
- }
* y% X/ \, c- V9 k' O* S8 V! x - else{
. s6 g, J; Q. q% C/ k - printf("Send '%s' \n", szMessage);
! Q8 Y) M% N, l( P8 i$ a% j1 w - ret = recv(sClient, szBuffer, DEFAULT_BUFFER, 0);
" U4 ~' G6 _$ D% d+ |# \, W9 U - if (ret == SOCKET_ERROR){ Z* W6 m5 y3 T; v5 v; P* J
- printf("recv() failed: %d\n", WSAGetLastError());
8 a' j) I; N4 n2 r% f" M5 g6 w' N - }; M" A1 B* \2 W/ W" |
- else{
2 O$ U% }. b6 z d$ H1 @3 q# V- \ - szBuffer[ret] = '\0';
; R% D9 T% a. n4 _$ v% V) o - printf("RECV: '%s'\n",szBuffer);
! P5 J7 { j+ U6 Q* C$ O - }
! g$ u% \! l* }2 ]; q7 p/ q - }
; E) Y& U8 ]& _& q H - closesocket(sClient);* f# f, c9 g7 J" _# r
- + E9 u4 M2 ?) Q) C, y
- WSACleanup();
+ J' G$ V1 b3 i - return 0;$ T* [/ P) z3 F& S' h
- }
复制代码 服务器程序:server.cpp: \! E! H" X- B, A' Q
- #include <winsock2.h>6 o+ Q0 n" I* F" Z2 [
- #include <stdio.h>
4 g A7 ]8 s5 N# ^ - #include <stdlib.h>
( }% o& P- \# k" a" e - + V; R& D) f1 U+ I6 S! S
- #define DEFAULT_PORT 5150
5 Y' l5 S* Z* R- m' Z6 X - #define DEFAULT_BUFFER 4096
. h; M, F* K* ~8 |, P - 5 ]6 e' l" s' _( l
- int iPort = DEFAULT_PORT;% x3 A! v/ B; g4 U7 \, g: X
- char szAddress[128];, }/ `' g0 G, f7 a1 R2 E9 _
* G$ L- A, i$ V# C- DWORD WINAPI ClientThread(LPVOID lpParam)# p' l' p' T; \- I& ^' P
- {2 f0 i' D) v8 D3 s" ~& W
- SOCKET sock=(SOCKET)lpParam;
2 }3 n: C0 v) @( }7 c/ p1 G6 ~ - char szBuff[DEFAULT_BUFFER];
7 F! u2 Z2 d5 W/ `4 M, L' Z: F - int ret;
+ M- A b- k$ h. S - $ S4 H T* B' G# f( z4 f
- while(1)- C4 b4 m1 n) O
- {
S0 g4 H# V; I; x( l l& q - ret = recv(sock, szBuff, DEFAULT_BUFFER, 0);
9 S# P; h4 d( \6 t; ~; k, K - if (ret == 0); E5 O) L5 [2 V4 j1 Z0 i3 m
- break;# Z" X! X7 a$ e4 @* L
- else if (ret == SOCKET_ERROR)
8 Q4 a% u% b3 Z, N* E5 y - {9 C% T) ~/ u- L
- printf("recv() failed: %d\n", WSAGetLastError());
9 z& z8 p* b# Z% y- R6 P - break;5 S: K: V0 a0 S- L
- }
E& K( C* G) B; y5 t) ^: \ - szBuff[ret] = '\0';1 X% }4 G, n' f, S( R3 y1 n: a7 A
- printf("RECV: '%s'\n", szBuff);
( G: S& y5 `- l, ?6 Y - if(strcmp(szBuff,"abc")==0){6 h: z: {0 j" c" M% O' X1 z1 e; l: Y
- memcpy(szBuff,"Send the correct string!",25);% W8 T) G9 P2 n$ M: n
- }$ ~, o2 a# \/ I8 E5 f
- else{
9 g. M& m/ J' G5 A) w2 k - memcpy(szBuff,"Send the wrong string!",23);
" q5 y) w, y( t9 L; X/ R - }2 t+ y J; r+ A7 A) |# z
- ret = send(sock, szBuff, strlen(szBuff), 0);# O8 E$ r m w4 H" }- c
- if (ret == SOCKET_ERROR){6 O' F5 c& H# K) c
- printf("send() failed: %d\n", WSAGetLastError());$ E1 c4 Q7 `' ~- a. c( j5 E
- }
# o( R J/ d" m+ J4 |0 Z+ x - }
6 e) {5 M3 q; r8 m9 Q. a! A; @% u/ L - return 0;0 a5 A8 Z' I4 }9 Q, C
- }9 w* z7 G" o1 B! J8 q7 o, K
- * V" o% r4 T9 o- g' W! {
- int main()
7 F/ t! E. m& I. J; B - {
! p! N1 z9 I6 t: [2 d9 v0 s - WSADATA wsd;0 R- p+ Y0 X j1 ^/ I( }
- SOCKET sListen,) h& X) h) D& H4 s; M
- sClient;
, V: Y/ {. l1 H2 R. W2 H) A7 X - int iAddrSize;4 a4 Z& _' e: A" w0 r- D3 _
- HANDLE hThread;8 S A( E2 p8 }- {& T+ ~/ z$ D
- DWORD dwThreadId;/ q% f: |2 W; I$ l, Q
- struct sockaddr_in local,
# j/ W( O& T$ P8 d7 F$ S9 A - client;
% D7 O. M& U) Z3 w+ K7 f6 E
, K# C9 \" E0 X" h$ [+ ]- if (WSAStartup(MAKEWORD(2,2), &wsd) != 0)
! M2 F2 j4 o8 L& r - {! k( j/ A7 Y# |! X
- printf("Failed to load Winsock!\n");
) z. F( V* `2 k, t; X - return 1;
/ l ]7 R0 L4 X6 y" P0 X- m - }
/ r! J0 f' G( p - // Create our listening socket* H# G. u K( e/ D1 L/ R/ X
- sListen = socket(AF_INET, SOCK_STREAM, IPPROTO_IP);
1 }: a3 d# {$ N& \: E4 w - if (sListen == SOCKET_ERROR)
! T7 u. ]2 O4 F- K( S& g2 O - {
: T4 F" q# p- {& r - printf("socket() failed: %d\n", WSAGetLastError());
: d( |; { K' B! _: Y - return 1;6 L* |7 I M0 {3 g6 w% x! k T T! }
- }+ v. L; U8 V- J0 s% k) q
- local.sin_addr.s_addr = htonl(INADDR_ANY);" H* G* d. I4 F
- local.sin_family = AF_INET;% m$ {/ y6 S9 N* A0 }, ?- N
- local.sin_port = htons(iPort);" G6 B8 y$ B& h! B9 G1 O2 M
- ) |8 D6 D6 A6 z. E0 N
- if (bind(sListen, (struct sockaddr *)&local,
" C3 E4 w& D: E: v' h - sizeof(local)) == SOCKET_ERROR)# M1 T& f6 S: ~+ Z
- {* F" \5 G# A* O* L5 d
- printf("bind() failed: %d\n", WSAGetLastError());& T0 _. u+ g; m' K' g
- return 1;
4 |/ @" u9 o; ?/ p, s - }
! G z. o" p% `! N+ \% X, ` - listen(sListen, 8);+ a, O" Y# Q2 ]0 l! C
- // In a continous loop, wait for incoming clients. Once one6 G9 a0 L# {- J' h
- // is detected, create a thread and pass the handle off to it.# V+ i1 {! M" H, u
- while (1)
, _; \ C8 w6 ~3 o' v! x4 ] - {$ n$ p8 d! d6 q0 r/ b- n
- iAddrSize = sizeof(client);
1 l, [; S8 h$ A* y3 } ~# o4 {( G - sClient = accept(sListen, (struct sockaddr *)&client,
4 m/ X8 ~! ]% v$ f/ F# s - &iAddrSize); " ]; d& U. C. {1 {$ v" X0 d# r* l) m: N
- if (sClient == INVALID_SOCKET)
; H) M9 Z) l+ A# Z - {
9 m( F3 t9 Z; E( D! j8 _5 G! | - printf("accept() failed: %d\n", WSAGetLastError());3 v. Q: V# i5 ? n7 D% q D
- break;
$ J$ |2 ]& \7 W& t - }
0 }* J" |9 H( X$ b8 e - printf("Accepted client: %s:%d\n",/ Q( t$ X9 `( m o5 N4 Z9 T
- inet_ntoa(client.sin_addr), ntohs(client.sin_port));/ `% Z# P" F ]! Q
( i1 l" e+ ?' _$ o, W- hThread = CreateThread(NULL, 0, ClientThread,! V; c8 J) u/ k; l; R, L+ g
- (LPVOID)sClient, 0, &dwThreadId);. ]" [& k% F+ p6 s8 R2 H4 w: M
- if (hThread == NULL)* ^+ C2 x; n* m: i
- {* D7 n* T" v! p: Q0 c) t# r
- printf("CreateThread() failed: %d\n", GetLastError());! L+ s v% m* y ]. f, u
- break;
- o2 K" j+ o# H; w) r/ n - }
% ^/ m' V I& C$ f - CloseHandle(hThread);5 r; a4 ~% i) k) a$ G
- }* w" _) L. }6 l3 U5 E+ Q" k
- closesocket(sListen);
$ L6 D6 C3 ]$ d -
. A, E* J$ o4 z* `# a - WSACleanup();5 a0 L2 m9 K( G1 m, k
- return 0;
; N f; S6 \& |9 ~3 r! a - }
复制代码 8 G8 p8 E3 t0 {% w5 X4 J
, H7 q& g" N/ u. r
3 L8 O) f# f( F6 e4 _7 E/ p) }1 c3 k) [+ B
3 B" |. P1 Q/ g- P |
|