管理员
   
论坛积分
分
威望 点
贡献值 个
金币 枚
|
程序很简单,windows环境下的,客户端和服务器程序都在本机运行,在客户端输入发送给服务器的字符串,服务器收到字符串后会打印出来,同时与"abc"比较,与"abc"相同就会返给客户端,输入的是正确的,不同会告诉客户端输入时错误的。5 g- p# [4 V- `% o7 Q3 v
客户端程序:client.cpp
" ? Q* @- R' \5 k# M3 s1 G1 {+ M1 i7 |- #include <winsock2.h>
/ j; E! U7 I% D/ j; } - #include <stdio.h>
/ a8 r! ^6 F$ P* \" [ - #include <stdlib.h>
7 }- K# C- _6 q* B' S0 }2 {
^& |# t8 n* u0 g- #define DEFAULT_PORT 5150
6 t+ a* @$ J3 N# [ - #define DEFAULT_BUFFER 2048
* t! u6 g. H3 ~7 Y. s/ R! @
; b" g @$ u$ D6 j- char szServer[128],
& I$ C5 d0 x: _. `5 y - szMessage[1024];3 L1 w* h; { p3 J' q
- int iPort = DEFAULT_PORT;0 Z0 t0 s9 c6 L. N7 x
- 5 V$ @/ h% n7 V, e ?5 d
- int main()
v) {" q/ ~0 U5 R - {/ D! c# X- w) d* x
- WSADATA wsd;
* L0 g2 ^7 B6 S8 l - SOCKET sClient;
) z) K$ L) [& q# M4 ^ - char szBuffer[DEFAULT_BUFFER];, ]# X8 ?4 `! a# v1 l: h
- int ret;
2 c" N' z9 d( i5 \# E" J# G - struct sockaddr_in server;
6 T) ]7 c! q# E$ Q2 K; [7 V - struct hostent *host = NULL;1 S& X4 {# r r0 q, P. S
- if (WSAStartup(MAKEWORD(2,2), &wsd) != 0)
; a! a7 H( m, s4 C* A0 y - {
7 ^5 t5 W3 I/ X/ {; S - printf("Failed to load Winsock library!\n");; S* {( A3 ]4 H/ R) N
- return 1;
# V* Z2 T3 q9 N5 h4 ?% s4 r2 \ - }9 G; ~( t7 b( u7 f$ H$ f
- printf("Enter a string to send to server:\n");
* d9 ]4 c- ^# Q R( `6 m' N+ r - gets(szMessage);
7 y( k' i7 `. V) | - // Create the socket, and attempt to connect to the server
, @: x: O+ P" t% o. q - sClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
7 J! E7 {& N( ]+ ~ - if (sClient == INVALID_SOCKET)4 p+ b+ ]3 T: g6 l, R
- {- D# K3 `2 t: z+ `& Q. Q9 j
- printf("socket() failed: %d\n", WSAGetLastError());' @6 X4 H8 L% y1 i6 D: I/ H" N8 U" r
- return 1;0 H/ C4 o- K3 o& R1 n
- }; H' b' [0 N' f2 E+ G
- server.sin_family = AF_INET;
8 x+ X3 i0 ?* T4 V* Y1 h - server.sin_port = htons(iPort);
Z% o5 d( f* Y* t - server.sin_addr.s_addr = inet_addr("127.0.0.1");
! Y Z( X0 b6 L- E! x" {& `
' ]/ ^0 y" i! b# S4 _- if (connect(sClient, (struct sockaddr *)&server,7 i. s1 Q, P0 w0 S4 U' I( N4 M
- sizeof(server)) == SOCKET_ERROR)7 g- S; }* f( f
- {
* f4 O+ i! d0 p4 i- p" m9 ^ - printf("connect() failed: %d\n", WSAGetLastError());- U2 h2 p0 T5 u+ G; X
- return 1;, B3 \" \/ j5 ?5 `% e
- }
7 {8 G) p) E7 l1 Z7 m) F" d - // Send and receive data
P! w- h+ z4 e- N' c& y - ret = send(sClient, szMessage, strlen(szMessage), 0);
" r7 W/ e* u# r - if (ret == SOCKET_ERROR)$ V/ S: a1 E8 i; a& [
- {
' K" U! g1 D# t2 Y6 c - printf("send() failed: %d\n", WSAGetLastError());
) h# Z. Z+ X6 x, C; G - }; J% r" f9 p9 b4 h# k
- else{9 f% T( k* J3 l& p- ?0 Z
- printf("Send '%s' \n", szMessage);
! W/ A7 M' { x6 N: O R3 N - ret = recv(sClient, szBuffer, DEFAULT_BUFFER, 0);
1 y% Z* Z: }: H - if (ret == SOCKET_ERROR){$ K+ N* o2 P2 |, P5 E
- printf("recv() failed: %d\n", WSAGetLastError());/ p% V' E: F: o. H+ n+ j) Y) B
- }
' D7 X$ w" S& j - else{& N7 Z+ R8 B. ]) n% {2 t
- szBuffer[ret] = '\0';
i' s7 w0 f& X, R4 u! a9 g - printf("RECV: '%s'\n",szBuffer);8 z0 R3 l1 M+ W% ^3 H2 d! ?/ U* X
- } W8 }1 r6 g. T4 w% J3 [! p# _
- }
6 v' Z/ p' o" i$ l - closesocket(sClient);
3 d2 B3 i; L6 e( @ T - ( U, h( r/ Y+ T& h7 U% g4 f) F A
- WSACleanup(); q7 Y; |4 \" q
- return 0;
9 ?1 r, C6 v; j$ R, S2 J k - }
复制代码 服务器程序:server.cpp
; r! F0 ~9 v7 K# V' d- #include <winsock2.h>
+ j; Q9 z0 m: u* q3 p - #include <stdio.h>
5 `! Y# l. D/ u( l7 E - #include <stdlib.h>
* A5 A. C7 T% y- N6 b9 Z! l - 5 |- q9 v( B3 z
- #define DEFAULT_PORT 51500 |, h* a3 F; F9 ~4 Z
- #define DEFAULT_BUFFER 4096
% a9 ?" Y0 R9 @1 t - $ G8 r( z# `7 c% `2 }
- int iPort = DEFAULT_PORT;& P2 X7 S. a6 u4 o9 I4 }0 M5 W
- char szAddress[128];
s4 \* h5 w2 L7 n0 ]- Z' ^2 c* W0 g
, s% ]3 ^( u: ]: S- DWORD WINAPI ClientThread(LPVOID lpParam)
2 B z' c- U5 d, E; f - {8 A) }# N/ B( r4 p* J
- SOCKET sock=(SOCKET)lpParam;
4 N2 c! }* i9 v/ U1 R - char szBuff[DEFAULT_BUFFER];0 J8 z8 Z. ], `/ r8 y2 j4 x
- int ret;) @4 Z; L1 E% Z' x! }; N( G
9 b5 D E/ t9 g& k: b! m7 C# A- while(1): U8 D6 g+ V4 m, M
- {
0 ?3 N* e7 n7 D$ z - ret = recv(sock, szBuff, DEFAULT_BUFFER, 0);
( N/ h# q' r% j& r" S - if (ret == 0)7 B6 Y/ f1 G. F% v0 e& ~( M
- break;
/ Q5 G1 r! h, m2 | - else if (ret == SOCKET_ERROR)8 G u9 a& N5 i* e6 f" d
- {$ x+ v- i8 p1 P$ o! i# G: ?
- printf("recv() failed: %d\n", WSAGetLastError());
7 ^& g7 ]2 n% n& X - break;
1 l. H* q& E5 w7 V; S3 v - }
$ ]# {7 q* Q; T% e- p0 D0 k - szBuff[ret] = '\0';7 s3 j" K6 o3 ~: X6 i! _
- printf("RECV: '%s'\n", szBuff);8 {. M) ~) J# }) y& x
- if(strcmp(szBuff,"abc")==0){
& F1 W, v% \9 h - memcpy(szBuff,"Send the correct string!",25);1 R6 ?% R1 _- Q. v7 C% f
- }
1 x; m6 c4 j* `: V G - else{
+ u( Z- e0 P! k# z# S& J7 ^% J/ L - memcpy(szBuff,"Send the wrong string!",23);
+ }& T: z* Q! B9 m& ^8 D$ t$ t - }
+ [/ I3 j( l. H0 t! b0 U - ret = send(sock, szBuff, strlen(szBuff), 0);; s$ V0 Q8 [: K& j& g3 u
- if (ret == SOCKET_ERROR){
2 m- S% Z$ v8 r2 N! m" ]+ B - printf("send() failed: %d\n", WSAGetLastError());
$ G1 w7 B7 S: {8 f; q9 f) o/ Q$ J - }9 M& z4 k: R% ?9 n- w, H
- }
, d9 F3 P) w. a5 V7 _# ^" S - return 0;
# f7 `/ ~# y6 T& F( l9 ^! U - }
( `4 Z- R/ u1 J5 H - % ]( `+ d% e3 M9 F. j) n" ^
- int main()
" _ z1 D% I( W U' S6 ? - {
* r+ X' V7 ]! c# [" V( l7 t' f - WSADATA wsd;
R! @( A3 l) C! a" p8 R% ~" k5 ^0 q - SOCKET sListen,, |( u0 G5 `0 a6 i8 v* m& o0 g- @
- sClient;
# ^. q* j* K1 O( j9 { - int iAddrSize;
* E9 ^ {6 }" l - HANDLE hThread;
' A6 U s& |% [" U' W$ l - DWORD dwThreadId;. l% N9 V- s7 [1 r" p
- struct sockaddr_in local,
& n9 Z F9 {- d+ k# k - client;) q8 ]* A! l+ h. e m
- 5 d9 q2 _$ t6 y, a @* i m
- if (WSAStartup(MAKEWORD(2,2), &wsd) != 0)* L3 o9 ]" _' @# c
- { w; T$ @# J7 J) s0 v, M
- printf("Failed to load Winsock!\n");
. P1 V* A" E8 i) i4 ]8 q/ v - return 1;; G0 C7 j3 [& l- l+ j2 r- O4 ~
- }$ \3 S1 ~) q% V R/ D: }1 q( z
- // Create our listening socket; v3 v7 i; o8 l$ o) }, W
- sListen = socket(AF_INET, SOCK_STREAM, IPPROTO_IP);
4 \6 n0 o6 x9 k+ b5 ~- G% R - if (sListen == SOCKET_ERROR)
5 V$ `2 n9 T6 s/ p* @6 X; w1 w - {, j: [. O4 m* j
- printf("socket() failed: %d\n", WSAGetLastError());
% U" D' R4 v4 {: T5 \8 T$ _: N - return 1;$ W/ w' e8 G. `( p/ x
- }' W1 X' t9 \4 ~) l9 \9 D! Y
- local.sin_addr.s_addr = htonl(INADDR_ANY);1 Y; c5 K& X% }
- local.sin_family = AF_INET;) s% y& Q% N' }8 l4 G
- local.sin_port = htons(iPort);1 F; v6 f- i. r8 g V; E
9 a: P8 U- N# w+ I, u- if (bind(sListen, (struct sockaddr *)&local,- ^! [, r% Y3 G9 E
- sizeof(local)) == SOCKET_ERROR)( J8 s& @' N' L- x8 f9 N
- {) ^/ Y! S7 ~8 h! v
- printf("bind() failed: %d\n", WSAGetLastError());
2 D) }. w& T! H! ~6 Z - return 1;
! v" W" C$ h' V) ~4 E4 o - }5 f) [0 V$ c* B9 W6 d. Z
- listen(sListen, 8);
1 \. ?" |; M0 P7 V - // In a continous loop, wait for incoming clients. Once one/ S$ ?4 U4 b, Q) R1 C- _+ {
- // is detected, create a thread and pass the handle off to it.
: x, c9 ?7 x7 F - while (1)6 e. C* S: g8 _5 l0 f4 w9 ^% A
- {
5 F0 ^: S; W; d. V7 S) {, C1 X' { - iAddrSize = sizeof(client);
: q( G( r: P C* k( d4 y$ P5 F; b3 n - sClient = accept(sListen, (struct sockaddr *)&client,
! O$ D$ u3 u& q2 K! a. Z - &iAddrSize); " d6 C! s6 Z+ h+ j% J( d0 N
- if (sClient == INVALID_SOCKET)6 W/ E: _: b: s: _) P& v
- {
1 O* [8 T6 c, b) s - printf("accept() failed: %d\n", WSAGetLastError());
2 }. J. t* Y. D6 b7 s/ j - break;+ n3 o: Y" X" X) l6 x+ ?% ?* A
- }
5 Q; L& m5 L$ ]! c/ ` - printf("Accepted client: %s:%d\n",4 E$ k; V3 E1 k* ?# O- z+ \
- inet_ntoa(client.sin_addr), ntohs(client.sin_port));
! h; f8 K: K8 v" {- ` - ) }6 D' }# a; p9 ]: x+ H
- hThread = CreateThread(NULL, 0, ClientThread,
' I. W5 F+ X; H - (LPVOID)sClient, 0, &dwThreadId);
' H4 X! W. _ ~. _4 K6 K - if (hThread == NULL)4 C7 O2 h" v% J
- {
, k% a- N9 v+ S& T2 ^ - printf("CreateThread() failed: %d\n", GetLastError());& S- a. d9 d5 U5 S
- break;: E, O( R" R9 q
- }
# }# k3 s7 Z. P5 R9 p - CloseHandle(hThread);
) R# z' o' Z1 V+ E4 V - }+ r9 j6 E- U& t
- closesocket(sListen);
/ {5 N2 I' l0 n" f0 s1 X; [ -
' D* b' a! Y ]+ F - WSACleanup();
6 S8 I9 p& r6 k1 f( N3 M4 } - return 0;
- ~; x3 _9 H* D: C8 B! |1 r; v - }
复制代码 $ u# { N' L5 J( \# U& j) l
6 L) O/ n; _& E8 z0 w
! j* P: X* T, B3 U
' k9 E% y( _2 J
# Z& O E+ e2 y" F
|
|