管理员
   
论坛积分
分
威望 点
贡献值 个
金币 枚
|
程序很简单,windows环境下的,客户端和服务器程序都在本机运行,在客户端输入发送给服务器的字符串,服务器收到字符串后会打印出来,同时与"abc"比较,与"abc"相同就会返给客户端,输入的是正确的,不同会告诉客户端输入时错误的。- W/ C3 x. x' v6 b9 I }) {
客户端程序:client.cpp
: Z% \8 @+ B; {1 o1 o7 b- #include <winsock2.h>
9 f# W4 G5 o$ s1 r7 U) z6 N1 o - #include <stdio.h>% a( _. L, T4 f& R
- #include <stdlib.h>4 A+ S/ w& p; K3 O. T+ ?! r
- T0 j4 T1 @2 E6 Z4 }1 g. G
- #define DEFAULT_PORT 5150
6 Z6 g# B# Q4 Z% |; V - #define DEFAULT_BUFFER 2048
7 ]% |. |( o9 o9 Z1 @9 g - - q" I0 z1 }+ f1 k, b
- char szServer[128],) }' \. w1 ^" c9 w# G
- szMessage[1024];7 y" h/ v- m) g) z' c
- int iPort = DEFAULT_PORT;# t5 ~ C$ i N/ f3 Y% i
/ d' a; U0 F: }- int main()
9 Z. {" q- l _/ P9 v - {
( l/ U) s/ A; |5 n3 p# h$ Q4 d - WSADATA wsd;% i/ R# `* h: T
- SOCKET sClient;
, U: O1 i) A0 o4 R2 k1 P( ~ - char szBuffer[DEFAULT_BUFFER];
1 m) n: v+ v) ~- W# t: z$ w) p" Z - int ret;6 D8 ^0 J9 h: O* t
- struct sockaddr_in server;
; K+ y" _* b' u+ n, w2 S, v+ ?% r - struct hostent *host = NULL;8 W- T1 k4 C/ r3 E
- if (WSAStartup(MAKEWORD(2,2), &wsd) != 0)( w, n+ ]2 k5 C( r4 R. ]
- {/ |- H+ n" I. ~! ~; L
- printf("Failed to load Winsock library!\n");- u; i! N- J4 @2 }4 K( ^+ t
- return 1;, v. u6 j$ z5 k
- }/ A3 m* E6 ]4 `% } O& x" N. O
- printf("Enter a string to send to server:\n");
/ r: i% z ^/ }3 S" G0 x - gets(szMessage);6 G6 E( P N( _8 ~! @' T
- // Create the socket, and attempt to connect to the server
2 o# T; @+ E1 [ - sClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);$ D7 q8 L9 k2 I" }4 h2 B
- if (sClient == INVALID_SOCKET)/ @0 ]( g. w2 c0 L4 O2 {
- {
* g0 n4 a; z, q - printf("socket() failed: %d\n", WSAGetLastError());0 i9 J7 n. @. ?2 F7 Z
- return 1;
9 A7 y1 W7 s% o; P% z - }& n# c2 P. f6 ~' v) G) W3 g6 p
- server.sin_family = AF_INET;, F( h ]3 I; k; A
- server.sin_port = htons(iPort);$ C9 {/ ^. e! L ?$ P, P8 }, {+ _6 C
- server.sin_addr.s_addr = inet_addr("127.0.0.1");; Z4 P! l: f! j& T# p: S
- 0 V4 B9 G( d1 `2 N8 @0 d
- if (connect(sClient, (struct sockaddr *)&server,
% `* @9 V* z8 }% d - sizeof(server)) == SOCKET_ERROR)/ u( K. d' K# Y1 ~1 O7 {
- {! d* S& z4 Y0 g+ ~
- printf("connect() failed: %d\n", WSAGetLastError());4 F ^% b0 P1 J; ]# q% @ C
- return 1;6 v! u2 R8 R# R( b
- }
+ ]9 R! k& F0 Y - // Send and receive data
$ \& G, G0 q. O6 @2 y8 H" B - ret = send(sClient, szMessage, strlen(szMessage), 0);. p }0 ?; ^+ E* @( g
- if (ret == SOCKET_ERROR)
) L' d8 x5 Y+ F: v - {
4 m5 h; s, S3 r4 j7 R p - printf("send() failed: %d\n", WSAGetLastError());& S5 C- w# H- L( J' w
- }
C/ u1 a8 \/ o. p - else{' |/ o- C, l* G% z
- printf("Send '%s' \n", szMessage);' _8 ]; K% e! Q q
- ret = recv(sClient, szBuffer, DEFAULT_BUFFER, 0);7 I& T& P) f9 _3 P+ _
- if (ret == SOCKET_ERROR){
' N1 Q& r% x' ^ - printf("recv() failed: %d\n", WSAGetLastError());
! Y N5 K$ `6 q3 J) l - }; Z+ N8 y+ V- k, o O. t: l4 a
- else{
# N3 _# h7 }. v$ W3 U0 y - szBuffer[ret] = '\0';
* |; V& `( \' r3 _0 d* b& s; _6 k! d - printf("RECV: '%s'\n",szBuffer);
7 x6 N0 J0 o( a/ `3 [. @ - }
* t7 ~ ^, x- r* z - }. j3 W. g7 c" s& n+ d8 g
- closesocket(sClient);+ \1 m9 f. ~- y/ z
- # ?' g, m4 i7 P0 Q
- WSACleanup();- ~# u; ]; G( o# N
- return 0;% l% W. {2 m1 h, q9 S1 `5 t
- }
复制代码 服务器程序:server.cpp
, ^9 D J2 T: A h" A# K/ L) J- #include <winsock2.h>
) m/ o% M: E0 o - #include <stdio.h>8 u0 m2 d; Z4 b: n" h. Q. E
- #include <stdlib.h>9 y! _# g; L' \5 e, s+ Z
- 7 h f& V9 S+ X, w
- #define DEFAULT_PORT 5150
# a# X0 V6 G; M0 e; A) Q - #define DEFAULT_BUFFER 40964 K: V6 q. U" w+ K
2 c& S/ v1 U/ j+ ]: \7 v1 _* T" e- int iPort = DEFAULT_PORT;
; D6 w' x7 s) P9 }6 ], ~ - char szAddress[128];
/ \% F" E K! c n
) `% W7 R1 ~" ]* X. H3 U- DWORD WINAPI ClientThread(LPVOID lpParam)
. a F/ i& F# E: t/ X* s+ ` - {+ x: j% q! g# U* ?# u8 X5 J( R
- SOCKET sock=(SOCKET)lpParam;3 V7 t0 h1 z/ m/ }, m S
- char szBuff[DEFAULT_BUFFER];$ T9 r. N1 A w* Z, s! a
- int ret;, d! X* C* h+ I# m$ V; S! C
& M8 A6 {' Y) J& F8 B- while(1); z" M' o* S8 |; I" K7 H& Z' \
- {1 [: J# z$ C! F! i, ^6 o) X
- ret = recv(sock, szBuff, DEFAULT_BUFFER, 0); N5 O& |; n- {6 f2 l; J& C
- if (ret == 0)1 j# s* l. |2 Z
- break;
+ `# h. X4 p2 f - else if (ret == SOCKET_ERROR)0 U, ~, i7 H$ k; |0 L6 W2 I( d
- {
; W! c" J' y' F, e - printf("recv() failed: %d\n", WSAGetLastError());: C. n2 s+ M% p3 F
- break;
2 W# C' y/ {, e6 v' Y/ A+ ~ - }
3 \# }+ n8 f: b3 b9 \ - szBuff[ret] = '\0';
1 @: @" C7 m! ]3 n - printf("RECV: '%s'\n", szBuff);; F! v. j K3 g. @% b( Y7 `/ b
- if(strcmp(szBuff,"abc")==0){7 \! S2 {! j* ?
- memcpy(szBuff,"Send the correct string!",25);- @1 i$ Y; b& c8 U
- }
( O( W, N& y5 [3 S! H* M1 E2 r - else{# M9 l3 j, j$ |+ K1 ~. H
- memcpy(szBuff,"Send the wrong string!",23);! n) c, D- i( m% ^
- }
3 E5 s, V# q8 o - ret = send(sock, szBuff, strlen(szBuff), 0);7 _& a: C- z- Q
- if (ret == SOCKET_ERROR){
5 W2 G; Z8 W: }) G$ `- Z - printf("send() failed: %d\n", WSAGetLastError());
4 n" D6 u/ E! y: M. i" z - }2 r8 i- N! X' @ O- ~) C
- }
& l6 b' |" L U* X/ N - return 0;
9 ?" |; u3 G! Y$ v - }
$ e) w _0 y; @* Z. ] J
0 p, z5 d# U2 [% B4 ] p- int main(): r% q& S5 W9 D# [+ f0 K* J2 U- ]0 D
- {2 O' A! @/ k. T& ]0 z: w1 t
- WSADATA wsd;
, ?4 i" A8 A7 U7 u4 G8 x! Q' t - SOCKET sListen,6 ?, y$ S8 m7 L0 }
- sClient;
' f6 z9 |# U) `4 f - int iAddrSize;) r/ T" g. f' Q' Q; ]
- HANDLE hThread;
$ U" n" e1 Y& @1 o - DWORD dwThreadId;' q p5 E* z1 K5 g1 v: m
- struct sockaddr_in local,
9 `' E" ]+ V, \5 Y - client;
! p7 o! @7 B5 ~5 ]( `) G7 u$ \ - 4 v# e& e8 l& A% T' C
- if (WSAStartup(MAKEWORD(2,2), &wsd) != 0). |7 N% T3 t. L4 S. D$ q+ k& s
- {8 e2 Z2 E0 r" t8 j4 x7 F
- printf("Failed to load Winsock!\n");5 y- _9 M8 }- r
- return 1;. }; T! F, y7 k$ f4 }3 u! x
- }- J( A; ]2 N5 {% Z; r0 v/ K8 D. V3 Q
- // Create our listening socket
8 Z# v6 ]: {% P" I6 @$ y7 `. t! m - sListen = socket(AF_INET, SOCK_STREAM, IPPROTO_IP);) A7 H6 o- s8 p& ~- v+ ]
- if (sListen == SOCKET_ERROR)2 h2 Y1 p& X5 ^# m6 Z0 C( _+ A: o
- {
$ g- \( t. `7 q3 \( h - printf("socket() failed: %d\n", WSAGetLastError());/ n; n/ [# o& ]( u/ O t( q$ y
- return 1;
& p7 P& I) e# ` - }
) `' w3 E6 Q+ j7 N( p9 Q! v& d; m - local.sin_addr.s_addr = htonl(INADDR_ANY);1 b; b, C( S' U3 G0 {
- local.sin_family = AF_INET;+ H" w) B8 y( X/ V u! L0 w! P, ^
- local.sin_port = htons(iPort);
3 }( Z- N. P8 _& w1 T% K7 f - ) n' ]- A" I; x: q
- if (bind(sListen, (struct sockaddr *)&local,
; e( b! _, j% x) Q; z0 x4 m - sizeof(local)) == SOCKET_ERROR)
7 q2 q u* T# g, V5 \- J8 x2 H8 ~ - {
. U6 C3 s$ C! J - printf("bind() failed: %d\n", WSAGetLastError());
7 ]" l9 `0 Q6 w$ A& w - return 1;
$ T* b* G1 b0 ^& X# G - }
# @$ n3 S# y9 y+ z - listen(sListen, 8);
, d' M/ ]" h7 r - // In a continous loop, wait for incoming clients. Once one
( e' |/ P$ D- I) | - // is detected, create a thread and pass the handle off to it.: A) y7 |" G2 Y" U% l3 G
- while (1)" _2 d7 E, _, `( O6 e9 s
- {6 a: H3 R; I. O# B! g0 l
- iAddrSize = sizeof(client);
6 V K: \* `3 x$ v7 G M - sClient = accept(sListen, (struct sockaddr *)&client,( Q- U& d1 \5 x z+ a* A, r4 }+ \- l" P
- &iAddrSize);
' q4 d) m" d1 ` - if (sClient == INVALID_SOCKET)9 T3 _4 y, n6 m6 y
- { 0 J* ]/ z2 I q: N
- printf("accept() failed: %d\n", WSAGetLastError());
* ]! ]1 p4 \7 R/ s% M* ~) N8 J - break;
: _, |- P* S2 v( C - }2 M0 @ r& V( p8 ~
- printf("Accepted client: %s:%d\n",
3 A+ H- ?& V! z0 N) J$ X$ {/ L - inet_ntoa(client.sin_addr), ntohs(client.sin_port));: k" q: ^: o7 K3 O1 k' ?) b
4 P$ c* a: S- O& x7 G; b, f- hThread = CreateThread(NULL, 0, ClientThread,
) E- Z9 P% F5 Y; }; D0 J# Y - (LPVOID)sClient, 0, &dwThreadId);. W. A) H% ]) d- N
- if (hThread == NULL)
' \& r. U, z+ f4 h - {
% z# B: s/ L) h! P - printf("CreateThread() failed: %d\n", GetLastError());
# c: s- P0 P* h2 q5 ?6 G - break;
+ h2 j( v& A( b b4 f* M; r. b - }
5 c* _ J1 l4 X' t! C( R$ n - CloseHandle(hThread);
* N( P9 S" S$ @4 T. e" |3 u - }1 Q" a) w4 `2 N# T( ?
- closesocket(sListen);
* r1 Z! g5 a- w* S4 |4 Z1 z -
/ m* T7 O# i L, n - WSACleanup();
5 X- E; K. b8 I% u+ a- t - return 0;. e' P _5 X+ n! Q% m1 C2 P9 S
- }
复制代码
8 {# {! r& V, ^7 L9 h: f8 w
}% c9 s. E0 Q1 j! r' ]$ o1 J+ V& W0 @+ f
8 u# \) y5 Z" Z9 M& [
7 N, I$ n L7 c& H5 T! r0 v |
|