管理员
   
论坛积分
分
威望 点
贡献值 个
金币 枚
|
程序很简单,windows环境下的,客户端和服务器程序都在本机运行,在客户端输入发送给服务器的字符串,服务器收到字符串后会打印出来,同时与"abc"比较,与"abc"相同就会返给客户端,输入的是正确的,不同会告诉客户端输入时错误的。
/ J! R9 s% I$ P# D* G( W客户端程序:client.cpp# q& X# p* a. B/ d0 r: A+ x/ B
- #include <winsock2.h>
, \3 J; E7 c2 z2 J ?9 A6 E" M0 W - #include <stdio.h>, {6 u, ~& ?* J9 V0 D9 H
- #include <stdlib.h>
, L1 P8 U$ Y4 x; Q8 l: C
( U" `- w. f2 S+ R8 t% S% h/ b5 D- #define DEFAULT_PORT 5150, A }- v$ w+ q: v' Q- k; ]! w
- #define DEFAULT_BUFFER 2048/ K1 K3 E% b& i7 H; d# o& d
- : y" a# j# j& f) h3 j! c+ _- `
- char szServer[128],. \2 h! \6 s' @# Q" U, `
- szMessage[1024];
0 [# Y6 ~+ R6 O3 Z6 E - int iPort = DEFAULT_PORT;
! l6 i. R0 p! p7 _1 I& ]1 n* C5 m - $ O6 k0 I0 Y0 @8 X
- int main()
/ c1 Z3 [1 N$ z, V% G - {
" E2 n. t- y7 n) m; c8 v* g - WSADATA wsd;
6 n2 K/ @( \: e: ]/ n m; D - SOCKET sClient;* b) |5 w' S Z: H
- char szBuffer[DEFAULT_BUFFER];( b0 \! a1 Z( S& T2 s* d! ^
- int ret;
4 X$ t6 W& ] ^+ q2 ^ - struct sockaddr_in server;" \9 }2 Z9 Z" \. M* p- H0 U
- struct hostent *host = NULL;, u+ h! k2 x- h6 w2 P& z0 k4 L7 p
- if (WSAStartup(MAKEWORD(2,2), &wsd) != 0)
6 C. ]1 @. N. l - {
: s: F' g7 J& F" z" j2 \5 u - printf("Failed to load Winsock library!\n");1 N4 H2 u" E% ^. M. r9 w! q( o2 a: u
- return 1;
5 `; z0 ]( Z: }7 O# I) }0 r( d2 p - }' }/ S' a8 k: Z. ? O1 R
- printf("Enter a string to send to server:\n");
1 O7 O1 M/ d3 b7 r7 r8 ]5 h1 A - gets(szMessage);
. m& t4 I3 [" _6 e - // Create the socket, and attempt to connect to the server
. K( r" h* e8 N5 Z# v - sClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);% z l2 E7 {/ A1 e% i0 M9 r- k
- if (sClient == INVALID_SOCKET)
. J- h0 u# J; v+ z! a' o6 c) B - {
* Y% G$ ^1 p5 n - printf("socket() failed: %d\n", WSAGetLastError());
5 E. l; G* r, U9 U, ^( r - return 1;
- @! n$ p8 |9 t# [: f' K1 g# G - }
* ?+ _1 A) `9 a - server.sin_family = AF_INET;/ H9 A) A m; t# k6 a6 B, [& s1 T& Y
- server.sin_port = htons(iPort);" c! g8 ~ W8 K- @2 z5 C# E# }
- server.sin_addr.s_addr = inet_addr("127.0.0.1");5 [ D5 ^# W4 l, Q
( h) r* h) a6 y2 @: M7 g9 z- if (connect(sClient, (struct sockaddr *)&server,1 m* X1 i0 j, c% v, M
- sizeof(server)) == SOCKET_ERROR)
: Y0 ~/ N5 K( s% d- a - {
+ |, \7 ]9 e& x% C8 G |" v' G - printf("connect() failed: %d\n", WSAGetLastError());
; x4 R3 K4 p9 c* g8 H - return 1;
2 b2 B5 j7 ^5 W. m. V - }/ |. g L# j1 @; r9 d$ V, ^- e: F
- // Send and receive data2 Y. O3 ~) L* N6 C, g
- ret = send(sClient, szMessage, strlen(szMessage), 0);0 Q( Q- g& J6 f7 W j$ y6 o' c
- if (ret == SOCKET_ERROR)
' I+ S' d0 [" C" P/ @ - {" M9 N9 i' W* Y# }! k/ P8 x
- printf("send() failed: %d\n", WSAGetLastError());, y3 q3 o X/ U1 \2 L
- }4 E0 f: x" v$ V4 b+ W& g' r) e2 Y
- else{0 _4 w9 d* {: Q; E1 g. V
- printf("Send '%s' \n", szMessage);, t6 c( z% y: @/ q! g
- ret = recv(sClient, szBuffer, DEFAULT_BUFFER, 0);& M2 D2 \/ k c" O
- if (ret == SOCKET_ERROR){
: T b/ A% M# v( R3 {3 O" b - printf("recv() failed: %d\n", WSAGetLastError());; M5 m% X/ _3 _8 G1 W
- }
* a) z0 `, M6 W' H9 O& } - else{# Q9 e; \: D5 \1 d$ o* u1 P
- szBuffer[ret] = '\0';1 b/ ^8 c! Y9 \3 o4 m% T5 e
- printf("RECV: '%s'\n",szBuffer);) r, R; k7 V1 J$ s- I
- }2 o3 u- u: U2 \: o% ^
- }
" r- A$ N k% d; U8 M, ]: x - closesocket(sClient);
" p* m# D, L6 Z( J K - * k+ m2 E7 w( R9 ~) G
- WSACleanup();
# t" @* k2 ~% ?- D2 V' Q1 e - return 0;
' E) _" d* O' ]' t( _- ?3 N5 S+ h - }
复制代码 服务器程序:server.cpp
9 y) z2 _5 |2 `- #include <winsock2.h>3 u T/ q' c5 K% y+ k
- #include <stdio.h>
4 U# U! O2 E" ?/ G. T( K0 C# y - #include <stdlib.h>) f0 K) n2 L3 D% R% B
- 7 s3 o$ y' i6 n
- #define DEFAULT_PORT 5150
9 h- P0 k, D+ l" B3 f9 U1 l+ z - #define DEFAULT_BUFFER 4096
3 J* o9 w/ n5 R( A" _; I- e - 7 j5 A- b0 D! w5 h( I0 ~0 w
- int iPort = DEFAULT_PORT;5 A3 h) A& v# D# J
- char szAddress[128];$ e) R7 z, \" o3 C. L$ {4 [1 ~* w
' y$ h- A. ^, z- DWORD WINAPI ClientThread(LPVOID lpParam)
/ T; b" P# K4 S" ?7 e; ^ - {, z& o" P. @+ z, t5 D4 N
- SOCKET sock=(SOCKET)lpParam;
, h8 E) D0 O* d4 [ - char szBuff[DEFAULT_BUFFER];
+ B3 w, d! j" M) M+ M, H9 S" Z: y. I - int ret;% U- |& @9 R! u7 W2 f' ?4 W
- 4 @3 _+ J$ `, D% T5 s
- while(1)
' h: L) f3 y8 e0 b h' f5 @ - {
7 d0 H: q! p4 ?, G - ret = recv(sock, szBuff, DEFAULT_BUFFER, 0);$ M& ~; H5 W+ h
- if (ret == 0)
$ r! h+ A" o0 J5 r/ }6 H! O - break;
* I1 {: w6 d# { - else if (ret == SOCKET_ERROR)! [2 v1 v# W: M2 K! @- A; C
- {( s. l5 L1 D$ |: C: _0 V( S
- printf("recv() failed: %d\n", WSAGetLastError());
2 W% U, o& J3 j- p! V, u* h - break;
# }3 g+ D( c+ T0 r - }
3 r) `* J( }8 T8 r, o4 G - szBuff[ret] = '\0';
6 u% P0 Q; R; m+ ? - printf("RECV: '%s'\n", szBuff);0 {2 J6 H5 X# ^: [- n! @" m
- if(strcmp(szBuff,"abc")==0){; A- u4 D" i! ~9 W$ D
- memcpy(szBuff,"Send the correct string!",25);
1 `; S( Z: Y5 s8 h0 I I* w - }
# B, S6 l" O5 q5 ] o! l7 U J/ k5 `6 o% b - else{: S7 P a$ o/ O& Z: Q1 h' k7 l4 a- O
- memcpy(szBuff,"Send the wrong string!",23);
4 ?, y8 C4 g ?$ F0 A - }
4 Q; s, `( k: l/ | - ret = send(sock, szBuff, strlen(szBuff), 0);
+ b, ]4 e& ]! A5 _ - if (ret == SOCKET_ERROR){
. K0 ~& F, x2 E2 a - printf("send() failed: %d\n", WSAGetLastError());
% R% f& x1 U3 l2 P - }
) H: X2 Q. z& m3 N! [6 c( u - }2 c" @3 c& e% G- S
- return 0;
3 A( j# F$ w' c0 ^9 Y! S - }; T% k( u; |. j9 _3 @4 d
- * q3 c: a3 h: u* j+ k& o
- int main()
9 }6 \2 \* I* h4 { - {
0 ]9 f/ [% z2 j1 h - WSADATA wsd;8 I7 z. \2 m; M7 H4 z% e; P
- SOCKET sListen,/ x5 h+ c' m( M8 }2 O8 C; S
- sClient;
. q9 ^( ^4 j" A - int iAddrSize;& t5 U5 z' u7 N, f9 U* ~+ b8 c8 e
- HANDLE hThread;
" v4 i/ |6 ]) U1 B" m - DWORD dwThreadId;4 A5 J6 @; b0 m# e" n' t* E/ d# |1 u
- struct sockaddr_in local,
/ A) n9 w* M3 | - client;
( g; g, z: i% W6 D( B0 ^ - % L$ B+ k8 F1 q# E, }7 c
- if (WSAStartup(MAKEWORD(2,2), &wsd) != 0)( c3 B# N! q0 U, Q$ ?3 y, T# \
- {
/ X2 W- b0 P/ U! P - printf("Failed to load Winsock!\n");
( c* D7 X" r6 `1 Z, H - return 1;0 w1 l ?6 ~ F/ y% k0 z8 M- L
- }
* T7 }, ^8 U8 ~; r; ]! ]- v" j4 W2 \ - // Create our listening socket# s O. U0 N5 b( F, a G
- sListen = socket(AF_INET, SOCK_STREAM, IPPROTO_IP);
# T% z" m, F1 w4 l, q( d - if (sListen == SOCKET_ERROR)
) @- w m+ B& r, @0 ^ - {
+ r d E& f. U" i# g8 h* y3 R# U - printf("socket() failed: %d\n", WSAGetLastError());* n- |8 ?( C1 C/ l/ r
- return 1;
9 w; ]/ P4 q3 `+ H L% \ - }& p6 C& T# s! n) W
- local.sin_addr.s_addr = htonl(INADDR_ANY);% O5 k& c' ]: {
- local.sin_family = AF_INET;
$ Q# e+ @' w0 }7 s - local.sin_port = htons(iPort);3 `: Z0 m0 C' D3 X2 K+ I
' S2 B$ T$ _$ {/ f- if (bind(sListen, (struct sockaddr *)&local,- D/ |9 [: \. w
- sizeof(local)) == SOCKET_ERROR)- E7 j# H+ j9 J6 P# k/ G
- {/ c/ A- L. C' q, C+ z( D
- printf("bind() failed: %d\n", WSAGetLastError()); ~, a9 e" {4 I; s
- return 1;
9 l5 B' A8 p* j5 y! R# E; S - }
1 U1 ?4 \7 y: m* @6 } - listen(sListen, 8);( y$ |5 J J" M5 S$ {$ j( m+ m* }
- // In a continous loop, wait for incoming clients. Once one
2 F0 P( ? T3 k3 ~ J: E - // is detected, create a thread and pass the handle off to it.
+ w5 r# }& z5 a" q0 r, \7 J0 h3 H - while (1), O' f. X: L$ F* t' d& l
- {' h5 N( c0 L) L/ r/ U6 i
- iAddrSize = sizeof(client);
( z- m; J% B! U p: x - sClient = accept(sListen, (struct sockaddr *)&client,
5 M1 _) c$ c* B' j, {% x8 v - &iAddrSize); " |! {9 _. I( x3 \( p* ?
- if (sClient == INVALID_SOCKET)
K9 F, ]4 U: ?7 q, ]- m - {
/ d$ I" P% y" A q2 Z - printf("accept() failed: %d\n", WSAGetLastError());
* l2 ?7 A" \( c- n" I7 U - break;" X# @4 G! i0 d! f$ y# e9 k% I
- }1 t2 B+ h' q- H6 ^
- printf("Accepted client: %s:%d\n",% Q# _8 |9 T. C. K
- inet_ntoa(client.sin_addr), ntohs(client.sin_port));
+ a1 t" p$ |; l* E
( [' L! F5 ~$ ^- hThread = CreateThread(NULL, 0, ClientThread,7 X; _2 D; A4 A6 ?1 R G
- (LPVOID)sClient, 0, &dwThreadId);) }# c' {: f9 k# {3 M. v; U
- if (hThread == NULL) M# U% o( B- I |& A n7 s+ f9 @. D
- {( X/ q: ~; i* l. Z5 K' L! ]
- printf("CreateThread() failed: %d\n", GetLastError());
1 _; S& r; e& k; x - break;& M5 u) E9 y$ C: B0 z
- }: V) F! j* c9 M8 N& c& X- H6 U8 t4 A
- CloseHandle(hThread);
8 D- e1 @. X3 O3 w$ ^4 } Q$ g - }! \2 J" j1 u! N% I. `
- closesocket(sListen);
: y2 c$ C, J+ p" X -
! c, Y$ M3 j. Y, F - WSACleanup();2 x4 ~' W% Z$ a$ R8 u6 Z# R5 {; A5 P
- return 0;
) A7 w6 a0 G5 g; x - }
复制代码 ) T4 H8 y/ f9 w6 y
) c" Z! d% b& T# O. E1 B3 u
( l" K6 K- n: R$ \0 V/ v& F- w2 @) O2 A
" M5 e! `7 y( E |
|