管理员
   
论坛积分
分
威望 点
贡献值 个
金币 枚
|
程序很简单,windows环境下的,客户端和服务器程序都在本机运行,在客户端输入发送给服务器的字符串,服务器收到字符串后会打印出来,同时与"abc"比较,与"abc"相同就会返给客户端,输入的是正确的,不同会告诉客户端输入时错误的。
3 J/ Y1 s2 u* y/ d( ]8 b客户端程序:client.cpp
4 |+ O, B) J+ l' S% @- b- #include <winsock2.h>/ b, [4 W2 f# Q# I6 V. f
- #include <stdio.h>7 \, P Z+ u, {# S" V
- #include <stdlib.h>/ P9 s- d& Z$ i& v9 R8 X
- % q4 v0 g) \6 Q8 y% K
- #define DEFAULT_PORT 5150( u: }. j$ |6 d& `
- #define DEFAULT_BUFFER 2048, p% w8 W( b( r* y
+ T' ^$ _2 t W- char szServer[128],7 @0 ]8 b( b9 T) `4 I- T
- szMessage[1024];$ {1 k# c9 e, L5 M3 d
- int iPort = DEFAULT_PORT;
# u/ `- X$ |: b% f h
' n# k1 b" K2 Z- int main()# Z2 c9 Z* y6 r2 m8 A& A6 t
- {
4 _0 W ]$ g/ H" n7 \+ {/ x - WSADATA wsd;" M8 z& f# n" X2 y& C) C# K, T
- SOCKET sClient;, m; A* K/ y# J6 w- A5 r" h; C
- char szBuffer[DEFAULT_BUFFER];
( ?$ o5 \: V' I% C' |9 K" R4 q+ W - int ret;& y0 |1 s; k; ]) ^% T9 ]: \) W
- struct sockaddr_in server;
( ?, Z$ ]: w9 q1 P( B3 g1 r - struct hostent *host = NULL;! v2 I3 E# W) U2 ~9 o5 |6 t
- if (WSAStartup(MAKEWORD(2,2), &wsd) != 0)
* h+ }6 ]0 H; r* N- f3 P* G - {4 w3 [3 U* z4 b1 G c8 ]
- printf("Failed to load Winsock library!\n");) z& u' p5 t2 R: D8 a5 g
- return 1;0 S' w: c& ?1 h. o- k* Q, N. E
- } I3 Q6 u! |: X6 \2 V |
- printf("Enter a string to send to server:\n");
2 Z; _4 _' x* B5 a - gets(szMessage);
4 Y5 F5 a8 c6 S+ C' n7 l, { - // Create the socket, and attempt to connect to the server, e G& U9 K S* y8 X3 `
- sClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);8 E- |6 _& V* I7 a; }
- if (sClient == INVALID_SOCKET) i8 Y/ N9 E, b K9 O+ y
- {' @9 p% }' g8 g
- printf("socket() failed: %d\n", WSAGetLastError());
{- P/ Y6 @7 X6 u6 s' j' I - return 1;
1 @! w% w0 s4 ` - }
8 ]* A' g% J2 d( V1 S - server.sin_family = AF_INET;
& j, @4 P# Q/ r' B' I - server.sin_port = htons(iPort);1 Z m" I6 |9 E8 R: F. J
- server.sin_addr.s_addr = inet_addr("127.0.0.1");7 R/ g. f+ D% P
9 f/ g5 X0 a5 p7 l6 z. @- if (connect(sClient, (struct sockaddr *)&server,0 F4 P# d6 G' C0 N% i2 t% I
- sizeof(server)) == SOCKET_ERROR)
& V0 X4 z/ ]1 s, i* N - {
, ^0 g# A) m! B' { - printf("connect() failed: %d\n", WSAGetLastError());- T; F; M9 i2 q o) g7 a
- return 1;. v7 I, j* h3 N. f; T
- }
' G/ m3 p) U$ g! C' A - // Send and receive data! Q. M+ b" u5 X; f
- ret = send(sClient, szMessage, strlen(szMessage), 0);
% N L& {, V# y! i - if (ret == SOCKET_ERROR)
+ v. s6 t# w+ Z4 X- a - {
) e- L f! G) c - printf("send() failed: %d\n", WSAGetLastError());# H4 H) j5 V2 X3 F" z
- }9 ] d g7 k" {
- else{9 S, m' ^" \7 [- T0 }4 ^
- printf("Send '%s' \n", szMessage);: q m9 d7 C- w% b# F
- ret = recv(sClient, szBuffer, DEFAULT_BUFFER, 0);
1 U E( ^" P* H, D) X - if (ret == SOCKET_ERROR){* N/ |0 I4 I7 s' n" W& z O5 ?& ?
- printf("recv() failed: %d\n", WSAGetLastError());( W$ d+ M: s# o9 W4 H
- }; |; a6 C1 H x. b
- else{0 o9 h* `) C9 t# u% G5 j4 v- N
- szBuffer[ret] = '\0';8 Z U# Q6 I( @9 ]4 P3 ? Y
- printf("RECV: '%s'\n",szBuffer);' B# `1 T0 b6 m0 T# R5 ~ \5 ?
- }. z! x- K" N5 H6 A) z
- }
. y* v G, `8 x- u# G% } - closesocket(sClient);
1 h. j* `5 O3 j& Q" G0 ?
9 G+ h$ e2 s" v0 Z/ W, [, t/ K- WSACleanup();
$ P# ]2 v! M" m; \ - return 0;
7 C$ R: F+ U% [0 }) A - }
复制代码 服务器程序:server.cpp" T+ y9 @# N4 z! b( Z! H
- #include <winsock2.h>
# J6 e- o2 z. m: w# [2 o - #include <stdio.h>
2 o I- M+ c* f$ G- C - #include <stdlib.h>
1 U% I9 P6 d/ n Y
( A( \1 ]) ^" e' n- #define DEFAULT_PORT 5150
$ r; |7 x& Q4 p3 G0 W8 L! X - #define DEFAULT_BUFFER 4096
" S2 `( n! q# h! G0 w6 ` - ! u( R0 r! X) h4 z& ^ w2 x
- int iPort = DEFAULT_PORT;, s! c! x' X% ?+ {! r4 X* F
- char szAddress[128];1 m8 @- g! l3 m. C5 |7 y3 f0 @$ T
; w; e! b) q4 C0 B8 e C3 t- DWORD WINAPI ClientThread(LPVOID lpParam)- u) d+ k3 x8 ?5 v, b% ]* U2 s
- {" A. s8 ~$ B2 x4 B6 c( s
- SOCKET sock=(SOCKET)lpParam;
& F: z p$ L3 }+ j; D0 f - char szBuff[DEFAULT_BUFFER];
, R4 K; _' @3 ?3 D0 z$ Z - int ret;
2 e% Q9 x, j" f8 D; k
$ S/ v3 a4 y* m7 v& s9 z- while(1)7 F9 J# w4 Q' y; I$ }7 c
- {
9 P5 h) T" ~: m6 e" c& N# U R - ret = recv(sock, szBuff, DEFAULT_BUFFER, 0);: E/ F) k6 M" U5 ]+ y. E3 x
- if (ret == 0)
9 f# ]# Y; q* Y7 W I8 M J( O" y* ` - break;9 R. t" V5 A) V/ Q6 V9 T. f
- else if (ret == SOCKET_ERROR)
- s' _8 J0 p' P9 i/ N0 [; {; X& F - {- Y* s+ A' G ?* O" H* w
- printf("recv() failed: %d\n", WSAGetLastError());
3 `6 V9 ?3 X! r7 c4 l8 R8 B - break;0 U8 N; M: l9 x& a& O- W, S I
- }
$ x, |% s8 P+ [9 | - szBuff[ret] = '\0';
) g0 w' a% O) t. a+ _ - printf("RECV: '%s'\n", szBuff);
9 E" L0 i2 A5 S B6 l6 ?% n - if(strcmp(szBuff,"abc")==0){
0 ?$ {6 a1 \% a1 P/ I! ^* f - memcpy(szBuff,"Send the correct string!",25);: \; O% R5 L. f0 b6 m% |
- }
$ K2 K5 }" }- Q+ c& c5 e V - else{
8 b' A, N" x7 [ - memcpy(szBuff,"Send the wrong string!",23);
4 D6 m0 t0 u$ t6 [: A! s# A - }
, {1 Z6 d" u5 J6 R& ? - ret = send(sock, szBuff, strlen(szBuff), 0);% \, z- [: S( h& Z
- if (ret == SOCKET_ERROR){
- J; I' i" @! s1 f+ d& d8 h - printf("send() failed: %d\n", WSAGetLastError());6 V9 f" L6 `0 o9 W5 G
- }& G* y* w7 Q# A3 B l1 D4 ]
- }& i' E/ I" l. K) q" G8 C8 L" q, D
- return 0;
8 U6 S. f) i/ g& J/ j1 G, a( A - }
7 A7 u8 U% ]+ p) r# F; w3 ~" e - ' \( H- A' n0 i9 O7 b
- int main()9 l& ^! }9 f; N+ B
- {5 U) S, B9 T: v
- WSADATA wsd;
$ f `: k" [" y) _ - SOCKET sListen,/ p- q: K1 P, \( h
- sClient;- d- Q: ~4 m0 u2 P0 Q/ I
- int iAddrSize;
1 ]: E8 R6 q6 G* U0 B/ ^( p: } - HANDLE hThread;
2 [( a- H" \. h% Z2 W) s; A - DWORD dwThreadId;% c' k; ~. \1 `! v0 Z
- struct sockaddr_in local,* k' T$ V) W$ g( ]' q
- client;
' a A/ f/ H( {6 L7 p - 2 z% @+ T" D! Z9 p3 L- e5 F
- if (WSAStartup(MAKEWORD(2,2), &wsd) != 0)# ]7 Y9 N$ V- H4 M6 l, p0 l, I
- {) p9 `# l6 s3 H
- printf("Failed to load Winsock!\n");
8 J$ t3 s: U1 d& l* `9 x6 A5 O - return 1;
* { J% q7 d/ k - }
4 l# b9 _ C- w2 P4 O7 Z9 s - // Create our listening socket# v8 y1 R9 P0 S# M* ?, v" C
- sListen = socket(AF_INET, SOCK_STREAM, IPPROTO_IP);
) |8 n/ B" }5 a: ~ - if (sListen == SOCKET_ERROR)* h0 S+ L, _6 D; j8 x( ~& t5 P' h" N( t
- {. s1 {7 f, E$ x* r) s$ z W
- printf("socket() failed: %d\n", WSAGetLastError());
& Q- s; b4 w, d# r5 D$ X - return 1;1 b" H& y( B. y) `4 m' i
- }
+ P9 p' u6 B" d' ? - local.sin_addr.s_addr = htonl(INADDR_ANY);
; |9 o. @ |3 Y) u( { - local.sin_family = AF_INET;
& E+ L! A+ a% U' j# H1 M; v - local.sin_port = htons(iPort);
& q& g @. X6 H: _' f
: Y% a" u" o7 i5 V: H2 S5 w- if (bind(sListen, (struct sockaddr *)&local,
, Q9 ~' s/ v2 W2 c% Y - sizeof(local)) == SOCKET_ERROR)2 v" x: a! M4 t% f& _
- {
' _3 |& v5 o# { - printf("bind() failed: %d\n", WSAGetLastError());6 m: G+ y) a4 u
- return 1;
% O8 F* J9 |% j* ^: j' |, l - }
; O5 K$ D8 W, v+ v - listen(sListen, 8);
3 E7 d1 ~2 B, O$ a6 m& A6 o - // In a continous loop, wait for incoming clients. Once one
8 _: ^3 f4 h+ w, A, f - // is detected, create a thread and pass the handle off to it. a! |6 \- @* g
- while (1)
& W# P# W5 j+ h2 n - {2 [/ W# D: i, L3 Y$ x- I( c% \
- iAddrSize = sizeof(client);
8 I" @& ^6 B. c: m - sClient = accept(sListen, (struct sockaddr *)&client,/ A! H/ p9 h9 D8 P1 E, P
- &iAddrSize);
u$ Y' T) A3 P - if (sClient == INVALID_SOCKET). i2 z. S) b$ Y
- {
4 L1 A1 v6 K8 u+ N% O - printf("accept() failed: %d\n", WSAGetLastError());
* {+ ]2 u! K" I( a8 J4 U# o - break;1 u( b5 d5 c# M# w9 X4 k+ P. ~
- }& s" ?: w& }- p: T5 y
- printf("Accepted client: %s:%d\n",2 U, r3 L: E& ~
- inet_ntoa(client.sin_addr), ntohs(client.sin_port));
. b' Y# F5 ~, T! E' |* f - / d k% C ^' H8 j& S* ^
- hThread = CreateThread(NULL, 0, ClientThread,
, i: ]$ Q8 K N6 n - (LPVOID)sClient, 0, &dwThreadId);
; U4 i% T& P1 C1 m - if (hThread == NULL)
6 z- ~' s0 W0 |9 O/ \) F - {
- b8 x1 J3 x* L2 X1 M& [ - printf("CreateThread() failed: %d\n", GetLastError());
2 a, J! t* v) @7 T; _4 t0 O - break;3 Z4 k" q3 @4 b" M+ m
- }( w( H" H' H2 Z6 P
- CloseHandle(hThread);
' }- S# w( Y' R2 K - }4 \3 Z% c+ j6 V
- closesocket(sListen);
/ v/ I( M3 u* { - ( x# S8 h; ` h5 O
- WSACleanup();* N& G2 b" n" Z( ?2 o5 t- R
- return 0;$ h9 N9 \! m# p8 T/ T' Y
- }
复制代码 1 f( [6 e0 \" i3 b# |2 l
1 B8 m z6 L F' F) s8 g+ ]
4 u3 _' _/ {' y, g
6 h* r8 |4 S! _3 }/ E$ M4 y9 A
+ N0 l6 r1 g9 t2 m# F% \ |
|