管理员
   
论坛积分
分
威望 点
贡献值 个
金币 枚
|
程序很简单,windows环境下的,客户端和服务器程序都在本机运行,在客户端输入发送给服务器的字符串,服务器收到字符串后会打印出来,同时与"abc"比较,与"abc"相同就会返给客户端,输入的是正确的,不同会告诉客户端输入时错误的。
; C; z K, s* X& \* j客户端程序:client.cpp, p+ C F5 J h; ?& v9 t
- #include <winsock2.h>$ r& C2 q5 a8 W
- #include <stdio.h># W+ y" {1 p ^2 L5 F) w
- #include <stdlib.h>. x2 K ]0 p. F) d/ e: Q# `
- 4 q: Z# l9 S! Y' E: I& d" Z
- #define DEFAULT_PORT 51506 H0 L; P. {3 d. }" `0 [: i
- #define DEFAULT_BUFFER 2048
9 n# g! v- Z# E
' g1 D8 a. N( z5 a& C) x. H W- char szServer[128],
) ~- ]/ q' t1 `. q$ b& z - szMessage[1024];
3 X; D" I4 |! l; t/ ~' o/ n/ [ - int iPort = DEFAULT_PORT;. P0 J+ H, P, E; S N
( ?9 i1 M8 n& i7 j3 Q: n$ C3 W- int main()
" T. V+ n, y' r6 s& t - {
, q- a4 i1 ?8 Y6 J g7 ] - WSADATA wsd;4 o6 i$ H3 v5 D Y P; X
- SOCKET sClient;
: l$ P) Q: R# c( d Z - char szBuffer[DEFAULT_BUFFER];
' _0 N+ V7 Q! M! a - int ret;2 ~8 L* e& s% j% s5 G$ D: n
- struct sockaddr_in server;
! v' T+ N1 _4 }* P# N - struct hostent *host = NULL;
1 P: d' x8 J8 ?/ b) C - if (WSAStartup(MAKEWORD(2,2), &wsd) != 0), O; v3 j: D, V2 \! g
- {
. U: I, v- e) ~& S* d - printf("Failed to load Winsock library!\n");' }+ S, B* i, `3 l
- return 1; t% ^. O( Y" w. u9 T
- }
) U9 c5 T3 _% G1 W: n# w - printf("Enter a string to send to server:\n");
5 Q3 @7 ]/ R w8 U9 \5 C0 m - gets(szMessage);
4 v/ R( m* A8 e' ] g7 _9 M- t4 ? - // Create the socket, and attempt to connect to the server3 C2 f: l& e3 c( C6 P$ V
- sClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);& j, {2 C N4 M0 c( {! c
- if (sClient == INVALID_SOCKET); K) d/ f$ G, i" B. C
- {
9 h6 B: x% I6 R# s - printf("socket() failed: %d\n", WSAGetLastError());
' Z6 L& b5 P3 E/ a& H' K8 M8 K - return 1;
' X. E- T) w- m$ w, M- G, o* Y$ i% w - }
/ q5 l( G a g+ x4 J - server.sin_family = AF_INET;1 O( {! [' p/ f& P! w
- server.sin_port = htons(iPort);
9 V* I$ \ G1 \# f - server.sin_addr.s_addr = inet_addr("127.0.0.1");
! `; e% |$ R4 ~- D - - j ^9 B+ M L& q- ^8 o. j$ l0 u2 X
- if (connect(sClient, (struct sockaddr *)&server,! p' A+ z: k' A$ m& s
- sizeof(server)) == SOCKET_ERROR)
( |$ [. v0 O! x1 t7 u8 z. D - {) {; _. y+ f$ d c- z/ S" J
- printf("connect() failed: %d\n", WSAGetLastError());& t8 y+ \, A/ M' ~
- return 1;
3 s6 b+ Z9 B- D9 z3 K - }
/ i; }. Z. G, J! C* n1 r& B - // Send and receive data
! N: A2 J; B5 _# s" l- c* K4 [ - ret = send(sClient, szMessage, strlen(szMessage), 0);
( J; }4 [+ k5 G, u& ~7 z- l* G - if (ret == SOCKET_ERROR)
2 ?7 P! n/ Z# h- G& j - {
: |* \% U1 j& C1 l0 P; o - printf("send() failed: %d\n", WSAGetLastError());& |* m) h' \' R" O5 h0 Y
- }' z! j; D) [; F5 Z+ R
- else{7 g5 I1 j$ w# X: E* s! @
- printf("Send '%s' \n", szMessage);( ?( n N( S. E( i
- ret = recv(sClient, szBuffer, DEFAULT_BUFFER, 0);
* P7 b7 T4 a) ^4 V% O, E q - if (ret == SOCKET_ERROR){& {& y( d, [# w9 X
- printf("recv() failed: %d\n", WSAGetLastError());
n' A5 i% D, y6 A1 f, a4 U - }; T# J" W2 e. F1 a, [( Q& W
- else{
' O! F5 ^/ r, @# }' D7 ] - szBuffer[ret] = '\0';
2 }9 {9 N4 v' v) |* | - printf("RECV: '%s'\n",szBuffer);' s& X! v3 E' L! s3 |
- }
" v$ {/ q6 L3 a$ F - }
* ]2 l+ B5 O, Y" V4 N - closesocket(sClient);
% e3 X, h$ J$ @2 q3 v: \
' F) @* m. o: s1 }: s& |- WSACleanup();+ \: q# C0 H' b" r
- return 0;) J9 W. m: P, E2 w; |$ j' B& x: Z
- }
复制代码 服务器程序:server.cpp' ?/ m& Y8 O6 H: W
- #include <winsock2.h>( M; Z% d8 L/ Z
- #include <stdio.h>
0 @0 U U. ~, p6 F - #include <stdlib.h>; ?1 P: O2 @6 g
- : N/ u3 L! V7 u5 s
- #define DEFAULT_PORT 5150" e6 F3 r! o% b& O# d' C
- #define DEFAULT_BUFFER 4096& p; x. p# l- D0 B
- " r; m% Y4 O; p
- int iPort = DEFAULT_PORT;1 q I: l/ q0 O! p1 ?' ]6 U7 j3 n
- char szAddress[128];
1 q* s }( c( l/ X) R
2 I! b7 U9 U* q$ w- DWORD WINAPI ClientThread(LPVOID lpParam)
j9 M2 `2 F. M- p. [& ^ - {
3 S% \! S! }1 v7 z; h, Y - SOCKET sock=(SOCKET)lpParam;5 w1 |" g! w3 E8 m' G
- char szBuff[DEFAULT_BUFFER];
& Z+ M( z( C* D h5 @ - int ret;
: O, e, v5 U4 T - $ }# I2 V$ p5 |3 j1 D* Z
- while(1)6 m' S3 H+ Y5 a1 g
- {
( g$ C6 o5 G8 z2 H# O( E( E - ret = recv(sock, szBuff, DEFAULT_BUFFER, 0);* }0 `. |) B1 f: K$ z, a2 e
- if (ret == 0)
/ q6 J, t0 Y' e# G ^1 x' Q - break;
! W5 t3 Q; @# G+ K1 e - else if (ret == SOCKET_ERROR) I$ {7 U) W- Y5 F+ w* h
- {
. Q2 {0 n6 F# K2 e1 | k - printf("recv() failed: %d\n", WSAGetLastError());% w7 D' W7 ~, x m% ]+ e; W4 S6 r u
- break;
+ Q4 z! E) s7 Q; n - }4 i# M; |% Q$ w
- szBuff[ret] = '\0';1 Y! Y( D2 E3 ?; M4 {/ @
- printf("RECV: '%s'\n", szBuff);
! B f1 W: \- u6 E9 ?% L - if(strcmp(szBuff,"abc")==0){9 g, I& b# g& m$ x" B% n
- memcpy(szBuff,"Send the correct string!",25);
o. l1 c3 ]" M; ]/ j - }
, i5 v A1 r5 J! B( B& o* t - else{" ^5 J% e6 U& v5 H" e$ R' b3 J
- memcpy(szBuff,"Send the wrong string!",23);
Y1 Q0 Z0 i# K* V6 y" N+ _ - }: ?. l) u$ [9 _2 G. H1 j6 ^, i
- ret = send(sock, szBuff, strlen(szBuff), 0);
% ?! n" k$ S4 s - if (ret == SOCKET_ERROR){9 {* h M. I3 E" U9 }$ I! k
- printf("send() failed: %d\n", WSAGetLastError());9 W6 A7 J+ ?7 {; ~1 |- G5 Z
- }
, R q! y3 A2 J0 p5 f2 i - }; x' {: J# C9 K. c; R b* L
- return 0;# U+ o) [4 K$ A, i3 j
- }3 [. ?# B3 A' M2 a
# j" r, p" c. v' [% d- int main()
. K& h+ I' u- |% N2 `7 B' @ - {
9 l9 }2 R4 g% y% @, _ - WSADATA wsd;
: `9 a2 H* u G0 w. T4 N) ~ - SOCKET sListen," w+ S. y7 U) E. h1 z
- sClient;+ H" M+ U. p# ]* `, l. m! S
- int iAddrSize;5 t2 \' Z6 K" z, Q
- HANDLE hThread;
# N7 Z o/ F) g/ q h* a; { - DWORD dwThreadId;
% [9 x' H" v# \' y+ w - struct sockaddr_in local,5 l U% t: q% Q3 h* {
- client;
, N! t# }% t& M% B$ H: C
6 W& _0 N3 ~0 q% Y* W- x! x- if (WSAStartup(MAKEWORD(2,2), &wsd) != 0)
1 w0 L% \& c% T; } - {
# n8 t1 z6 [% G! [/ j+ H, Z4 D" V0 v - printf("Failed to load Winsock!\n");$ b- l, v! s7 }" M4 s
- return 1;7 g. k% V7 i4 H7 F3 @3 j3 Q# {2 w
- } F- G: i. Z& E8 ?, a P
- // Create our listening socket F7 _3 b3 O$ Q$ {' W
- sListen = socket(AF_INET, SOCK_STREAM, IPPROTO_IP);
7 s2 o( z' |4 J, C2 H. l - if (sListen == SOCKET_ERROR): k' u9 T! f7 }, b" Z% ]
- {" E$ h) j% m- v- _6 d
- printf("socket() failed: %d\n", WSAGetLastError());
2 ^# {% \* q2 `/ O8 i - return 1;3 T- O! ]; A$ t* y
- }7 y3 G. o! x( H1 v0 ~. n
- local.sin_addr.s_addr = htonl(INADDR_ANY);: O% f, F/ _2 O
- local.sin_family = AF_INET;& N" c0 ~1 q) p) _" w" }# }
- local.sin_port = htons(iPort);& o- W2 p; t8 c% V2 N' E! F9 s
, F6 `. l2 N+ w, c. E- if (bind(sListen, (struct sockaddr *)&local,
, r E: u+ K" ]. v0 B - sizeof(local)) == SOCKET_ERROR)
; t; g+ [; [, H7 K) l' a. N" P. {( F - {
' C7 o% i5 j8 W9 k* x - printf("bind() failed: %d\n", WSAGetLastError());' {* {7 w- x; A2 @8 _% x
- return 1;
9 g8 F4 L0 S% ?7 | - }
% u) ^) P# i# N/ q' _% w - listen(sListen, 8);
! q" r( |0 M1 t - // In a continous loop, wait for incoming clients. Once one6 s, e2 A& `& z! @' z
- // is detected, create a thread and pass the handle off to it.
* n9 F3 ?. H1 h; T - while (1)4 Z0 h5 F# y6 s2 `; G
- {
7 p) W$ ]1 B/ P0 x1 x - iAddrSize = sizeof(client);! y2 `! x5 X" O; u
- sClient = accept(sListen, (struct sockaddr *)&client,5 I$ k: B& e, |& ~2 u
- &iAddrSize);
: @9 |* ]7 B" \$ U& |' b - if (sClient == INVALID_SOCKET)
% K3 h) R- v7 z! X; f8 P4 f' y - { 3 w/ D' O5 H6 e. U! u) g
- printf("accept() failed: %d\n", WSAGetLastError());
- _% F1 I2 t" [5 ?* |2 z8 J0 X - break;
/ S1 L% L! e! h5 J2 r% H - }. [3 w( C8 I% a1 S& J6 [$ L, B. h
- printf("Accepted client: %s:%d\n",
3 g. W! o0 `" L1 ]( i/ j - inet_ntoa(client.sin_addr), ntohs(client.sin_port));
3 V0 B1 q$ L2 V4 E
4 Y4 _5 n4 E1 ~; z- m- hThread = CreateThread(NULL, 0, ClientThread,
* Z0 T' P: V4 `& H4 R2 n - (LPVOID)sClient, 0, &dwThreadId);4 b/ O$ E& V, u
- if (hThread == NULL)) G% Y+ f1 g3 ^) N% |1 |
- {6 q9 v1 T! y+ n: `+ z
- printf("CreateThread() failed: %d\n", GetLastError());8 @ K! j) f+ x' C
- break;
! v+ m. g7 u8 G" r" K7 j8 X - }5 a7 m% Q" X2 O
- CloseHandle(hThread);
' A- R O: `4 _. v! T - }
/ Z% E3 u/ ^: V - closesocket(sListen);
' q, ^: B+ O( s G; D -
# K8 ]) g! E5 a1 K - WSACleanup();
+ f0 H$ @0 A; K) j" ?& Q* L: N - return 0;1 i3 J0 w( Q+ C" X' p* B$ W5 o: Y
- }
复制代码 . ?# U/ X- l" E: e, Q! v- [( Y y
) u) [6 p9 X; `8 r
6 m3 g# w. L0 d
+ h3 R0 f- t' c
" d9 f- u* d3 {3 m |
|