管理员
   
论坛积分
分
威望 点
贡献值 个
金币 枚
|
程序很简单,windows环境下的,客户端和服务器程序都在本机运行,在客户端输入发送给服务器的字符串,服务器收到字符串后会打印出来,同时与"abc"比较,与"abc"相同就会返给客户端,输入的是正确的,不同会告诉客户端输入时错误的。
+ |# k2 X( H& L g7 N' m( C& H客户端程序:client.cpp
) p. E6 H2 t: a* _* z- #include <winsock2.h>; f1 ^- l" o/ |1 w' F+ w# |5 v$ [1 U
- #include <stdio.h>9 A, {; o* x% I$ W) ~ ?
- #include <stdlib.h> K$ m& ^' a6 p/ B
! t d2 N9 _$ e* [- #define DEFAULT_PORT 5150
0 S! a9 r L/ [7 n; I - #define DEFAULT_BUFFER 2048
' h2 q* x) A. e% d: O- B - 7 n0 p4 t1 Z7 c2 I7 |" x
- char szServer[128],
$ k, H# s/ V4 `% C7 _& N/ z% m - szMessage[1024];
. n0 D9 P# k: r - int iPort = DEFAULT_PORT;9 m; Y. y& H9 {! D: n% w
. M* g) c7 e3 [" }& v* ]8 Y- int main(), \, J1 V3 N/ @: `. U7 H
- {0 c2 Q7 A# ?# E+ O K. ?
- WSADATA wsd;
0 j: q6 L$ I6 I _3 ]( c8 {1 e) M4 Q - SOCKET sClient;% z- \, K% S$ Q+ t9 T9 V
- char szBuffer[DEFAULT_BUFFER];( I& O2 ^5 a+ @& ]9 Z7 P& Q2 N
- int ret;
1 r! U# f a: ^4 D - struct sockaddr_in server;
# A; Y0 V2 _- S7 u9 n - struct hostent *host = NULL;2 b3 W5 [% h3 R) a K( b0 g
- if (WSAStartup(MAKEWORD(2,2), &wsd) != 0)
1 L' S f' S& c7 o - {
& k1 x! `$ y) W - printf("Failed to load Winsock library!\n");
* Y- N$ D6 U/ d. p6 ~ Q - return 1;" m2 c+ Q) f0 B
- }9 a( R5 ^' k' k
- printf("Enter a string to send to server:\n");2 S5 _1 E! u. C6 e- D- Z
- gets(szMessage);! p" |+ g( k4 U1 F& m5 u% Q+ T; V
- // Create the socket, and attempt to connect to the server
6 o6 W' j3 t: L* D( a. ~$ Y9 e- J6 S - sClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
5 |- H" C& `; a/ u. D - if (sClient == INVALID_SOCKET); t! k5 e$ |0 k0 D6 p) ?7 k6 A
- {, v1 _- J1 |3 {) e* I
- printf("socket() failed: %d\n", WSAGetLastError());: O& A( z0 a. N4 ?3 ]9 o+ r
- return 1;4 m( X- |2 j7 N$ Y
- }
+ `: Q; E) P: U7 _9 q) L" f; J6 A - server.sin_family = AF_INET;1 z' {1 M7 {, X& K/ [% U A
- server.sin_port = htons(iPort);
) a3 i# }" c5 p* i, e3 w - server.sin_addr.s_addr = inet_addr("127.0.0.1"); O' t; j8 n2 I+ k' n7 J% J
* {1 g* {) q2 {. }! C- if (connect(sClient, (struct sockaddr *)&server,
# F' c C9 c& T/ |* U4 K; Q - sizeof(server)) == SOCKET_ERROR)* e* s1 S+ F0 |
- {
/ u4 Y% p* J$ z# C ` C - printf("connect() failed: %d\n", WSAGetLastError());
& ?- v8 K% Q( j! z - return 1;! i) a, U9 h' l$ H6 V
- }* Q3 ^0 x1 F/ ?- ?) H
- // Send and receive data" a/ l+ Y3 k3 i7 Q$ C- c- R& H3 x f# y
- ret = send(sClient, szMessage, strlen(szMessage), 0);
5 X8 e% u1 a1 l5 e0 h9 n% [ - if (ret == SOCKET_ERROR)* j9 e8 J5 d8 d0 s
- {3 V' U* g; }/ h) M) s4 _# X8 C
- printf("send() failed: %d\n", WSAGetLastError());
! V1 p: X2 g& W$ t6 b4 p# S# ], p - }
5 R( h7 [) N0 m# F3 T' | - else{
) @# W3 g6 R; m) i9 Z - printf("Send '%s' \n", szMessage);6 c; ^+ h* w$ e' U G0 V
- ret = recv(sClient, szBuffer, DEFAULT_BUFFER, 0);, U d, n2 Y2 g7 l) y
- if (ret == SOCKET_ERROR){5 N- _. P/ v3 q! m p4 Z
- printf("recv() failed: %d\n", WSAGetLastError());' \- i: |5 v, S) J0 \" k0 Z
- }
. ?: I: i2 l1 q+ S& T' G$ ` - else{
6 x; I; ~. D+ E' w- Y' ^$ M; m G - szBuffer[ret] = '\0';% F1 j$ I. T. j& L& [( w2 t
- printf("RECV: '%s'\n",szBuffer);
5 E4 J* N8 v" n: R% W% c5 W - }
9 U# V6 } n- N, c1 \ - } B7 P5 f" h8 k% w8 V* i
- closesocket(sClient);' a; i6 I+ f( {0 Z1 x. T9 M7 {
7 Q2 X! w6 V7 \( v8 ?) C- WSACleanup();) v; s- c$ Z3 Y( I7 j8 W
- return 0;
# | `+ ^* e. i6 W! V+ f) \ - }
复制代码 服务器程序:server.cpp! ?) E( e! ^6 @$ ]3 c) H
- #include <winsock2.h>
* T/ p- h# n# R! O4 f - #include <stdio.h>
% A& {" o! B( h* Y - #include <stdlib.h>) G7 h! f) |# k; r6 u, }& R# Z4 Z0 V/ J
& i8 x, q! l% F. N9 `- #define DEFAULT_PORT 51505 n4 L! y4 K# j
- #define DEFAULT_BUFFER 4096+ Q6 W+ T8 e) @5 m, o
, a8 p( X+ }, l1 D6 \1 }: `- int iPort = DEFAULT_PORT;
- u6 Y4 e. \' T; ^4 L B - char szAddress[128];4 p2 n a) b& Q% |2 y" K" _- }
- 9 W5 s% H1 h- v4 {* u: v
- DWORD WINAPI ClientThread(LPVOID lpParam)
8 t. d6 \$ h. b) p( M* h+ H - {- @' y; ]8 z; M8 B) T! D. Z
- SOCKET sock=(SOCKET)lpParam;0 b! X$ |( ? E2 i1 {, r& z8 Q( w
- char szBuff[DEFAULT_BUFFER];
2 U" d' H# h/ r& a6 R# G - int ret;
; r; X) l% r0 J8 O* A' A" L# J& F. E8 P
$ h0 k2 v$ D& ~9 _ X) X+ J- while(1)
3 J3 n: K/ f5 R - {* d) x/ D8 [ m- [5 s- O; L
- ret = recv(sock, szBuff, DEFAULT_BUFFER, 0);: R) |: g l3 b* _' Y( C3 e$ C8 N
- if (ret == 0)
5 ~7 h C* B8 g - break;9 e# k( ~$ Y$ S) {* D! }
- else if (ret == SOCKET_ERROR)1 _% F7 l0 u" t+ i
- {
5 X* Z& L p% {4 ?7 k) ?& o8 F - printf("recv() failed: %d\n", WSAGetLastError());
# g- D; r. c7 D% V6 e& s# { - break;5 J; r; R& X N# T( I
- }
. e% u! \) u" {: T! r" Z - szBuff[ret] = '\0';% h. V, a3 z5 h* a
- printf("RECV: '%s'\n", szBuff);
! a' x. h& u v$ o5 U - if(strcmp(szBuff,"abc")==0){# b, O+ O6 `+ o) N9 m
- memcpy(szBuff,"Send the correct string!",25);
, c# i# Z6 S, H1 q9 g - }
3 s4 H1 h" D! K3 o! T* b) x - else{5 ]. Z4 D+ I8 P! |. u7 y7 K- X8 A
- memcpy(szBuff,"Send the wrong string!",23);
% f7 y& c8 z% o - }
. q3 J. \. \" `& Y - ret = send(sock, szBuff, strlen(szBuff), 0);. n0 m( y5 x6 q9 M' G
- if (ret == SOCKET_ERROR){' P* z2 `% O3 s$ _7 A
- printf("send() failed: %d\n", WSAGetLastError());- B* S6 w; \, Y# C2 ~
- }
9 [4 L4 M& U0 z( f7 z' { - }
4 I; c* d% s% i5 T, y - return 0;% ~1 f9 i1 ^4 P7 U0 X6 \
- }
3 Q4 W' p, L# w0 C5 k$ I
$ x+ L& m- C$ ~& x' X- |- int main()
* X9 b6 V# t0 E - {
, o# j- I" P( H% F - WSADATA wsd;
0 g% u) e5 u3 r1 Y9 P - SOCKET sListen,
) Y# M8 q8 s( P3 E3 D/ s - sClient;
& T0 F! ]1 T/ a9 | - int iAddrSize;! O2 q& T* I1 [: C8 Z# |
- HANDLE hThread;: ? b6 F6 ]+ u f8 }" O, i
- DWORD dwThreadId;
2 ]" R. @0 A( X0 b7 A - struct sockaddr_in local,
( @7 A& i! D, h, g% f. @ - client;2 @1 n R+ \: H: R
- A0 Z6 m: Z! g4 F
- if (WSAStartup(MAKEWORD(2,2), &wsd) != 0)( s7 D3 V; q. ` I
- {
% @# y0 h9 e' n - printf("Failed to load Winsock!\n");
1 v2 K; M" j% Q% e* V+ g - return 1;
9 G/ j: e2 E1 A3 Z- P. Z+ } - }
- p. j& `3 j- y' ]6 X - // Create our listening socket& N9 B/ s, h# e3 M' U" G
- sListen = socket(AF_INET, SOCK_STREAM, IPPROTO_IP);) f* X! \+ S% X3 g
- if (sListen == SOCKET_ERROR)
& V+ B# `' i5 \7 T8 Z" s ` - {
& s0 b+ s% x& q+ c% W9 r4 J - printf("socket() failed: %d\n", WSAGetLastError());
! S" e2 b$ v8 z+ H, g' W" m - return 1;
6 u# Z) j K8 \7 I6 f+ I# B - }* o) O9 Q, L! X& _! c
- local.sin_addr.s_addr = htonl(INADDR_ANY);. t) o, T+ f1 q% Y+ Y
- local.sin_family = AF_INET;
& k+ D" G* x9 N5 i) L. z5 o# J F - local.sin_port = htons(iPort);- o4 Q* ^! x! r2 {) V
- : y3 Z& O1 L/ V O% x
- if (bind(sListen, (struct sockaddr *)&local,/ d2 i1 ]: u6 ]. a0 d
- sizeof(local)) == SOCKET_ERROR)
, Q# [4 o8 b& ]3 s/ r0 }; l - {
' ?% Y& i+ b7 L - printf("bind() failed: %d\n", WSAGetLastError());
; o& B8 q' N4 d8 q: T! v - return 1;% w$ S' _8 w/ _7 R) @" i$ G8 p" Q
- }* h, L0 Q- s9 O, w" x/ s; R
- listen(sListen, 8);$ n% Q5 W- ?. o. Y
- // In a continous loop, wait for incoming clients. Once one
( i6 N. q; z' }! o - // is detected, create a thread and pass the handle off to it.
/ U- S% a8 I4 m. N& } t; Y6 i# J& R - while (1)
" L8 E) O2 F+ D% R. A# Z& s7 M- e - {( l0 F; D/ }0 ?; r% {
- iAddrSize = sizeof(client);, V0 |7 L4 n) _9 ?, b* x
- sClient = accept(sListen, (struct sockaddr *)&client,* n5 i# @, A- f ~6 f. n2 Z/ M U
- &iAddrSize); % ] E. @2 I2 W9 w4 I6 f( T I
- if (sClient == INVALID_SOCKET)
0 T0 P, d& ]( n' | - { 1 S; \3 ~! @* r) j1 g- F X
- printf("accept() failed: %d\n", WSAGetLastError());2 I$ j0 o$ s; a; s' v6 s2 R
- break;+ }! @5 @. G$ T5 q
- }; I$ @. r+ R) b$ c6 P
- printf("Accepted client: %s:%d\n",( c' s i0 m0 h+ H
- inet_ntoa(client.sin_addr), ntohs(client.sin_port));6 p$ T1 N+ S, _6 Q: y' A0 ?
- : B7 J& G d: @& Y+ {* ]
- hThread = CreateThread(NULL, 0, ClientThread,8 a5 H( `% }2 S2 R7 z, G! `
- (LPVOID)sClient, 0, &dwThreadId);3 o V& _# r. B
- if (hThread == NULL)8 v' g. C/ q* U! ^
- {: `7 q0 i2 w5 c2 i
- printf("CreateThread() failed: %d\n", GetLastError());
$ w" Z1 V0 m- m9 i3 b% I - break;
2 g- H: W/ P' W; j3 j6 _7 f - }
# N3 ~' u3 k6 [9 [) I - CloseHandle(hThread);) o. J8 c7 Y6 q" t/ G! m( K
- }" X; v5 U: k# Z$ e8 I0 ~1 e
- closesocket(sListen);
" d" k) @3 e* @% r9 v# H9 o - ( W# n/ _4 n: y: |" `% {+ J$ w/ m
- WSACleanup();
+ S5 g3 V" I9 L8 y3 v - return 0;3 _9 Y$ {* l& H# B
- }
复制代码
9 m* c- d+ Z' W" }5 v) ?
& o3 P2 n: H: M5 F9 l8 }" X0 k6 T/ F8 a+ V
. I3 L U9 j6 W0 u! z$ y) H
' n) V4 W- e d
|
|