管理员
   
论坛积分
分
威望 点
贡献值 个
金币 枚
|
程序很简单,windows环境下的,客户端和服务器程序都在本机运行,在客户端输入发送给服务器的字符串,服务器收到字符串后会打印出来,同时与"abc"比较,与"abc"相同就会返给客户端,输入的是正确的,不同会告诉客户端输入时错误的。
/ E3 O0 E+ h1 N客户端程序:client.cpp4 k2 X3 c) j p
- #include <winsock2.h>' |- a5 Z) C$ V' F( l
- #include <stdio.h>
1 t' d9 `) n$ p - #include <stdlib.h>
4 L4 U, S& ^# j! V. i( Q- U1 i
- ]$ t! y) l5 J8 D0 @- #define DEFAULT_PORT 5150, u% c) {" s. M2 |. w% ]* T& k$ ]
- #define DEFAULT_BUFFER 2048
: L" O3 t) \/ r - ! y" A# G: l5 O1 E; N+ x! R
- char szServer[128],
3 _0 d b" P5 O2 `" e - szMessage[1024];; g$ t2 a1 d V5 I
- int iPort = DEFAULT_PORT;9 J' w+ F) a, z3 d; q
6 k5 W/ w6 \; x8 o- int main()6 Y. @& q2 H7 V1 |1 |# [( J
- {& }% Q7 H1 `: l# [+ T% Z) l
- WSADATA wsd;# q) \: ^/ Z. L a& F5 n/ U8 w
- SOCKET sClient;+ e1 M' v8 j" k! l: N0 _. k5 C
- char szBuffer[DEFAULT_BUFFER];
! }& ?* R+ P( J# m - int ret;
" W0 a$ _, F: r/ z7 I) Q$ e1 p - struct sockaddr_in server;* _2 ?$ T d9 L# \4 H k' D
- struct hostent *host = NULL;& _( o* c: w5 {" H
- if (WSAStartup(MAKEWORD(2,2), &wsd) != 0)
' e# s* R( P$ G& z1 C6 x8 f7 o - {8 b9 ]9 ^+ x( k) u
- printf("Failed to load Winsock library!\n");% Y& L' x" |' b4 @! b; s
- return 1;
1 n7 b' D6 s7 m9 s1 n- T8 t - }
0 `6 T; V7 _3 ]6 V% K! E. ]( a/ o - printf("Enter a string to send to server:\n");6 E; _; [8 I. ~, f+ [# G
- gets(szMessage);
o. o4 @% D. e6 w+ R4 w - // Create the socket, and attempt to connect to the server: t3 E, N: d1 b' \5 t |
- sClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);/ i2 ?: m6 J0 s/ A
- if (sClient == INVALID_SOCKET)
7 h k8 w2 W) W: W( r* o; A3 d( X - {
" ^ l8 j6 @0 ]3 X. {( p* i0 I - printf("socket() failed: %d\n", WSAGetLastError());
/ W, a0 l0 p9 z" P3 p8 s- T. X* f - return 1;
- J& l. ~5 [& V- J - }4 s% C8 @* |7 r/ H% C7 {( M! b0 J3 T
- server.sin_family = AF_INET;' M: g+ ]6 T8 O' A, o- t
- server.sin_port = htons(iPort);2 t! }5 e( T! N9 ?4 F8 s5 i0 A
- server.sin_addr.s_addr = inet_addr("127.0.0.1");
1 F5 @, p) E( i3 e# W - 7 n+ K) m2 p6 y6 ? O% F5 {
- if (connect(sClient, (struct sockaddr *)&server,& ^' I- Z6 ~9 V( y
- sizeof(server)) == SOCKET_ERROR)
; R- c; `$ u7 S& Q/ O - {( {& Z% j& ]$ j H, c
- printf("connect() failed: %d\n", WSAGetLastError());
, S$ i$ Q6 n! F% p- B9 o3 W - return 1;- }. |5 ]$ i, q
- }
1 j- M, @' O8 t j0 k - // Send and receive data
2 ?# y; R! f p3 { - ret = send(sClient, szMessage, strlen(szMessage), 0);. X; f3 c& V4 Q% t6 C& r
- if (ret == SOCKET_ERROR)
4 q* T4 o/ a" C& f' k' u - {' i7 a( v: i* j$ e* _, |% [' q! H" s
- printf("send() failed: %d\n", WSAGetLastError());
4 K1 k: v: t( H3 l' `) S - }/ t! W( H; b8 W4 x9 w
- else{
; a$ }6 p5 S/ K1 [2 \/ [ - printf("Send '%s' \n", szMessage);
4 m( }5 V! P! N - ret = recv(sClient, szBuffer, DEFAULT_BUFFER, 0);
+ f# Z) E& ?/ t3 I5 i, B1 F. Y" X - if (ret == SOCKET_ERROR){
# X5 C; |8 I% n6 m - printf("recv() failed: %d\n", WSAGetLastError());
8 T0 v$ F! R' Q0 h% g4 U - }
/ [9 a+ h G$ ?8 O. Q# @0 { - else{
0 U) j4 o% y: m3 l3 h - szBuffer[ret] = '\0';5 T9 w0 q6 Z# t1 o' A
- printf("RECV: '%s'\n",szBuffer);7 b; P& q: s- [
- }
/ Q3 X B6 c+ P" y) R& _- m( | - }
2 x G8 \: ?# o# _' H3 D9 l - closesocket(sClient);
# P7 J* ?3 R' A
- |6 A$ I4 {4 u" Z7 }) S. Y- WSACleanup();
7 }# V: A$ V7 h4 {2 _! ? - return 0;! K C! ^ r: U7 e
- }
复制代码 服务器程序:server.cpp
/ f* S/ X* M+ D# ^" ^# y- #include <winsock2.h>4 E9 s, z, Y; N: B9 o
- #include <stdio.h>
/ A# S4 N/ @0 E+ ?' G$ I* Q/ \ - #include <stdlib.h>8 N% F& l7 a! i% B$ E- L0 ^6 E
- 4 b) j/ y- G4 e5 Y/ D0 t6 Z! Q
- #define DEFAULT_PORT 5150" U/ n$ D' b' |- s' C
- #define DEFAULT_BUFFER 4096
# a7 X; L# x6 m
1 C; s! @1 _" B7 s% [- int iPort = DEFAULT_PORT;
9 N( F6 |6 \, W0 t8 c - char szAddress[128];2 Z* z9 w7 f1 ~" H" |
- 0 W; @8 ~7 b- R/ |- Q! t
- DWORD WINAPI ClientThread(LPVOID lpParam)0 v9 r% q3 [# {- x
- {& A1 \# V: h8 K$ N! X
- SOCKET sock=(SOCKET)lpParam;* z6 `5 Q8 f0 g( `: u4 v5 s
- char szBuff[DEFAULT_BUFFER];+ k, W$ ]3 {! }- p
- int ret;
u8 j% C- D5 N$ G( I0 D; x - # v- T& v8 H3 {$ J' @" `0 Y! w- _! ]
- while(1)
0 ?# L: D% s; ?( x9 y - {
$ O( |* ^1 _2 G1 i - ret = recv(sock, szBuff, DEFAULT_BUFFER, 0);/ Z! A7 I& w" z( [+ Z1 A2 v0 I
- if (ret == 0)8 [1 P. L- G; h0 U
- break;# [8 H/ Y8 R$ M/ @" e4 d( S; f5 y' c
- else if (ret == SOCKET_ERROR)1 m% g0 F* ^4 v+ E
- {0 |+ M. U4 y0 l# P- V
- printf("recv() failed: %d\n", WSAGetLastError());
! ~% _6 x; d1 U - break;' [* U0 A }) X% z. ?7 a
- }0 o; w) Y) ^9 c! Y" M
- szBuff[ret] = '\0';
4 l' _+ j, H% P% n) q1 r - printf("RECV: '%s'\n", szBuff);
9 e0 [1 {# t7 Y& b! c - if(strcmp(szBuff,"abc")==0){4 Z4 g" O8 g4 l5 e
- memcpy(szBuff,"Send the correct string!",25);! ?8 y. w9 l5 g9 {
- }
0 b, \% s! y" Y8 q4 o7 p9 Q2 ^. K: _ - else{/ W4 ~ O) H# y
- memcpy(szBuff,"Send the wrong string!",23);$ \* y w6 I( b z& \* F6 V* L
- }
V! w( G1 t; C" ?4 Y - ret = send(sock, szBuff, strlen(szBuff), 0);# z, H2 ~9 T4 }4 E4 N% Q# n* O
- if (ret == SOCKET_ERROR){- X$ ]3 s! w, P5 n2 V
- printf("send() failed: %d\n", WSAGetLastError());
; R5 G! z% R: ~2 Z3 l4 t - }
/ C8 }* r6 c& c" S! V" F - }
* r+ f) w: Q) b - return 0;' k6 [% z2 x7 v7 D- H4 s
- }: f+ b* B, j6 t4 Y$ B( H6 s
- / K6 B; ^+ ]4 o; \) m+ K4 p" i
- int main()
: V9 J- t9 j" F6 u& S - {
9 l1 W2 H4 I% R5 E - WSADATA wsd;" W$ [+ T( W" B0 h: |3 O$ j1 c, {! Y' n
- SOCKET sListen,
4 O8 @ m" A/ l, V' w9 @ B/ T - sClient;
7 o9 \3 J3 s( ]0 y - int iAddrSize;: M" U9 Q& L# W/ d
- HANDLE hThread;; ~1 [. C+ K$ T; e2 P, r! X
- DWORD dwThreadId;
3 U, j* _6 r7 \9 X3 ^( y$ j - struct sockaddr_in local,
& U6 e- ^- G" C& N& u% E$ S) F - client;2 {/ u7 K! ^: O0 L3 f% C8 I7 ]
2 _2 z0 y8 ^1 a( p4 t) l' ]1 R8 g1 p- if (WSAStartup(MAKEWORD(2,2), &wsd) != 0)
; f+ ]! ^" O. @0 h - {& N M+ q9 s) |, A! q- p3 P$ g" T
- printf("Failed to load Winsock!\n");
, W9 c8 p! }' s9 e+ ~0 v3 y# G$ s/ } - return 1;
+ j5 \( f( d6 K( O% s& J9 y5 ? - }* ]( K3 l1 B ?
- // Create our listening socket, a, I$ N4 f8 N
- sListen = socket(AF_INET, SOCK_STREAM, IPPROTO_IP);1 t1 ]' ]" Q- J2 u, z0 x( z, P
- if (sListen == SOCKET_ERROR) R+ R/ E, s k/ z7 r
- {4 V* Z$ w" l' {) x# j
- printf("socket() failed: %d\n", WSAGetLastError());
s: `( s( p) c5 o" G9 s5 a - return 1;
1 m: `8 E( n4 W9 B% b% }4 z - }
0 G: ?' G/ X# e( B8 a - local.sin_addr.s_addr = htonl(INADDR_ANY);
/ ], J) Y# r& {! O0 ? - local.sin_family = AF_INET;1 N4 P- I j( }: w1 o% @0 J
- local.sin_port = htons(iPort);
1 q- @' e; l, A! E8 q, v
9 p( |# g9 u6 e2 ]- if (bind(sListen, (struct sockaddr *)&local,) o o0 b' S' X N
- sizeof(local)) == SOCKET_ERROR)
, C9 @' ]. c6 a, s# p M - {3 K2 ]) u8 e* l; J1 Y
- printf("bind() failed: %d\n", WSAGetLastError());
* w8 g; z8 i) b6 U* {& f - return 1;
& V9 t. ~% t- ?, z+ D' L8 c - }
! ^/ m: R6 e% J1 D% @! w - listen(sListen, 8);
* r3 _7 l: P8 G* ^* U3 K/ r# d" U - // In a continous loop, wait for incoming clients. Once one
! k' w$ |* Y9 p$ `: B0 }4 _- r# L - // is detected, create a thread and pass the handle off to it.
$ `! B5 i( S1 `/ r9 ?4 r# O - while (1)
, y y$ E0 W8 T( T1 e - {. H8 M, O* y! a
- iAddrSize = sizeof(client);' Q6 P; b3 X; p' ~1 `5 e
- sClient = accept(sListen, (struct sockaddr *)&client,: L; }8 `9 f0 O( f
- &iAddrSize); 1 b2 W. T3 f, ?& P
- if (sClient == INVALID_SOCKET)# T1 D9 S/ \' {) `$ r+ I
- {
6 f& O# |$ {" @9 n( B Q: { - printf("accept() failed: %d\n", WSAGetLastError());
. l8 J9 A K! R - break;
* g+ c; k8 J' f' _ - }
( |! g6 T8 \" v+ M - printf("Accepted client: %s:%d\n",% e: D# g: [( O+ v! J
- inet_ntoa(client.sin_addr), ntohs(client.sin_port));
7 \5 {$ K. [1 O0 N# W# L - 2 ]/ E" ]6 A1 `$ X: ]
- hThread = CreateThread(NULL, 0, ClientThread,1 N) d1 v$ ]5 W: d
- (LPVOID)sClient, 0, &dwThreadId);
2 L, _! j* Y j4 f; ~0 L1 v - if (hThread == NULL)
& C. T! W" A. K* H3 X - {$ w1 k+ o) ?3 {% V% x
- printf("CreateThread() failed: %d\n", GetLastError());( Q* F' G# X8 P/ z
- break;, E0 y' g: V1 Q0 @
- }6 A3 t3 G- D) B% f& \8 [
- CloseHandle(hThread);
) g V g5 T# Z - }1 Z* L0 u/ z1 B8 H" s
- closesocket(sListen);
% |/ b+ D1 F! _% ` - 8 ], ~+ Z! L' x7 s& G% G
- WSACleanup();0 J% _0 B; f7 a. r, l
- return 0;
) `4 o0 p L# N* V( _9 W - }
复制代码
) n+ f- |# o0 i- b/ `; G( {+ L# E, ?' S* }4 }$ g) b4 Y
; K s6 ]% b0 X( N! H2 t F& k* v2 n' m- a
& B1 Z" l2 Q, _# W6 {
|
|