管理员
   
论坛积分
分
威望 点
贡献值 个
金币 枚
|
程序很简单,windows环境下的,客户端和服务器程序都在本机运行,在客户端输入发送给服务器的字符串,服务器收到字符串后会打印出来,同时与"abc"比较,与"abc"相同就会返给客户端,输入的是正确的,不同会告诉客户端输入时错误的。
0 n$ o! D$ h- m# o$ C( l客户端程序:client.cpp
N u3 A2 i- |# E! O- #include <winsock2.h>
- e, L! M0 @# Y2 T# {, |3 O, p - #include <stdio.h>* g( O: E' @1 Q: }/ }
- #include <stdlib.h>0 D; q9 s$ e. U9 y1 B/ T) e
* j3 ~4 U. ^/ f1 E* o P; X! F1 ~' K- #define DEFAULT_PORT 5150* c9 |3 @' S$ J5 e2 f H4 P6 j7 q5 l. ?
- #define DEFAULT_BUFFER 2048
6 E: t" y5 D) e# |0 A: `7 L - " F8 J! S9 B1 \2 c* g9 l6 U
- char szServer[128],
D4 t( A$ n4 ?5 G) B) T - szMessage[1024];( |/ ~5 v9 {1 A. C5 B
- int iPort = DEFAULT_PORT;
/ x+ F7 ^( L* c0 }/ G# z
: J- u9 m" ?* C. y( v- int main()
! f# C. u' B2 B3 w - {, @( K. G" d4 [4 O% O$ R% i5 G" S
- WSADATA wsd;6 F! d# ~. U$ k4 x% G% c
- SOCKET sClient;3 x6 Z' |+ ~5 \, O# i
- char szBuffer[DEFAULT_BUFFER];
/ D6 T' p. i& d5 _ - int ret;$ L, _, ]8 o0 x' M6 m
- struct sockaddr_in server;& w/ r& j$ M/ g/ ~: ^. o
- struct hostent *host = NULL;2 B$ D; p9 R( T8 i, y
- if (WSAStartup(MAKEWORD(2,2), &wsd) != 0)5 D! R* q% {8 M' Q- P9 z; y/ q: |
- {
j, x2 |( d8 `, d1 F1 R. g% ` - printf("Failed to load Winsock library!\n");* ~5 `; S# J: O, J: Y& u
- return 1;
) t0 j4 }4 q0 A* i% X5 g - }
7 @- F2 N( k2 K q - printf("Enter a string to send to server:\n");
7 S7 ~- b I' c& y - gets(szMessage);0 N- c) r8 e0 w9 k: T
- // Create the socket, and attempt to connect to the server- d5 |. Y: F0 Y8 c6 y0 V' T
- sClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);( U1 i( s: R9 o1 L. e
- if (sClient == INVALID_SOCKET)
/ C0 y1 D6 c+ F: {; Z# C - {
- H6 q |- @9 l - printf("socket() failed: %d\n", WSAGetLastError());4 E& y6 h- H) U( a* P
- return 1;3 ~6 A/ J8 D8 _3 r4 w" u! s
- }
4 c$ \. ^2 P% X$ W; P8 W - server.sin_family = AF_INET;
& r! b, S @0 T& {# `. | - server.sin_port = htons(iPort);
8 h" i7 T6 t. ?5 ^0 i4 \9 V" @ - server.sin_addr.s_addr = inet_addr("127.0.0.1");4 M1 o {7 h% m6 f$ ~
- ) F# }% @' s T. \2 h. Z/ z, V
- if (connect(sClient, (struct sockaddr *)&server,
- [6 b: n/ w1 U - sizeof(server)) == SOCKET_ERROR)
3 H% e5 q* Y0 }- d& |8 G - {
- ^' X* N3 t& { - printf("connect() failed: %d\n", WSAGetLastError());
- \2 d' z; g+ W - return 1;/ w4 C; n7 [2 `3 i* C( u0 l; Q
- }
. W5 p% B. Y" | ]' z% n+ Y - // Send and receive data
) S8 A* X- a: u% D% t! y/ ? - ret = send(sClient, szMessage, strlen(szMessage), 0);
' O, b# C' |' M - if (ret == SOCKET_ERROR)! d4 C& M" h* g- i3 e& z3 u* S
- {
5 h7 @9 B% L& N2 X - printf("send() failed: %d\n", WSAGetLastError());& ]1 ?8 B7 s' W! ?
- }
$ `5 j. u1 c" ?0 k% h - else{
9 d- |. U {' `& |" V - printf("Send '%s' \n", szMessage);# o2 ~/ x3 x1 e0 l7 [5 \0 g$ ^# r
- ret = recv(sClient, szBuffer, DEFAULT_BUFFER, 0);& P2 R7 Y' j/ y: x n; k
- if (ret == SOCKET_ERROR){" O, r* z5 R- M/ I& Y
- printf("recv() failed: %d\n", WSAGetLastError());" A* \4 U2 s. j# y7 a" v
- }* r" z" p S- u! p' `$ r
- else{
/ Q d& o0 y k: p$ ~ - szBuffer[ret] = '\0';9 N! M+ P! M$ D! _0 {5 l0 E/ u- m
- printf("RECV: '%s'\n",szBuffer);
" j7 k# f4 a: T( ]! \7 b - }
7 a( g- y* K m" {: k" Y7 |* h - }4 ?7 Y# j% w) Q
- closesocket(sClient);
: V0 |# E5 X p- w. Y: ?
7 g# j$ _, ]' d. F& X- WSACleanup();
( k, e% a. E3 {- ~% R6 q8 F2 ^ - return 0;) U( Q4 r& r7 U1 p6 p
- }
复制代码 服务器程序:server.cpp
4 o. w* ^9 Z7 `, k! v( x- i- #include <winsock2.h>% S; z) W5 C5 Q: b
- #include <stdio.h>
# ]' @" J. K6 i - #include <stdlib.h>3 Z# X5 R+ H, N3 l' S8 D% c
- ; }& y# G {! G
- #define DEFAULT_PORT 5150
_: @3 ] O% y* ^7 K. J9 s* E( o - #define DEFAULT_BUFFER 4096
, j6 U! X& o3 M% [6 w8 f - 4 B1 S9 G6 l5 o( U( T8 |0 B9 J
- int iPort = DEFAULT_PORT;
( k2 c" J) s" ~, p# a0 v - char szAddress[128];
5 I' j- h C8 t* T - 4 v' _9 {6 {7 G4 @# s
- DWORD WINAPI ClientThread(LPVOID lpParam)0 t) R" |5 ]& u& m' h4 l0 N
- {, o* X) k; S1 E+ |' [9 y+ ` D" N
- SOCKET sock=(SOCKET)lpParam;
' v9 q- @1 r/ ^7 E8 u Y - char szBuff[DEFAULT_BUFFER];9 S1 V N# d( ^! _2 r$ r# Q
- int ret;
6 ]+ o; m6 y7 v" o" ]- V/ y6 p
- X. ~% [: H: k9 i9 R- while(1)
, B4 x1 V- [; k- P4 Q( Q, { - {
9 y( }* R5 d5 @5 ]0 E, @ - ret = recv(sock, szBuff, DEFAULT_BUFFER, 0);& [0 _ ^& S1 z! z
- if (ret == 0)
$ |# _8 K2 D7 j2 d/ l- M% E - break;# j" P' R0 J1 e0 L I1 F. k2 B7 c
- else if (ret == SOCKET_ERROR)
) L. x N- g7 E8 b. X - {# B8 z; [7 V% C
- printf("recv() failed: %d\n", WSAGetLastError());# c/ Y/ N' l+ _( b
- break;, \7 [: H$ s0 t6 ^. L9 h- c, x
- }
: C1 n4 E$ p! l, m - szBuff[ret] = '\0';1 [$ s2 k# r0 D" I3 ?" C
- printf("RECV: '%s'\n", szBuff);
% _8 C& Z" \( @$ k! m" y5 E& B: F' D - if(strcmp(szBuff,"abc")==0){
" v9 V6 ]1 D# e( _2 R+ k - memcpy(szBuff,"Send the correct string!",25);
) x0 q; {& c' V0 b6 Y' r' J6 W - }* }* k0 H- K* D( U5 I7 d9 G
- else{7 z; P. c3 G' I8 J, h
- memcpy(szBuff,"Send the wrong string!",23);
$ p1 E" k& S' x; K3 r - }' K; d4 ?/ L; @3 x( }* }# F7 L
- ret = send(sock, szBuff, strlen(szBuff), 0);' v6 a& y& S2 _( f
- if (ret == SOCKET_ERROR){. R0 }7 x# y/ a( i8 ]" q% r8 {' [: N! W4 L
- printf("send() failed: %d\n", WSAGetLastError());$ T( V+ g+ p. t5 s0 m
- }
& E* S1 j3 D8 u - }
! v) \2 U; }9 b; T8 E1 U1 D - return 0;: C& A+ |0 C% u
- }4 C* b1 j) `& n
2 V9 y2 V0 J9 _0 ^- int main()
( l+ E: B% | P - {+ [4 s& v. `$ c
- WSADATA wsd;1 J/ L- t3 `, p7 k4 A1 ?# p
- SOCKET sListen,
- T# j1 u& _ J+ F) _; h" k. O - sClient;( ~1 r( q9 ~4 l( Z
- int iAddrSize;" `7 T# A+ X0 J1 G9 E: O: n
- HANDLE hThread;- y6 \9 E1 U, Z3 j& r
- DWORD dwThreadId; s! s9 E7 ]5 q4 `* G# w& M0 S
- struct sockaddr_in local,% P T1 w: H3 w! v7 w4 b7 v+ B
- client;
3 S; |6 K8 n1 l9 B+ w - ; T' J7 n. r$ Q
- if (WSAStartup(MAKEWORD(2,2), &wsd) != 0)! J# [2 v# v) e/ F1 \
- {
0 D2 w# S2 B$ ?0 u7 u8 F+ ?0 V! |, B - printf("Failed to load Winsock!\n"); g& V m6 ^$ ?$ c7 U% p: p3 @3 Z
- return 1;
" @% z2 b$ W/ ]) d, M - }1 H7 R% k* S+ ?2 M; o) ?
- // Create our listening socket/ @, ?3 D0 u0 Z( E
- sListen = socket(AF_INET, SOCK_STREAM, IPPROTO_IP);/ N2 I. f0 v( e% s) f2 y8 Y
- if (sListen == SOCKET_ERROR)
2 d) d+ Y$ o+ X - {
' K( R- _$ l4 m8 U0 d* e - printf("socket() failed: %d\n", WSAGetLastError());" {4 S- x$ i) A/ }
- return 1;3 G8 y0 n+ i6 X
- }
1 [1 e( h0 Q( @" @% c! Y - local.sin_addr.s_addr = htonl(INADDR_ANY);
! A7 M4 ^2 E0 B9 S, z {1 @/ Z) N3 m - local.sin_family = AF_INET;
: n# p8 W1 \) F' ^ - local.sin_port = htons(iPort);
5 m$ U5 F' ]2 V! y& k% H
: z) R- Q& q( B, p) C/ ?- if (bind(sListen, (struct sockaddr *)&local,5 T1 `9 _8 ~- Y$ L
- sizeof(local)) == SOCKET_ERROR)
* V6 v X3 D9 Z% `6 H. ] - {
* X9 n. B0 `7 L) y1 A% U) B+ ]. ]. I - printf("bind() failed: %d\n", WSAGetLastError());
" {" n. G, o4 D/ }, D - return 1;
" m' K1 c, l. x6 U/ O" S' t* g - }" s/ B, d) @0 i$ J- o5 O
- listen(sListen, 8);
( W) N4 p3 v. {( g, s% g; x/ v; B - // In a continous loop, wait for incoming clients. Once one; X/ j% V6 U% c2 k
- // is detected, create a thread and pass the handle off to it.( P' {& S- G7 z6 z1 k
- while (1)
4 K/ P- `! X0 d" x6 s - {
# L: U- U" j& m* y0 T - iAddrSize = sizeof(client);" y$ F4 m" X& @$ e, \! U
- sClient = accept(sListen, (struct sockaddr *)&client,% t$ K1 J& S" Z) o/ r5 |0 i! y
- &iAddrSize);
" b; w9 `- s$ \9 E' D" j# R4 N* ~! p - if (sClient == INVALID_SOCKET)
: }5 z/ L5 T& e. x3 a/ J0 D6 u* T/ c - { + {" @3 {9 t) a& c$ o
- printf("accept() failed: %d\n", WSAGetLastError());/ R6 b0 O# L' |4 I# i+ B$ t
- break;+ }# m! W0 U0 N+ ~/ x& ?
- }' `- X6 q# P/ \9 ?& N
- printf("Accepted client: %s:%d\n",
; ~! D+ w0 u# ? - inet_ntoa(client.sin_addr), ntohs(client.sin_port));( s( M# _6 L4 u" o5 z
0 c. |, j) j& @( a- hThread = CreateThread(NULL, 0, ClientThread,
8 _! a6 N |. v - (LPVOID)sClient, 0, &dwThreadId);( {+ c# J( Z& e" }# A5 O o
- if (hThread == NULL)! ~1 q$ o" n! x, H1 \
- {- K3 F. f! G1 \; [/ ~) u
- printf("CreateThread() failed: %d\n", GetLastError());+ i# r/ f! U0 F2 I' D, b3 @
- break;
4 z; b% Q/ G9 S2 t - }
4 `2 r2 c$ I( C - CloseHandle(hThread);
2 D' b1 a0 K! y0 p - }
8 J: K# ~4 w2 e7 h4 m0 b: A - closesocket(sListen);' d# F6 D% L6 n7 {/ x# }1 D
-
- T% r8 y% t0 Q) U9 [ - WSACleanup();# |% E& V/ F' j6 { q
- return 0;9 m0 b1 L9 c" m4 q) y; Q5 X- p0 [6 I
- }
复制代码
2 [* T# i8 S% Q
n$ {4 K# I, h* C& P
, m, S; @6 k* L2 X* j$ _$ V% d* K
. i& U! K. y. Q) [* I9 N
! Z8 H/ @! r/ h9 e/ v6 ] T |
|