管理员
   
论坛积分
分
威望 点
贡献值 个
金币 枚
|
程序很简单,windows环境下的,客户端和服务器程序都在本机运行,在客户端输入发送给服务器的字符串,服务器收到字符串后会打印出来,同时与"abc"比较,与"abc"相同就会返给客户端,输入的是正确的,不同会告诉客户端输入时错误的。( ]3 V4 S( I, @ w4 X+ P
客户端程序:client.cpp6 p4 a0 F* k+ ?' b: @" R! s
- #include <winsock2.h>
! ^/ {; x- J) x* \7 ^$ [ - #include <stdio.h>3 Z' y6 ~# y, F5 c
- #include <stdlib.h>6 h1 N- T0 ] I( I: _
- 1 ?* _2 A( H3 W! }) k
- #define DEFAULT_PORT 5150
: U$ n z9 j( R: g l/ N - #define DEFAULT_BUFFER 20482 p, y, Z) ?! B- y( s9 ^7 s
- 9 U, ~$ B9 b- k7 {+ y
- char szServer[128],
" K( n5 w: O T' s4 \ - szMessage[1024];
/ N4 v4 w9 E4 J( U; F7 z- | - int iPort = DEFAULT_PORT;) o. i7 U5 y0 t8 z; P- G# C
7 [; N: S/ U/ ~* I- int main()
3 R7 r2 R5 i9 i8 q" L - {
5 m7 ?5 P5 T1 n' d - WSADATA wsd;) [. b) J6 A" h: I+ [
- SOCKET sClient;* C, x7 T2 b, h; h! M7 P) X
- char szBuffer[DEFAULT_BUFFER];
* `6 m6 P+ f A v% Y9 t - int ret;/ h7 u; {# W5 V: T0 b/ B
- struct sockaddr_in server;
2 E0 p: B b1 z$ }( b+ x3 O( o - struct hostent *host = NULL;
+ A0 p: ?. E; p - if (WSAStartup(MAKEWORD(2,2), &wsd) != 0)0 ^! T6 h& E; ?( u; s$ y
- {
/ W# q( r6 F8 ]! D$ Q+ h( |' B& [/ T - printf("Failed to load Winsock library!\n");! ~ d- a6 D# V2 }
- return 1;
) k$ [1 C3 Q" W$ I h - }
( O8 V) x) K) E. s( L - printf("Enter a string to send to server:\n");
1 C* {/ o2 w: k q" |, J; L - gets(szMessage);
" l7 t0 O7 S) l( ~. E# r* g - // Create the socket, and attempt to connect to the server
M) t$ L) x- ]3 J7 ^8 q) S - sClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
5 S2 V S t) M- w$ K+ U - if (sClient == INVALID_SOCKET)0 {% g! [! {7 I1 {
- {
$ a$ L8 q ^7 `/ q! Q - printf("socket() failed: %d\n", WSAGetLastError());# ?5 G% d& ?- F) s: d \( j1 t
- return 1;8 j& |4 I7 q7 Y
- }2 u* J2 g- I. k6 _* W8 q# R' }+ {
- server.sin_family = AF_INET;
/ h1 _% _$ U8 ?. @+ s+ A - server.sin_port = htons(iPort);
A3 ~0 y; _+ t7 K4 i/ K* v, [9 c - server.sin_addr.s_addr = inet_addr("127.0.0.1");) k, A8 B" t8 V/ l% O
4 r, |3 {( M1 L9 [% Y- if (connect(sClient, (struct sockaddr *)&server,1 `' T$ g6 ~% L9 |
- sizeof(server)) == SOCKET_ERROR)
1 w: l: a7 J# V( S - {; ^5 `4 p& K9 O
- printf("connect() failed: %d\n", WSAGetLastError());$ v* V- W& b# Q- ^0 Z: q4 p3 C
- return 1;
+ l$ Q2 h2 L8 f/ e( _ - }! C' Q* O0 g$ ~: X6 `+ K' R2 `
- // Send and receive data# ]7 O/ V& F0 {2 [* ]1 `
- ret = send(sClient, szMessage, strlen(szMessage), 0);: n/ O% s3 r* M" s7 I
- if (ret == SOCKET_ERROR)
% j' E- t+ f, e6 Y, c+ _ - {
. Y- q* Y: S+ _2 A - printf("send() failed: %d\n", WSAGetLastError());% F$ V7 o: w! p) k5 S! N
- }2 {- V" M* W6 D4 i
- else{; q( v- G3 @# d% o7 R
- printf("Send '%s' \n", szMessage);, C/ z4 r. q& e( p0 e0 Z" D
- ret = recv(sClient, szBuffer, DEFAULT_BUFFER, 0);
4 B7 q4 |/ W+ _$ S* N - if (ret == SOCKET_ERROR){) W1 ]7 o4 l* p* |, K4 N! w
- printf("recv() failed: %d\n", WSAGetLastError());1 B+ G+ z$ V0 l& b# ]: N3 y7 `7 N$ t
- }: _, M* [9 J* S* S
- else{
! T1 E/ }1 a: m' F' E# ?9 S. N - szBuffer[ret] = '\0';: q: A P, r# `5 i2 T1 h- x
- printf("RECV: '%s'\n",szBuffer);
- o: l$ J" s& e4 J - }% v, H; f" u k P. G
- }
& L* r0 F1 J' q$ r' [4 g+ M - closesocket(sClient);
7 q6 y# R1 O4 \' }" C* d+ F2 ?. _ - 3 u: |* E; p& c3 D" G7 i9 s
- WSACleanup();
( |, f s) V; e) q; i/ V - return 0;
* Z& S! B0 J. J" O& D- v - }
复制代码 服务器程序:server.cpp& F a Q- L' Y+ ~" u
- #include <winsock2.h>
* |) ~. w9 W3 {- K; ?8 [ - #include <stdio.h>
# m- ~+ J# {2 h - #include <stdlib.h>
% Q. U+ D" N1 U& Z8 G - 6 z* [. g# f+ q* _" Y
- #define DEFAULT_PORT 5150
1 n3 }2 f* R" ? - #define DEFAULT_BUFFER 4096
5 I& ]- R' s+ Y- _$ t( M% e
! e, P6 ]! {. n( j# B+ R- int iPort = DEFAULT_PORT;. G7 K- x; l/ U2 W1 w8 {
- char szAddress[128];& K. C* D1 k1 g. d4 g6 ^7 v5 t
3 V& d$ u! q8 N7 K: F- DWORD WINAPI ClientThread(LPVOID lpParam)
7 c. I$ a: B" P( F9 Z" O - {! ~! a( C+ Y0 B
- SOCKET sock=(SOCKET)lpParam;; U% F. A1 g2 `
- char szBuff[DEFAULT_BUFFER];7 N" k1 J- g5 B9 i. m: V# c
- int ret;" J) G, p3 s4 X+ ~
- G+ g2 r$ z, b
- while(1)
! A. h S( R3 b+ X# P; f - {* V' U7 ]& G" N, f2 p' l
- ret = recv(sock, szBuff, DEFAULT_BUFFER, 0);+ W2 g1 H6 W- Z" v
- if (ret == 0)
& e; w7 _5 ~+ `9 r& s- E. u - break;
& |# f" M9 A$ g$ B. D7 l7 _ - else if (ret == SOCKET_ERROR)
9 N% c9 j9 o" R: ~# g/ y - {
, C- H* f1 J) W1 b8 b5 O) N - printf("recv() failed: %d\n", WSAGetLastError());
+ `) F" w7 Q9 L- A4 g - break;
8 a& o$ _. F( r5 a7 Z - }
* A0 ^: v! r8 U+ v$ e/ T# Z: r" o - szBuff[ret] = '\0';
, |( o8 g& Q; I% U' H - printf("RECV: '%s'\n", szBuff);
+ s% Y2 a0 H3 O' u1 a8 o - if(strcmp(szBuff,"abc")==0){& @9 }! S' r0 I
- memcpy(szBuff,"Send the correct string!",25);2 M# b# g8 t$ H2 D: p
- }% V' }' r, ~$ z v
- else{
4 x0 W; X5 |. z1 S, T, B - memcpy(szBuff,"Send the wrong string!",23);; I# c* }7 }0 ~7 t
- }0 d; u/ i( u5 S! T* U1 N# ~* c
- ret = send(sock, szBuff, strlen(szBuff), 0);
6 Y8 N B( u* C& h/ f. K, V, f9 q - if (ret == SOCKET_ERROR){6 I$ v( C; H% {
- printf("send() failed: %d\n", WSAGetLastError());* U( e l) Z- P" B9 p
- }
# ]# q* S* C7 I) o0 M - }
, @( V2 q( d* O0 e0 F0 c h - return 0; e, H1 s \ z7 ]$ o$ p
- }9 r* D7 K2 s3 {3 D
$ T& T# a4 `0 D) ]- int main()
6 O" [9 V/ B7 ]' s. X - {
9 r2 m8 z3 u0 Y+ e3 [. j2 d/ P - WSADATA wsd;
: e, J$ x1 z g9 M) M, v8 V; a - SOCKET sListen," n8 u0 ?3 ?# ?; B3 L3 _
- sClient;
0 M, N: q% L: c9 a. [% ?* `6 A - int iAddrSize;0 P' a% v* u3 {+ f% F& A
- HANDLE hThread;# O& V: h2 ]4 }% S1 M' g
- DWORD dwThreadId;8 ?* s" ?. w! F: M o( `: G+ v0 [
- struct sockaddr_in local,: u( ~, d) I6 W3 K/ I
- client;! q% I' ]# T& L) m7 P4 y
' O3 k, C5 Q! H9 I) |8 o; {: B! Y: i- if (WSAStartup(MAKEWORD(2,2), &wsd) != 0)( r, I4 B6 ?0 q* E* C2 S
- {; b! u4 ]) z4 S/ Y7 | Y2 {6 m
- printf("Failed to load Winsock!\n");' w/ P: \/ B8 V% @' V
- return 1;8 S8 X1 K9 j; J) d0 J3 `; h
- }
0 b- i; Z+ \+ c1 o - // Create our listening socket+ I- D+ H! @/ X/ G$ X3 q
- sListen = socket(AF_INET, SOCK_STREAM, IPPROTO_IP);
3 K/ C6 [% F9 M, k$ i - if (sListen == SOCKET_ERROR)
1 N- n# O! M+ I4 m; `6 @ - {2 O) n; j' q; Z
- printf("socket() failed: %d\n", WSAGetLastError());
6 q& W0 E' D" ^6 Q+ C3 ^. R - return 1;+ M; D! d( P' u+ ?. J5 k
- }
8 A2 A* s; B) x8 ~$ X - local.sin_addr.s_addr = htonl(INADDR_ANY);* _/ E2 a0 f$ w! N" x0 c# H
- local.sin_family = AF_INET;( X# c! _$ J3 l5 C: [" ~; X1 s4 u
- local.sin_port = htons(iPort);& f: F- o& O4 i% [. ~
! K7 D. k' w2 g# [* F- if (bind(sListen, (struct sockaddr *)&local,2 O5 a+ U- Q) Q5 u# H+ t( h
- sizeof(local)) == SOCKET_ERROR)
# l% N4 I! N0 q* o# x - { V, d3 f, O* p3 L& f: |7 t0 d* C
- printf("bind() failed: %d\n", WSAGetLastError());* V/ w: n7 M3 E. D7 \
- return 1;
! ^% `+ u, l) X; j. r" H - }8 {4 J3 g0 t* }+ S
- listen(sListen, 8);
, n' [* D" M) F1 r# F2 [ - // In a continous loop, wait for incoming clients. Once one1 b( }* y+ J$ R z
- // is detected, create a thread and pass the handle off to it.* Q& O' |/ k* _
- while (1)
1 c( R4 K, G3 B# q+ l/ u$ ? - {& Q$ P% [. S6 m h3 O/ G+ T# u- I
- iAddrSize = sizeof(client);5 D9 V- ^5 ~( t" Z3 R4 a
- sClient = accept(sListen, (struct sockaddr *)&client,
8 C- t8 n7 N* `! G6 u - &iAddrSize);
& c, V* w# i. C! N4 v5 w& B - if (sClient == INVALID_SOCKET)
3 T3 a- b/ q: J1 }: o1 ~% | - { 8 a8 i3 o8 N9 \ j! H$ ~
- printf("accept() failed: %d\n", WSAGetLastError());
& `+ y+ h8 C' {* \6 w/ L& x2 C - break;! v- M O# g' s$ t/ c+ G% x
- }
! d3 t8 d; M8 l7 U+ Y( U - printf("Accepted client: %s:%d\n",
) ]& B# L7 P& U, C8 q - inet_ntoa(client.sin_addr), ntohs(client.sin_port));! e" [6 j" H* i6 w1 W0 Y+ r
- , t0 { D% K. w6 k7 ~
- hThread = CreateThread(NULL, 0, ClientThread,
- R9 M/ e+ Y8 Q% f7 y$ g# r+ v+ T - (LPVOID)sClient, 0, &dwThreadId);
1 r# u; @$ v* a2 Q' ~3 {3 x - if (hThread == NULL)( ]9 _/ j7 h- Z; J' I/ E) ?7 R7 Q
- {& c6 B, E, @ T: Z7 | |4 Q3 W4 e
- printf("CreateThread() failed: %d\n", GetLastError());
; F7 p8 ^4 u4 E. E, t6 k% R' ^9 H - break;7 z+ @2 g& p4 x r
- }. ?/ U7 n" z+ B3 C: k
- CloseHandle(hThread);' l( t2 l/ z3 x' q/ b, f: t: Y
- }" |, ?% s. b4 H: v5 `
- closesocket(sListen);
- `8 W: w/ a7 s* y& C -
7 a. O6 `9 p) S5 v( Z9 ? - WSACleanup();
Y+ V4 R' p) y5 @: j - return 0;% E/ ~8 ?: H1 }
- }
复制代码
3 l* ~' J8 T+ S) f0 J0 s
" E, c7 Q y# k9 B! d5 q2 @6 `
$ e7 s3 h ?5 V: D, B" r! Y2 J
2 b* [( J- J" t% `
* z) M. `7 N) ~+ V |
|