程序很简单,windows环境下的,客户端和服务器程序都在本机运行,在客户端输入发送给服务器的字符串,服务器收到字符串后会打印出来,同时与"abc"比较,与"abc"相同就会返给客户端,输入的是正确的,不同会告诉客户端输入时错误的。
# ^/ [7 ~9 U% t4 l+ V, m) {1 v客户端程序:client.cpp
6 M, Y. g4 d% I" x+ a/ A- #include <winsock2.h>
) c4 J( v0 r2 d" o - #include <stdio.h>$ v. d5 w. `' Z0 i+ h8 Z1 y
- #include <stdlib.h>
$ @) J g* k& R1 @0 |' d
& @* T+ P i0 T- #define DEFAULT_PORT 51502 \' L: H' m2 {; s" x
- #define DEFAULT_BUFFER 2048
( V3 i2 C' D8 j# P0 D/ Y$ g
, Q: D* B$ r. _, c2 Y: ?- char szServer[128],, @/ ]* }& {- C) ?$ m6 s
- szMessage[1024];& [' M4 h* H: x3 L5 u
- int iPort = DEFAULT_PORT;* p- d ?/ o5 U" ^
8 r+ ~8 }6 ^1 J% p5 E- int main()
) k, H# N& q3 w/ N# s. R - {& `2 ?% l$ I! z9 f
- WSADATA wsd;) X6 J$ h4 G7 j0 {& n# l. f
- SOCKET sClient; s( m: v ^6 d' T k; e' F) N& s
- char szBuffer[DEFAULT_BUFFER];( D1 U2 x3 H( u/ K
- int ret;
1 k- T3 ]! G6 o- _8 U - struct sockaddr_in server;6 b! I8 W' c; E
- struct hostent *host = NULL;3 ]0 N0 T( y5 ] p
- if (WSAStartup(MAKEWORD(2,2), &wsd) != 0)
+ E* o% f9 {2 |+ C. n - {
) h+ j8 B# _, z2 M+ x - printf("Failed to load Winsock library!\n");2 R% y& Q* [$ j
- return 1;
" W" T7 W: }! l2 I - }* P5 Z+ w2 b" p
- printf("Enter a string to send to server:\n");
/ y5 M/ A0 I0 }. ?7 X - gets(szMessage);( D( T3 r3 m' k; X$ B1 Q+ p, z7 `
- // Create the socket, and attempt to connect to the server! s# e( t; q6 h! Q/ E- p
- sClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
. R: [# e" [2 [1 T" X - if (sClient == INVALID_SOCKET)
+ O. x: J0 B0 p9 C. A - {
) z' P7 ~0 v" ? - printf("socket() failed: %d\n", WSAGetLastError());2 R, p! n6 R! w
- return 1;3 s6 k7 Y2 u" e! I. b6 _
- }4 S9 e, F, A5 B0 J8 l
- server.sin_family = AF_INET;
% `6 z1 p5 ?) J/ [% b - server.sin_port = htons(iPort);9 i: E" H4 A- c9 w
- server.sin_addr.s_addr = inet_addr("127.0.0.1");
) `& M6 C# a9 f9 g/ Z
3 J! Z/ z9 w( p1 Q- if (connect(sClient, (struct sockaddr *)&server,' L3 G0 l! Y/ Y0 u/ S% H+ c/ I
- sizeof(server)) == SOCKET_ERROR): M' {1 k4 v" l
- {* O& K: B% j3 d
- printf("connect() failed: %d\n", WSAGetLastError());) j, P# a0 D! o5 K
- return 1;. w' N: B u0 o7 G
- }
& t( Q. c. H' m - // Send and receive data6 |( ~7 ?- `& I3 S" h
- ret = send(sClient, szMessage, strlen(szMessage), 0);
3 Z; A% T& E6 X; }- `" d - if (ret == SOCKET_ERROR)
. y# u' e6 f$ Q J; t4 |& O2 e - {
) ]1 K8 S; N7 Z+ S$ z8 I' e - printf("send() failed: %d\n", WSAGetLastError());4 s) r1 W: v1 d+ O8 d
- }
) u2 G4 E) B/ Q+ E - else{
+ P% G- ^7 g2 c0 o, h# ^ - printf("Send '%s' \n", szMessage);; a8 W: X/ g2 X; V+ z# I3 e* f' n7 L
- ret = recv(sClient, szBuffer, DEFAULT_BUFFER, 0);9 M$ K7 G0 V q
- if (ret == SOCKET_ERROR){
F" s' ]9 ]/ t4 F; K - printf("recv() failed: %d\n", WSAGetLastError());
7 _* \% T# J( l - }& Q0 z0 N! I" C( X; ]0 S
- else{0 U. j) w9 X& `
- szBuffer[ret] = '\0';
& A* c! X3 r* Z0 @6 D/ j e - printf("RECV: '%s'\n",szBuffer);( D: ~8 v$ P" d2 k$ {
- }4 Y) W9 M0 l/ I
- }) _1 p0 s3 `& }$ M1 l# c; w8 b
- closesocket(sClient);5 d% v; T3 S' V( s
$ J0 J+ Z: M1 f4 |5 s- WSACleanup();7 b- j3 {6 B6 g
- return 0;* E% S9 g* U3 _/ I& O5 H# O8 ?7 x- Y
- }
复制代码 服务器程序:server.cpp+ q- x# q% b* X
- #include <winsock2.h>
( u3 z- D7 }* O7 i6 q - #include <stdio.h>5 f3 A, n7 j' n: t- v$ Z
- #include <stdlib.h>, G/ s# x$ k+ O/ f
- ) [2 u; C, w& M& G9 n. q
- #define DEFAULT_PORT 5150
2 c( B$ @ H) b( e, k; r - #define DEFAULT_BUFFER 4096
+ N ]& R" [+ {) |$ H7 w" F0 u - : I9 i3 h; {# E) q: _# W
- int iPort = DEFAULT_PORT;
( x/ D1 I: F; A: \5 u - char szAddress[128];
X3 ^, {/ P+ ~. P
) J, ]8 {1 ], ^" b8 Y7 Z- p. X1 W- DWORD WINAPI ClientThread(LPVOID lpParam)8 Y& W3 G& W( E! w+ x
- {3 `% a( M9 ?/ y
- SOCKET sock=(SOCKET)lpParam;
4 a; t R7 E* ^' `9 } - char szBuff[DEFAULT_BUFFER];( T# t k9 O+ B$ y( B
- int ret;: o8 L5 \0 J2 n1 J. R9 {: X
- ( n3 X8 e9 U, l1 B/ p
- while(1)
: F2 @% c4 d" {! V Q - {
e. d' j5 `7 T& z3 ?5 T$ @) I, C1 j - ret = recv(sock, szBuff, DEFAULT_BUFFER, 0);% s) g! L2 E; A N7 q
- if (ret == 0)! I5 M$ H7 Y% Z1 F0 w, k
- break;5 l0 i" m3 V- z3 }
- else if (ret == SOCKET_ERROR)
6 w1 m/ f0 i! S1 z7 ~* I - {6 }3 K# T( h/ C6 K" z2 B
- printf("recv() failed: %d\n", WSAGetLastError());
$ Q, `' t- }% |9 K - break;
) M! Z Y: t" {. `; s - }8 L: a( j# C# Y, H2 P0 A
- szBuff[ret] = '\0';
9 x1 z! r+ A0 @6 F N2 Y+ z - printf("RECV: '%s'\n", szBuff);
0 E# v0 F- c! Z# R/ \ - if(strcmp(szBuff,"abc")==0){
; @& {( D. v, B; a - memcpy(szBuff,"Send the correct string!",25);) P7 f7 m2 O% j, c2 W8 g$ d( \
- }4 X* H8 z, B( X1 r1 z0 U$ J1 c
- else{
# R8 O+ n' j) w/ i- X - memcpy(szBuff,"Send the wrong string!",23);
5 M4 w F: \ p( b) @3 }6 f3 } - }
+ N, K4 x" C9 a* n) }; \' I - ret = send(sock, szBuff, strlen(szBuff), 0);
. V8 p# j5 Q. }8 Q3 B2 }. e" D - if (ret == SOCKET_ERROR){0 J! d/ J2 s6 U$ N
- printf("send() failed: %d\n", WSAGetLastError());
6 ]* }/ f3 p* V/ ]" V" d2 G/ x - }
L% V0 C2 l* L- I3 r3 O( M - }( g8 h) Z3 R, e3 b+ k
- return 0;
0 ?- K. R+ _: _+ [+ K. X - }1 X6 m0 J" \' |4 E4 C$ D/ v
* J/ l# k8 l3 E; B5 ?- int main(): o0 V0 { m8 S* {! I; K" P$ R# B
- {
' [4 S: W) z& [* O3 o1 | - WSADATA wsd;# c( ?# b$ V" X3 g: ~3 `8 C
- SOCKET sListen,
$ r- K' Z f+ @. o1 S: H( w - sClient;
+ r8 ~8 V# f* i" Y( B4 y5 `& h - int iAddrSize;/ ?( _) F5 N% R- V1 D! e/ e* x% V0 F2 a2 i
- HANDLE hThread;
( R- T" r! b8 @ - DWORD dwThreadId;3 C+ M& ?% w% g& S
- struct sockaddr_in local,
1 J) r4 p& H4 w! z6 R' w: X - client;
" Z& l! v% R2 f3 g' ~% J: P, y% v, ? - ; ]5 e- r& a3 o) Z( z( F
- if (WSAStartup(MAKEWORD(2,2), &wsd) != 0)' J' K- v) m; @' C
- {: r) a; I) i) ?2 a' U$ m
- printf("Failed to load Winsock!\n");
& Z) \8 W' c% i8 ] - return 1;
! f8 m6 I" X4 G - }( E$ W, A) M$ g' c: @; O( W6 W
- // Create our listening socket
: o M, g0 P0 u. Q' R$ H - sListen = socket(AF_INET, SOCK_STREAM, IPPROTO_IP);0 H( {: ^: Q% t s* H
- if (sListen == SOCKET_ERROR)
- X* Q) X, {1 O - {% n3 N- l) j8 o& q/ z8 i4 L& n
- printf("socket() failed: %d\n", WSAGetLastError());
* p8 i1 G" m; h) k9 O3 J - return 1;* D# x; ~$ m3 S2 k, H# X; t' r
- }% U e6 G4 ~$ E$ {/ l; _
- local.sin_addr.s_addr = htonl(INADDR_ANY);% y% }) @5 H9 p. s' j
- local.sin_family = AF_INET;
7 R. k6 w! y! I - local.sin_port = htons(iPort);: X, ^- k+ N o/ l% L0 ~
# ?& U5 g; z& p, D- if (bind(sListen, (struct sockaddr *)&local,
: J! i) [& T I6 P - sizeof(local)) == SOCKET_ERROR)
( J/ |9 Q9 M' q; P - {3 f& @; W7 N. T V/ ], y0 G& `
- printf("bind() failed: %d\n", WSAGetLastError());
. M' M- Z5 u- E4 y0 Y - return 1;
6 j% o7 W% b p6 r; c+ H - }
- @# g! B5 { n9 v% F - listen(sListen, 8);# M; \6 u$ v1 D
- // In a continous loop, wait for incoming clients. Once one: K% h% o! v w/ @; T; d6 ^
- // is detected, create a thread and pass the handle off to it.3 @" s9 z7 x. Z7 c
- while (1)
$ c+ n7 K5 R# S) |# p) I" O - {
9 ~0 z# r- o7 ^: ~ - iAddrSize = sizeof(client);
1 d V; j/ s) t6 N- w, T5 ^ - sClient = accept(sListen, (struct sockaddr *)&client,& @* t2 _" I- A/ k- A+ B' A
- &iAddrSize); 6 \3 B y! ~; e" }7 Z! U. W+ S1 {
- if (sClient == INVALID_SOCKET)
' ]4 A p3 a5 D @ t! _% A1 m2 t6 J - { ' u o7 c H& B8 C" C, \2 s5 l
- printf("accept() failed: %d\n", WSAGetLastError());! i1 y' K6 H' W- L3 ?1 h
- break;8 [- q. V% |* m5 ]( g
- }
0 g* X2 o' d& ` A9 \' @ - printf("Accepted client: %s:%d\n",
& Y1 U8 Z4 d0 H- Q8 l9 s. r - inet_ntoa(client.sin_addr), ntohs(client.sin_port));: Q& G* e6 H3 m$ J3 a: i
" Q' W5 q z) H! Y* f& H- hThread = CreateThread(NULL, 0, ClientThread,
9 I9 }- A8 X( S& q; r( v. S9 N - (LPVOID)sClient, 0, &dwThreadId);
# J8 s" R+ L' y3 H - if (hThread == NULL)/ I4 u* N6 k) x3 K/ O. E; E5 G! H3 d
- {9 \: C6 H; r" R8 g' g8 [
- printf("CreateThread() failed: %d\n", GetLastError());
, n$ E$ _! _9 N4 F8 h - break;8 V) ~: m; D1 t2 K( d
- }
. W( o0 r6 N; r. E* k. X6 Z - CloseHandle(hThread);" Q/ X9 }1 `# E7 Z6 f Q' `3 {
- }
2 f0 p7 y: k# b* [8 l: o - closesocket(sListen);5 Y0 A( ^' j, Z7 T; X& z% s/ Z
-
) S$ U. U$ D3 y( g7 P) u - WSACleanup();
/ R" Z4 j* `6 a' H1 @* K - return 0;6 E! C: n( j# g/ M0 v+ y; H/ }
- }
复制代码
6 U7 {* } O4 ^2 W" z, w& T0 f
0 Q7 b" Z2 n3 q. T( o, Q& r9 C! L" m3 y) e6 [$ w8 X1 L7 d6 n
" d/ B4 p t8 e4 @# V# [4 t! @
, c Y/ b+ W% Z3 @3 Z2 k* _
|
|