管理员
   
论坛积分
分
威望 点
贡献值 个
金币 枚
|
程序很简单,windows环境下的,客户端和服务器程序都在本机运行,在客户端输入发送给服务器的字符串,服务器收到字符串后会打印出来,同时与"abc"比较,与"abc"相同就会返给客户端,输入的是正确的,不同会告诉客户端输入时错误的。
, N9 I! s% ?! g6 r1 U客户端程序:client.cpp1 u8 O% k: {0 m
- #include <winsock2.h>
8 O: E$ I% L" W+ C" e: g, u - #include <stdio.h>
3 S1 a9 b) h1 T% D9 z - #include <stdlib.h>6 z: O4 Y$ |! a/ J! k
- - V" |" ?. J* r, @. K1 v4 p1 V8 d! J+ P/ ]
- #define DEFAULT_PORT 5150
+ x" U# p* ~* E, F - #define DEFAULT_BUFFER 2048
" j. }% y& H; z! x - 0 g5 c1 Z; @: N+ j
- char szServer[128],6 q( }. x1 t8 ~# e* o8 e
- szMessage[1024];4 \; @* S2 h5 L X! [3 ?
- int iPort = DEFAULT_PORT;, [9 J' p7 Q2 `% V
- 8 j+ l4 l# Y I9 t, T: w4 \
- int main()
6 ~' w; h' Y- o" T5 M% |7 F' w# V - {
7 I9 E& f* q1 Z& D - WSADATA wsd;
6 L# w. S! A8 ?2 V' G, T% i; Y - SOCKET sClient;
P4 E, _0 J% E) H- }/ ?: x - char szBuffer[DEFAULT_BUFFER];
: f n+ Y( Z; O, x { - int ret;
/ t: E t$ H. z( Y - struct sockaddr_in server;' Z5 U0 U* i1 Q/ p' T
- struct hostent *host = NULL;
* c7 n# `! S, B! j7 v. v - if (WSAStartup(MAKEWORD(2,2), &wsd) != 0)
5 A7 U. D7 q7 b) w/ J - {
' N ]" ^# f* l* x) j- P - printf("Failed to load Winsock library!\n");' z- D( C" Y" a8 j4 }8 f& e
- return 1;
$ |, D; ^( j2 ?1 k9 }) X6 p9 s3 M - }
4 G# q- X& W: j* {+ J - printf("Enter a string to send to server:\n");
- E: p6 M& k' K* g: m" S - gets(szMessage);3 i8 l6 |9 I/ o% {
- // Create the socket, and attempt to connect to the server
$ |; U7 x- P$ q, F0 | - sClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
9 a4 l- Y$ i/ t5 G* S0 ^ - if (sClient == INVALID_SOCKET), j# V# g2 h$ ]* n0 l. v; u' R7 h
- {
( y; N. }# v4 f6 I' p - printf("socket() failed: %d\n", WSAGetLastError());
/ `1 I T4 p' Y5 {1 I - return 1;
$ p" g5 y3 {9 I - }4 Q2 m0 y! T& a
- server.sin_family = AF_INET;
& y! j, F, |* [ - server.sin_port = htons(iPort);
3 e& m" t) o7 `; w* C+ V+ {- N - server.sin_addr.s_addr = inet_addr("127.0.0.1");
' I9 s# @- y2 r3 k - 1 D( E$ a% o$ @! T: c
- if (connect(sClient, (struct sockaddr *)&server,
, N1 B; z( E" w2 x7 J* l - sizeof(server)) == SOCKET_ERROR)8 M# j; q/ C3 ~8 G' B
- {5 E2 `( m" k2 h+ m+ F" k6 w
- printf("connect() failed: %d\n", WSAGetLastError());
* ?# _1 Q/ S5 M* D# I0 ?2 Z2 V9 u - return 1;
: W. r1 \: e% d: c, O - } L4 W' E7 h1 w' x# d
- // Send and receive data
/ e' r# T$ d0 w; ~" R - ret = send(sClient, szMessage, strlen(szMessage), 0);6 b1 I3 g2 e2 ]/ P1 H8 ~* N; o
- if (ret == SOCKET_ERROR)) e6 @5 x d, r- ]4 G
- {/ _* L! a& s3 `/ T, Y& K- a
- printf("send() failed: %d\n", WSAGetLastError());
; I x% C# L! n/ U, Q - }
' R5 }+ s2 b4 g) }! B - else{( V4 V. J; V5 X& W/ N) n
- printf("Send '%s' \n", szMessage);
- }9 E i- r; T- |3 N# n6 H! c - ret = recv(sClient, szBuffer, DEFAULT_BUFFER, 0);
* E. ]" @5 _- n- c - if (ret == SOCKET_ERROR){4 Z3 o/ T0 M/ p; W& T0 S) _( a
- printf("recv() failed: %d\n", WSAGetLastError());8 y+ | p3 q. l. O! G7 I0 K
- }
) Y3 {6 q8 z7 E6 z( u% ` - else{+ |: O4 k5 H2 t* y
- szBuffer[ret] = '\0';7 L% O. E5 p3 l4 A! o7 l5 c! i: ]
- printf("RECV: '%s'\n",szBuffer);
: R9 o' I) p7 U) t% } - }! v: m3 k, a3 [5 y4 M: I
- }5 o; f. T% o# @2 T$ v& S6 x9 d6 @
- closesocket(sClient);
3 `$ W: S' u# @
6 g/ Q( d/ W/ g4 _- WSACleanup();
- {: F' |4 o3 U6 x/ l6 z1 T - return 0;
% ^+ I9 B- p" l' H7 @, Y/ c; r - }
复制代码 服务器程序:server.cpp7 x8 N, N! {0 ^( e0 m/ Q) N
- #include <winsock2.h>
( B0 }# O2 ~, `9 v - #include <stdio.h>6 O5 U2 c) n0 D2 F3 J
- #include <stdlib.h>* A3 j- K h# L0 G7 Y
2 S1 u! m6 Z& {1 e# B- #define DEFAULT_PORT 5150
( \8 D: f l& T$ P+ S- d8 C! f - #define DEFAULT_BUFFER 4096% R. R; `7 X( k+ T
- 3 O* V* h6 B% v4 `& @ G* H
- int iPort = DEFAULT_PORT;
2 M" ^, _0 O4 f% w1 O- G - char szAddress[128];
+ o/ {/ }8 F2 T# v. c+ ^1 N - : [7 A$ u9 _& P. L
- DWORD WINAPI ClientThread(LPVOID lpParam)
( D) T7 w5 V& p: V# p* R - {
+ S1 e' R$ u* f2 P! t# j2 y5 ? - SOCKET sock=(SOCKET)lpParam;
( s7 @/ ^+ q% N( A- G& C3 y$ g - char szBuff[DEFAULT_BUFFER];
+ m5 M% n4 {) A5 o: Q: j - int ret;
3 q; J; k) ^/ H
+ v0 b$ B9 F2 Y% {- while(1)0 e% p; @8 y. \' ~9 [
- {
9 U5 r: `7 `+ c3 B - ret = recv(sock, szBuff, DEFAULT_BUFFER, 0);+ Z2 w% l: t' [/ {8 j
- if (ret == 0)7 o+ g% q& {" T$ U! Z
- break;
5 }1 z0 N0 [4 j( I# u$ B" P2 ^ - else if (ret == SOCKET_ERROR)( J1 f& H) u0 |9 I) E" ^ B
- {# E; E+ V& r! q* v6 c) p
- printf("recv() failed: %d\n", WSAGetLastError());
5 x: g2 o9 w+ Q - break;
6 E! I' s u R( Y, Q& h - }
9 T- J4 T7 |$ H1 {$ ? - szBuff[ret] = '\0';
. W8 m! P& _1 u# Y# f - printf("RECV: '%s'\n", szBuff);
/ W* p$ k# s5 e+ Z/ Q$ `' Z4 N3 s3 f - if(strcmp(szBuff,"abc")==0){( D* n+ v& ]1 q) P1 J
- memcpy(szBuff,"Send the correct string!",25);& @$ A& g: m( T! t. K6 o
- }1 w1 T4 A9 t$ y: v$ V8 P' b
- else{
" g2 s4 W8 |! ?" f" W F - memcpy(szBuff,"Send the wrong string!",23);
% y1 r, }9 S- O) @# d4 N$ x2 q - }" X3 {2 y8 p7 W' |, l }5 Z
- ret = send(sock, szBuff, strlen(szBuff), 0);# x! C4 u+ Q- V4 Z. Z2 e T
- if (ret == SOCKET_ERROR){' o4 s3 E5 O3 n9 j' x& D; g) ~
- printf("send() failed: %d\n", WSAGetLastError());
) v( }$ [1 D1 {( l* o1 { - }% D( t# Z L( t4 b9 j* }1 _8 k' |
- }
8 S+ W: w7 E% ?7 b - return 0;
3 O3 y, D( |* k - }0 c. q f+ w3 a
- Y! i: Q' j9 I S% I- int main()' r1 ?8 s% q A) x
- {9 n2 x3 B" V/ S8 G6 V, b; F
- WSADATA wsd;
# ?3 f+ u9 Y; Z- @5 s - SOCKET sListen,+ }* j! ~7 N8 j( v) x3 h H/ |
- sClient;
" z# F0 c+ V' v$ | - int iAddrSize;
. Y( O) f% |/ j, j) B0 R; t# Z0 Z6 ~ - HANDLE hThread;
) h. J6 B9 p) J1 K* v3 [: e5 Y - DWORD dwThreadId;+ g4 E/ E/ y9 x. X
- struct sockaddr_in local,% k$ j: f5 r- Q$ q/ L4 B+ ]7 r. X
- client;
4 |( A8 [3 ]2 j6 ^1 R - # {0 L# ]; d8 i6 G: w+ ~8 |0 p
- if (WSAStartup(MAKEWORD(2,2), &wsd) != 0)/ A# S4 Y7 d! u& f! J' O
- {6 D) M, p* n" ^+ Z* Z/ g# }
- printf("Failed to load Winsock!\n");
{4 p" H; }3 Z3 r' @* A+ x* j8 U. d - return 1;8 Q0 F6 J5 G; Q' h+ y
- }
9 ]* _3 A* y/ u - // Create our listening socket
" @( i$ S- J1 {2 A; `: [ - sListen = socket(AF_INET, SOCK_STREAM, IPPROTO_IP);2 w3 ^& c( i! y; c/ T
- if (sListen == SOCKET_ERROR)
& X5 t2 S9 l& Z' ^5 |9 l8 A1 L0 t - {
4 G8 ] p5 z. A# h9 b - printf("socket() failed: %d\n", WSAGetLastError());
* A! V# M( J4 u% ^2 Z. j - return 1;$ u+ g: t. `! L: f7 F' y5 }. C2 Q
- }3 |" I) O' n t
- local.sin_addr.s_addr = htonl(INADDR_ANY);
/ ]2 B6 J* R+ ^( ?3 b - local.sin_family = AF_INET;
- a4 e1 N( t# O& N# z - local.sin_port = htons(iPort);
& W% D# C. l. Q! B - ( Z3 |% q7 I9 m. Z) g( _3 {
- if (bind(sListen, (struct sockaddr *)&local,; h! b- B: X4 \3 `, a2 W
- sizeof(local)) == SOCKET_ERROR)
# a. o" h8 O1 G! e( B1 n) x) [) T1 A - {: Y4 h6 `! t& l
- printf("bind() failed: %d\n", WSAGetLastError());; [0 d: T. m. ?+ B9 d$ b
- return 1;
2 g$ @2 ~7 \0 o$ k' b: |! @1 W - }
* D, J# R7 K' c - listen(sListen, 8); h4 H, J1 O8 }, X! a$ E3 ?# n
- // In a continous loop, wait for incoming clients. Once one
( ?/ y) D: h! G) Y - // is detected, create a thread and pass the handle off to it.
& L3 A2 R5 O! R: n$ _# g% _ - while (1)( }$ l3 n w& K+ E# H
- {- t, s* S- t% m, l8 T+ l9 s
- iAddrSize = sizeof(client);
/ i& Y6 j3 y0 }# n - sClient = accept(sListen, (struct sockaddr *)&client,' V& E( G3 F7 O S9 q6 S$ f
- &iAddrSize);
# U. ?$ Z J# _. z x - if (sClient == INVALID_SOCKET)
( ~0 R; o- h2 u# q1 j& g - { 1 d* |8 D7 u% u
- printf("accept() failed: %d\n", WSAGetLastError());
; S' b7 X' @8 b7 S1 f" ~ - break;
% j9 g% y( j0 a# y/ [( Y+ e% }+ | - }* K2 g i2 m2 K6 F- R6 S( t
- printf("Accepted client: %s:%d\n",
$ m$ Q* `4 f7 }3 V' U - inet_ntoa(client.sin_addr), ntohs(client.sin_port));
( Z5 {# n: j0 U+ H& x4 {! X - . ~& O1 _% T% f
- hThread = CreateThread(NULL, 0, ClientThread,
- r: V/ Q8 E& X' i' ]3 |1 u - (LPVOID)sClient, 0, &dwThreadId);8 O y' s0 G/ N% E. w( W
- if (hThread == NULL)! s1 h/ _+ a" y6 I& l! E$ C7 G
- {9 X, x2 l& }8 h4 F
- printf("CreateThread() failed: %d\n", GetLastError());- b$ D$ t2 J }. A3 E0 h0 F
- break;
. X+ C! M/ F8 h, d- ^- G - }
! d# A* v$ W& h& h q* q - CloseHandle(hThread);
, @; r- B. E# X" o* h9 W+ c - }
* t2 B5 w; a- E3 W7 S, T" h - closesocket(sListen);4 r7 y3 _+ @: {6 i* V
- : o4 E# j7 U7 w( U
- WSACleanup();
+ F7 |) M& o, i- H+ P; m - return 0;2 E( L9 x- Z% d# G# E& @$ b. R8 y
- }
复制代码 2 O# h) [; b! `% z- h
4 ~) \$ e2 Z' x! [
8 s k5 `" q) [0 h( a2 A
- I* x) n2 S6 O
5 ?! o& y7 Y' E3 W |
|