管理员
   
论坛积分
分
威望 点
贡献值 个
金币 枚
|
程序很简单,windows环境下的,客户端和服务器程序都在本机运行,在客户端输入发送给服务器的字符串,服务器收到字符串后会打印出来,同时与"abc"比较,与"abc"相同就会返给客户端,输入的是正确的,不同会告诉客户端输入时错误的。& e1 i7 N# }, R# a& ^; |1 R4 T
客户端程序:client.cpp
4 C3 ?7 I9 l; U2 f3 \- #include <winsock2.h>
M! w: V/ l- M8 A3 @ - #include <stdio.h>
, Y* f, \$ [, l5 x! \0 G - #include <stdlib.h>
5 ]6 `1 E+ n A7 j - 1 D2 x! j0 D5 ~- O/ z9 M$ V* Y
- #define DEFAULT_PORT 5150$ k- ~5 r+ \* r/ O' o+ l" |
- #define DEFAULT_BUFFER 2048
8 ^5 m( M- Z' P - 7 I& c/ [6 ~$ W. }4 R+ F
- char szServer[128],) \" Q5 ], z, s$ [
- szMessage[1024];4 [1 u6 y6 V; L/ n
- int iPort = DEFAULT_PORT;
: A" B6 n$ | s: K
1 `2 i" E3 o' v1 j- a0 V- int main()6 N( q# ?, X% a+ w
- { h+ e3 f8 b3 s2 ]6 \
- WSADATA wsd;7 k9 S# y" b0 e+ R9 Y k
- SOCKET sClient;3 d5 j4 s ?+ u% z# [- t/ Y
- char szBuffer[DEFAULT_BUFFER];
, }7 b' J5 u' v6 w( g' q - int ret;( C8 _* `+ j& r5 c
- struct sockaddr_in server;0 Q' @; F5 b5 {, D
- struct hostent *host = NULL;
# s% A3 E, G- h g+ A1 s; i( ] - if (WSAStartup(MAKEWORD(2,2), &wsd) != 0)0 u$ k' D/ a4 C3 [2 h* A
- {
$ K1 R9 r) j: v4 w+ @2 O% B - printf("Failed to load Winsock library!\n");
8 Y: p- O9 d/ t8 ?, {1 a - return 1;; _: I: e+ {- d) q6 s7 B5 V! z6 v
- }
2 o% N9 {- B/ q# e! N$ h - printf("Enter a string to send to server:\n");8 B8 n1 a* }% o* @9 Y& t
- gets(szMessage);0 ^% k3 p! A0 H& ~' ^
- // Create the socket, and attempt to connect to the server
, O- [% k) B5 U; E! Y5 P! K - sClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);) O# ^: q+ a1 D( N1 c
- if (sClient == INVALID_SOCKET)8 |' S$ H+ C( A# N0 F; s
- {
b& j2 w6 a8 j+ Y' l: V - printf("socket() failed: %d\n", WSAGetLastError());1 T% P5 ~" N! }6 E
- return 1;9 ?" c& L$ I2 _6 k
- }4 Q6 i/ ~3 D; U7 F4 r$ J% r3 x
- server.sin_family = AF_INET;
+ e+ R Q0 R" s$ _) w7 k - server.sin_port = htons(iPort);
0 W0 j2 `2 n, b - server.sin_addr.s_addr = inet_addr("127.0.0.1");
. i+ ]6 G& O6 g+ v8 m- w6 @
3 j/ G r& A1 V, O$ @- if (connect(sClient, (struct sockaddr *)&server,
( }) g- Y( l O5 v - sizeof(server)) == SOCKET_ERROR)) K2 H& q5 A; x9 ^$ U# f
- {
: F. H; I2 N& S/ ` - printf("connect() failed: %d\n", WSAGetLastError());
0 P! k4 Z6 K, B3 Q, E - return 1;6 U% c& W7 i2 O% \4 @* y1 X
- }
9 [& U e1 ~( X+ `( z0 i! G - // Send and receive data9 `/ d+ [, @$ G4 d* h6 G$ Y. R
- ret = send(sClient, szMessage, strlen(szMessage), 0);2 s5 T% m* L. E: W: Z
- if (ret == SOCKET_ERROR)/ x% O' z+ h* `8 l O* ]& L
- {* g7 A( T$ M5 l+ ^$ G, V. \
- printf("send() failed: %d\n", WSAGetLastError());
" l8 B8 D9 ^; Q3 v' \ T9 T - }- X2 O' m5 f: M
- else{4 O& v* n) ~0 s" q% n0 @ F
- printf("Send '%s' \n", szMessage);
; } r! g# ^. ^ - ret = recv(sClient, szBuffer, DEFAULT_BUFFER, 0);, ]4 D8 k2 ]. s ]& W
- if (ret == SOCKET_ERROR){. {1 G, }3 S8 c. ~; h" `
- printf("recv() failed: %d\n", WSAGetLastError());% U2 p4 Q- ] g* Q/ k! t
- }
) U( j" E* r, t/ ~* y - else{
: y, A0 H$ |( O! M' W/ g t4 H - szBuffer[ret] = '\0';9 |/ I& o( e) t, D' p% k, O
- printf("RECV: '%s'\n",szBuffer);$ f& Y Y3 N6 _5 z; {) H, a4 [
- }3 V2 {+ p) U" @! T
- }3 d' M! ]! c; r# }
- closesocket(sClient);
( c/ d# E* |% C7 h7 L - - I& \3 h, p& {+ e' t# k7 |0 l2 r
- WSACleanup();, ~ Z0 g1 [2 a, S' b' _
- return 0;9 x% m ~) L7 ]' z' C( }# ?$ Z
- }
复制代码 服务器程序:server.cpp6 e9 c" g' J1 P
- #include <winsock2.h>! ~- z" H- a& ^& q5 B- }# e
- #include <stdio.h>+ R) |! @1 H& p7 e
- #include <stdlib.h>
" x' D% u( O$ Q- c1 V% F8 g - $ z6 l, [5 C; i2 s3 X2 c( }% P; Z
- #define DEFAULT_PORT 5150* V8 J5 ~9 p1 _
- #define DEFAULT_BUFFER 4096
0 c$ f! I% ]# y( r G - # u. @- m6 h* W( W! U+ ?3 O
- int iPort = DEFAULT_PORT;
5 K- [) p2 Y7 ^9 X& | - char szAddress[128];
: D5 L6 G1 t$ F" q9 S- u. x
) h; R/ \; _, s. W- DWORD WINAPI ClientThread(LPVOID lpParam)
1 b/ ]% p# {8 V6 S* I0 r - { ~- E E. _0 D+ M: d) V9 s
- SOCKET sock=(SOCKET)lpParam;
* G# d+ c o' i5 u& M- X - char szBuff[DEFAULT_BUFFER];
: W1 ~: o4 B4 t; w, c6 T - int ret;
& x% |# K' C+ M% b! b - & E3 o1 l( w! r8 T+ j. x- q' n
- while(1)
2 u5 M8 o# G$ H0 L1 b; J- i - {: G. }7 m" O8 `, L f- |" m
- ret = recv(sock, szBuff, DEFAULT_BUFFER, 0);
! j- r* B D' D. S4 y6 j* _ - if (ret == 0)7 t, g- {/ r6 y- H3 `( t
- break;5 K! b' x% s7 h% R, h
- else if (ret == SOCKET_ERROR)5 ~, A. a+ G* j7 O1 F) X' @
- {1 r! f7 E9 B7 F
- printf("recv() failed: %d\n", WSAGetLastError());
# m3 }# p0 k5 U9 Z9 {" Q. ` - break;
' v* c- V' P Y3 s6 e. O - }
$ k1 h8 A# K4 [3 N - szBuff[ret] = '\0';
: S5 q2 |' w1 _- ~2 Q$ [ - printf("RECV: '%s'\n", szBuff);
: v, }+ e# y: [2 A! ~, n - if(strcmp(szBuff,"abc")==0){
, c- Q9 Q, e @9 z# g - memcpy(szBuff,"Send the correct string!",25);
# w0 U/ T7 ]' [2 z- Q - }) }9 c7 k, z3 r4 q$ z7 K
- else{
0 h6 }" q" h' ^. v9 v - memcpy(szBuff,"Send the wrong string!",23);
' n; h8 U* s! `; w& a0 p- Z - }
+ L% _+ `, `$ L% T6 q" N4 u4 I+ B - ret = send(sock, szBuff, strlen(szBuff), 0);
# `) b% \2 B4 V* B3 j" ] - if (ret == SOCKET_ERROR){8 I6 Y, \+ Q5 f) q) m+ ?9 [
- printf("send() failed: %d\n", WSAGetLastError());
, C! ^, v3 t3 n+ l; {( x$ ~% f - }- r; C6 S5 b' Z0 j9 r
- }
% i6 m1 B3 c; Z, K: M7 ]' l - return 0;9 C' X3 e9 K, c4 W
- }- V4 c8 k5 \( z1 S9 X2 W
2 O. C0 U0 J N) p8 M- int main()$ ?! s$ I9 m9 [. A2 q
- {. E9 Y) ], s: v5 U
- WSADATA wsd;
4 E3 O6 f F# {9 ~ - SOCKET sListen,
+ x3 F+ ]: ~; ?% V7 M( q - sClient;
% F/ {6 |- s1 K+ s8 a1 W- ?$ a" _ - int iAddrSize;
! w! F& T0 D9 D4 B& l - HANDLE hThread;
& h$ u* R+ x" S5 O! @ - DWORD dwThreadId;4 E/ ?# ^; J/ e
- struct sockaddr_in local,4 P0 J. Z2 Z& E6 `
- client;
: ?+ w _0 H& ?0 i3 e& x
2 t2 \0 f3 [4 K2 U+ Q- if (WSAStartup(MAKEWORD(2,2), &wsd) != 0)
: L% z4 z+ M: x - {
1 \' b0 V6 D2 L0 E" o - printf("Failed to load Winsock!\n");; n. y; r0 m( b* T3 i8 C
- return 1;' w! h( m. q* w' I/ Q
- }% W; V4 F5 I7 }# M* `+ D3 m$ O
- // Create our listening socket% r! {( p2 j* q/ r& d
- sListen = socket(AF_INET, SOCK_STREAM, IPPROTO_IP);
! f3 r R6 f$ s5 J - if (sListen == SOCKET_ERROR)
- n; N7 s! V# G1 O' p6 Z - {6 s/ l$ Y2 R: K" I! I1 o6 j5 j3 P
- printf("socket() failed: %d\n", WSAGetLastError());
, I" d* z* w6 x+ m4 X6 W - return 1;+ z; W; K8 q- @' `+ D
- }
4 Y1 D' ?, Q: T# B; I) r& t - local.sin_addr.s_addr = htonl(INADDR_ANY);
" _! v1 a6 l% i& f8 e - local.sin_family = AF_INET;1 t, N9 {5 _6 a9 G- y4 l
- local.sin_port = htons(iPort);6 r4 _% W; Q! g) ^& ?& P
. Z* i6 ~1 B& v+ b. o- if (bind(sListen, (struct sockaddr *)&local,
) Z! J* g3 m$ `% x - sizeof(local)) == SOCKET_ERROR)' _1 d9 d" l2 g& Y% K9 \* B2 V) N
- {
2 ^$ ?+ g' n3 l' w' V% W0 X5 j - printf("bind() failed: %d\n", WSAGetLastError());
. [ S; l' M8 w- ^7 V - return 1;
4 ?/ b0 G' }# N3 e6 o @* A; | - }0 k& V, l5 x! e# Y; O* g
- listen(sListen, 8);. X! p# b* Q3 z" K" o! u6 I7 _
- // In a continous loop, wait for incoming clients. Once one$ K; u7 X- S( P) W
- // is detected, create a thread and pass the handle off to it." k$ R; l3 c& m. e& D8 x
- while (1)" W9 r8 K1 W8 N( ~. m8 ]
- {0 l; o* A' h3 G* d3 y f" c
- iAddrSize = sizeof(client);
' H8 O: X. m2 S: O/ N& k - sClient = accept(sListen, (struct sockaddr *)&client,
! a9 U* B( F, d: r: k) r/ V - &iAddrSize); . ]1 F$ n( G5 f6 ~
- if (sClient == INVALID_SOCKET)
2 M3 Y2 e7 c" B2 U+ ^8 x - {
k7 ~/ d3 K6 } - printf("accept() failed: %d\n", WSAGetLastError());
9 f* V. ]% [7 V! o: Z! u1 X$ ~ - break;
, e. Y1 r% j: w+ v3 c - }
& a' n# Y [" K1 _" V! \ - printf("Accepted client: %s:%d\n",1 w3 l+ d' @. h0 s
- inet_ntoa(client.sin_addr), ntohs(client.sin_port));
$ p. O5 ?, Q. K( d8 s - & j# c# x# ]% r1 |5 i1 }# K w
- hThread = CreateThread(NULL, 0, ClientThread,5 Z" W) z, U& P) k; v/ X; `
- (LPVOID)sClient, 0, &dwThreadId);+ b% i( q4 ]$ ?2 e/ }
- if (hThread == NULL)0 b& d/ m- [% C" d( H/ J- n* {
- {
& y( W( x3 a, ~% V5 S - printf("CreateThread() failed: %d\n", GetLastError());( I8 ^% b: i' K& ~* ?) m) A! d
- break;( J. V+ A" s0 C9 s+ a/ _3 Z; e
- }4 d; u$ Y% y; s( K9 R
- CloseHandle(hThread);+ k. V( Q5 M" ?' W! K+ q
- }
* ?+ a# j) y" m% s: i$ ~ - closesocket(sListen);
8 X. N+ ]' o% B1 D - 9 v, p5 B; b+ o! G m" ?% K7 o
- WSACleanup();
- M9 _. ^$ y) u: Q7 U' |4 \$ ?7 z - return 0;
4 V0 X! _/ ]0 @% V7 L - }
复制代码
' d8 x* e' P* f# e$ d R* [" P
- V% G5 l# a% v7 D! z) V, @# B* |: K; p
4 e: }: _% J$ ^, D* U
3 {" r$ T# X3 u; h1 U/ K |
|