管理员
   
论坛积分
分
威望 点
贡献值 个
金币 枚
|
程序很简单,windows环境下的,客户端和服务器程序都在本机运行,在客户端输入发送给服务器的字符串,服务器收到字符串后会打印出来,同时与"abc"比较,与"abc"相同就会返给客户端,输入的是正确的,不同会告诉客户端输入时错误的。
) w; `7 z* T5 t( }6 D客户端程序:client.cpp' ~* ?! K* i- f! `7 L
- #include <winsock2.h>; E% t7 h# l+ S' e- E8 k( b/ A/ a+ @
- #include <stdio.h>
& Q C6 A0 T* |) \! U - #include <stdlib.h>) {/ T* L9 ?6 w1 @& o$ D4 L
- 5 l) y' d" r* i# X! p3 s8 c
- #define DEFAULT_PORT 5150' E( E2 v% i5 p5 v3 m0 D B$ C" U
- #define DEFAULT_BUFFER 2048
# W9 J5 Q7 J. `8 p# C7 _' ]7 S - Q6 D2 |& I- t
- char szServer[128],% t# X% \6 e! t, p: g: A) H6 ?
- szMessage[1024];8 i8 f p. D- B: g8 i5 I* |
- int iPort = DEFAULT_PORT;4 K- Y4 S% U$ `% ?5 L7 c3 _8 a
' n, Y* m6 E4 i# D3 F6 J$ r3 |- int main()' R0 V% [7 n, p
- {# u: D) Q) ?1 {
- WSADATA wsd;$ q4 }5 {, k: B5 _$ E6 I: B
- SOCKET sClient;
3 |! }$ W% b, `) N - char szBuffer[DEFAULT_BUFFER];# \( Y9 ] [9 m' t
- int ret;
. c2 c5 i/ L4 L+ S8 H - struct sockaddr_in server;& I& t9 x0 N0 |5 S& i, B# l
- struct hostent *host = NULL;) q9 M7 m0 h8 P$ F
- if (WSAStartup(MAKEWORD(2,2), &wsd) != 0)
4 E, Q8 K) N( p6 I% q3 j$ s/ W - {0 P! @6 r; x r& q
- printf("Failed to load Winsock library!\n");
! T9 D' n& N P4 J! E4 U - return 1;
. o9 Z8 Y' @8 _# O - }1 W! n3 P: v& {6 e
- printf("Enter a string to send to server:\n");
0 F" Z$ m O2 `5 b - gets(szMessage);
1 ]) i- b, c5 R: i* m; Q5 K - // Create the socket, and attempt to connect to the server7 a7 Q- B/ Z8 z/ e" F
- sClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
; @8 A) D* ^! D+ t - if (sClient == INVALID_SOCKET)
$ d" b2 Q' N& [; l9 x - {
) W0 R8 H5 ]3 i8 e - printf("socket() failed: %d\n", WSAGetLastError());
5 |: J' ^2 q+ E' ^0 Z6 K - return 1;6 [$ H% W5 P( a) b
- }7 k3 ^. `7 f, i* K( \
- server.sin_family = AF_INET;* s! o- k- a Y
- server.sin_port = htons(iPort);
( z, f, E3 U2 M - server.sin_addr.s_addr = inet_addr("127.0.0.1");1 e, K2 [) ^4 ~3 S q+ {% P
* A9 b3 I& I Q1 b: n3 T- if (connect(sClient, (struct sockaddr *)&server,1 D7 P" p+ y/ Z7 w5 \" f
- sizeof(server)) == SOCKET_ERROR)- ~6 K# J, a4 Y4 F% ~. d
- {- c% A- V6 E$ D
- printf("connect() failed: %d\n", WSAGetLastError());! |/ j5 ?2 e4 b7 M3 ]; }9 a
- return 1;
/ {! N: h5 f: ~( q8 J, A - }
( j, \. ]. X5 B* ~1 V8 w - // Send and receive data
1 g8 I4 l1 r4 D# p! Z( ~2 A: s - ret = send(sClient, szMessage, strlen(szMessage), 0);
, C0 Z$ P6 E+ u) [$ b - if (ret == SOCKET_ERROR)
0 \0 \: R7 i; y0 g( i3 ]4 H) @ - {- C: j* Q& h" w
- printf("send() failed: %d\n", WSAGetLastError());
/ }. B8 y i9 I$ G - }! t' f' i0 a7 [" a! L; `, l
- else{7 [& j1 R2 Q0 z4 X% P+ C& m
- printf("Send '%s' \n", szMessage);
2 W8 h7 t1 B0 w/ @- }% L; @/ x - ret = recv(sClient, szBuffer, DEFAULT_BUFFER, 0);9 ^$ N1 _% K3 [$ b( b: W1 @
- if (ret == SOCKET_ERROR){' J, q3 z- F& @' E+ ~; ]
- printf("recv() failed: %d\n", WSAGetLastError());
; l) L* G" Y2 z E! ] - }8 q/ ]" o2 M& ^4 h
- else{# f8 p4 k; |; q: Z7 b0 m6 h# B
- szBuffer[ret] = '\0';
2 M; b# A: e4 L5 K& ? - printf("RECV: '%s'\n",szBuffer);: {; A# A2 {, ?% y- x, _+ e! e
- }! M9 A7 i2 F! ]+ j" t4 C
- }7 M. |4 ]# p9 D$ a2 [7 H. E
- closesocket(sClient);
( E2 m6 D C( t+ F - - L3 S5 D% `4 M3 C R% b
- WSACleanup();# P/ K) ]8 b" S
- return 0;
# u3 D5 S, m* j: x - }
复制代码 服务器程序:server.cpp
% N. m! e' H& a( P# P- #include <winsock2.h>
' U( q! Z6 H; S/ r- |3 q, _ - #include <stdio.h>
9 j0 |) g! R! a$ {% d - #include <stdlib.h>' U: O6 |, [5 h/ l! X V* m
j1 ?/ l/ L" G6 i+ `9 E- #define DEFAULT_PORT 5150( Y* o1 @' q* X& e% k9 `& i$ M2 h
- #define DEFAULT_BUFFER 4096# Q2 [* m/ ^ u: K- C) M6 o
- ; J- n, N, ~) X1 q6 O! J4 E2 Y2 W
- int iPort = DEFAULT_PORT;- g7 u! L9 N0 _4 g
- char szAddress[128];: G( Y1 t& U8 r0 |9 u4 ~, k0 u
6 A1 ]& j3 k q* `4 s- DWORD WINAPI ClientThread(LPVOID lpParam)
l# ` r, r# A3 Y' H2 R - {
6 h( Q+ a* D- H( _ - SOCKET sock=(SOCKET)lpParam;
1 k$ [. {- j3 S% f2 z$ R - char szBuff[DEFAULT_BUFFER];
+ p9 H; Y0 J4 Y. \$ D - int ret;' x1 `( f+ |! l1 A
- - x9 }3 a& i# [& r
- while(1)
+ x0 p/ R& F: B- g2 S% u: n- z6 z! X( B' ^ - {9 I, `/ ~5 ~* Y0 V9 [
- ret = recv(sock, szBuff, DEFAULT_BUFFER, 0);3 _% f; f5 @; J+ B- [
- if (ret == 0)1 o7 d: Y# ?4 l% f' U
- break;; Q: i" \* F V1 h0 p5 z) C' Q
- else if (ret == SOCKET_ERROR)
. _% [7 b% t, e1 N - {
" l4 {' v8 v \; c! f' ~- D0 s - printf("recv() failed: %d\n", WSAGetLastError());3 T- q% y4 E1 {+ N4 e' X' ]9 h
- break;
/ `; B) j# E: g0 n - }
$ j. i; Z$ T$ @9 x - szBuff[ret] = '\0';' Y ^" X" W {/ E, T
- printf("RECV: '%s'\n", szBuff);& \( q+ g( J" t8 W( F# S- L
- if(strcmp(szBuff,"abc")==0){2 J; X4 K0 d: U; A7 s& }4 f
- memcpy(szBuff,"Send the correct string!",25);
3 a5 N! X* V2 J; _2 U/ e6 `& { - }
: b3 C8 ~' i: N6 ]3 `3 L - else{
: `1 e& p; \! T& [. v - memcpy(szBuff,"Send the wrong string!",23);& k. x' y) }7 A6 E$ R
- }- d4 K7 A, D- |& b- W
- ret = send(sock, szBuff, strlen(szBuff), 0);
: y( c8 s- z3 v9 l) Q - if (ret == SOCKET_ERROR){& t! \) t! D; H0 x2 p: Z/ t2 y w
- printf("send() failed: %d\n", WSAGetLastError());
7 ?: n& j0 w ?* x/ E - }
+ g- B$ c Z3 }2 r" h& K1 I7 C - }+ W* y3 p! k% `$ T2 u
- return 0;
" `# h6 c/ E; { - }, J8 W6 I q; t& J/ |
- * o- Q! B J4 ]8 e/ e4 u
- int main()* a: V( E! w- \
- {1 ^4 o* u7 U* t; `9 g
- WSADATA wsd;( _8 Q4 f4 v( F7 h! @
- SOCKET sListen,9 ^0 d0 S5 F/ i8 b1 a7 ?
- sClient;) P8 P- ], I/ w* E4 m9 e$ j
- int iAddrSize;) M6 Q; G3 l! \% @6 M5 x
- HANDLE hThread;
5 Y9 r7 K" h* f - DWORD dwThreadId;
; H# Q& B1 q: U/ L- F - struct sockaddr_in local,9 C9 Z. j8 P, @% N# m
- client;$ y- Q7 ~6 ^5 o6 O
% c1 c/ {# O5 U' Z- if (WSAStartup(MAKEWORD(2,2), &wsd) != 0): u' r3 B0 v8 q3 S
- {
, F& \ N- |" k- u& E. x - printf("Failed to load Winsock!\n");
8 J/ P' m1 ^; c0 g0 A2 Y1 G2 i7 E - return 1;
& |+ J b& ~6 z - }/ X5 V! l# z2 n8 F! Z1 Q
- // Create our listening socket
2 r! h# X( ^# O( p; ~ - sListen = socket(AF_INET, SOCK_STREAM, IPPROTO_IP);! V, J! @. n- R; `. T$ Q
- if (sListen == SOCKET_ERROR)
4 U" ^9 V8 f6 E - {
: I- j7 y2 O$ n2 S6 E - printf("socket() failed: %d\n", WSAGetLastError());/ m \, S5 E. B8 n; B" a* E2 w6 E
- return 1;
. x' _4 }- q9 G) v: t - }
1 ^/ f. _, p6 R - local.sin_addr.s_addr = htonl(INADDR_ANY);: T- E" B7 i' F7 u: e5 s& e
- local.sin_family = AF_INET;
j" ~# d8 M6 o' t# v - local.sin_port = htons(iPort);3 E2 `. C6 O# v/ Y" U
- ! @) h" t Y" d" G. {1 n
- if (bind(sListen, (struct sockaddr *)&local,( P. Y$ ~. F! k4 ]/ i
- sizeof(local)) == SOCKET_ERROR)5 d/ B3 K6 o2 F3 W& [
- {
* G, Y3 ], Y1 |) H- P - printf("bind() failed: %d\n", WSAGetLastError());* A7 N) \! A9 [/ u
- return 1;8 h( z( L4 i Y) \! @
- }
8 {+ r4 M) l) m- U+ C - listen(sListen, 8);0 @& V! v4 E( n/ F/ K2 E6 C% o
- // In a continous loop, wait for incoming clients. Once one
+ S& d/ e0 n L: ^- h9 i* S# M" e - // is detected, create a thread and pass the handle off to it.8 u; B( k( a- |1 U7 X' R+ ]/ I
- while (1)) K" V n3 k2 v3 K* K0 X
- {
5 \% V' {5 k* @4 r* K( H. {8 c- k - iAddrSize = sizeof(client);7 Q6 O5 c) j* N" E3 J' W2 D; i$ U6 U
- sClient = accept(sListen, (struct sockaddr *)&client,
7 q c) Z; e* O% v - &iAddrSize); / K! @! E1 ~# F' F( `* t' m
- if (sClient == INVALID_SOCKET)7 Y5 r5 I+ g1 o( {
- { 4 D" @% t& k$ M; l+ P
- printf("accept() failed: %d\n", WSAGetLastError());
7 f$ R/ ~" V5 A' i0 a( f' G: ?( _1 @6 F1 T - break;& W! }, H0 l+ ?$ z: P, e: n* t
- }
4 G9 p- } G S1 C0 l - printf("Accepted client: %s:%d\n",9 B5 Y" N# d, Q. o' t7 I
- inet_ntoa(client.sin_addr), ntohs(client.sin_port));, O! J; s# Z) k. f% N" [! i* J; e
- / q0 N% ^6 n2 o! r# i. n& y% R7 o
- hThread = CreateThread(NULL, 0, ClientThread,9 Z' R% n2 ^7 f; Q$ e+ R) D" h
- (LPVOID)sClient, 0, &dwThreadId);
/ Z1 X7 u3 ~( g# d - if (hThread == NULL)
( i3 \$ o+ J* y - {
! k2 R. f) U# }0 U2 N9 _ - printf("CreateThread() failed: %d\n", GetLastError());3 X5 l7 v. v0 q5 |- Q7 B4 ^
- break;* J+ v! W. |' v9 [$ B* d9 W( A: `
- }
. M, a: {4 @2 M" j- w v6 @; P: L - CloseHandle(hThread);% P/ m$ t4 h% t% I) i' E8 D
- }+ f1 i- B7 D, C. G
- closesocket(sListen);
4 T6 K) D2 M$ k8 B - ; m* l! P8 c7 M. T* S
- WSACleanup();
! X1 t" E* e4 x; a# A7 e - return 0;% H8 ~# t/ J( I/ d
- }
复制代码 + b* ~3 d9 M- ^% W/ R
) l1 x: i8 K3 l7 h7 g
- w) u& C" N1 D& A9 p
: V, U; l0 I0 N, z3 ]' t0 f4 Z# p) B. a' K! M0 [( G5 `9 R* Y- D
|
|