找回密码
 注册
搜索
查看: 4240|回复: 0

[收藏]在CB中用socket api来写网络通讯程序

[复制链接]
发表于 2004-2-15 14:01:13 | 显示全部楼层 |阅读模式
在CB中用socket api来写网络通讯程序" j' m: C. O" P4 Z6 k5 j1 b7 V
作者: kingcaiyao ,如转载请保证本文档的完整性,并注明出处。6 \4 ~5 B1 n9 o& t
欢迎光临 C++ Builder 研究,http://www.ccrun.com/doc/go.asp?id=569: ?2 D, X( W8 S3 G7 i' |1 ?1 ~
本文转自csdn,作者:kingcaiyao, i4 ~" i2 i2 E5 F5 _* l
原标题:在C++ Builder中用socket api来写网络通讯程序(同时支持TCP和UDP协议)' j2 \/ O! x5 e. M
原文:  http://www.csdn.net/develop/read_article.asp?id=19883# x9 Z4 B  C( Y$ {! w% s2 e

1 F1 Z- a$ K6 n8 ~1 u( {& _1 H8 w4 l2 r5 n' [6 v  I
在7月4日看完sockcomp.pas后,我决定用socket api来写一个客户端和服务器并且同时支持TCP,UDP协议,于是我就去做,现将代码贴出来(已调试通过)1 h3 U$ P* l* G% |
Socket api Client:7 E2 o5 r3 e0 y7 s% c, m- ~8 U

; Y' X9 k3 }; |9 i6 g4 H#ifndef UDPClientH; h9 d' P+ d" f! f) x
#define UDPClientH# A1 _8 x+ J) J$ o( K% {/ i, f# i
#include <Classes.hpp>0 D/ |$ ?% C+ K) A) d' p% b
#include <Controls.hpp>, ~5 I; [6 C8 t( K1 b7 m3 @
#include <StdCtrls.hpp>
1 n& c) D/ S. Q- r9 a! n* u* a#include <Forms.hpp>( y. w  J3 V! y" c
#include <stdio.h>
& z' Z* V" M/ c! X: t5 O#include "CCEdit.h"
9 J" c- H  q7 |/ m" }' }#define WM_SOCK WM_USER+100+ K8 N1 h/ g" v
class TLANForm : public TForm
+ ]/ x# Z! V: z. Y{' y- Q" B4 U  l, {
__published: // IDE-managed Components
- I3 X/ w6 e0 H* Q# o   TEdit *Port;7 |# Y0 s3 I  w2 Z4 W2 ~0 e
   TLabel *Label1;
1 G; x  q! t4 |   TLabel *Label2;/ K3 u; @" n$ I2 ?: O9 q
   TComboBox *Prot;
, Q+ A6 t; l+ t! U# |/ P   TButton *Button1;% y% ]7 W; L7 t. y  r
   TLabel *Label3;
+ E2 r* z7 J* l, t  q   TEdit *Addr;
; P2 u2 C2 c1 K$ V* B   TCCEdit *TxtEdit;& W# j7 F! X2 L! X# B
   void __fastcall FormCreate(TObject *Sender);* R1 R" m/ j' j' G
   void __fastcall Button1Click(TObject *Sender);/ X* H% m* J+ p3 f% b. ~
   void __fastcall FormDestroy(TObject *Sender);
  @0 N4 e' f" P5 Kprivate: // User declarations
* Z8 e2 V5 [6 R3 z" R( r   void __fastcall OnRecv(TMessage &Message);
" u# ~: y, i" ?( |1 ^  O/ vpublic:  // User declarations
5 c, q7 a/ H7 m- k   __fastcall TLANForm(TComponent* Owner);$ A) @+ I. o6 h* K
   BEGIN_MESSAGE_MAP
5 }+ E+ P/ b/ a2 Q( t3 i! W      VCL_MESSAGE_HANDLER(WM_SOCK,TMessage,OnRecv);
8 s$ b7 L1 K% R( w# `2 W   END_MESSAGE_MAP(TForm);
, u( V) O' B: y+ U};
( m! K4 b% o2 Q" b) |- E1 b3 Eextern PACKAGE TLANForm *LANForm;. D/ r! z# ]' y
#endif1 {$ z8 u; {) k" l; Y

4 I( Y6 }" C5 i( Q  a
6 O2 H. E! B& Y& I' n- E5 U.cpp File
% r6 A# b' n) g- X7 s( h9 T4 J6 A/ V8 b, @/ V  \9 z* o! j
#include <vcl.h>! Y" j. Q7 ?8 T0 W* G
#pragma hdrstop
- M6 O7 b& l' H6 B" W( R5 C4 Q; a) p#include "UDPClient.h"
6 |8 |8 ?5 @$ t) h* `# h#include "WinSock.h"2 z9 z" n, t- e7 _" R4 U9 t$ E
#pragma package(smart_init)* `1 p1 l4 }& \% z* w! s, A
#pragma link "CCEdit"
6 W( [9 O* F+ c#pragma resource "*.dfm"+ U3 ?1 t" M1 S
TLANForm *LANForm;) y# U1 I6 e9 R3 Y3 f8 `
enum PROTO {TCP=0,UDP=1};
# p6 K$ m( P9 b( c* Z) ]5 CSOCKET m_Socket=INVALID_SOCKET;
- X( E' i/ Y8 A* e: HPROTO m_Protocol=TCP;8 q0 r* G( W% w
__fastcall TLANForm::TLANForm(TComponent* Owner)
. O0 P! L+ y# Y& U: d   : TForm(Owner)
5 H3 w8 U! ]) S3 f0 f{  l! A: o' w. A- a
5 A5 A( N! }. Z6 x2 [) L4 _
}) c% X  i( J3 f' @  E! Y  w. Q
void __fastcall TLANForm::FormCreate(TObject *Sender)
' m# |9 Q* Y( j7 {{
  B7 w8 R( c- g+ X0 e   ::SendMessage(Prot->Handle,CB_SETCURSEL,0,0);- x- O; Z; x5 R! R; |
}
% t% O) f9 V9 J8 Zvoid __fastcall TLANForm::OnRecv(TMessage &Message)
! Q% l2 Z. h* |% r6 ?{
" P. H' p9 ?0 ^+ X3 c   char buf[4096];) e5 `  H& X" a
   int nLen;  H4 G9 M' u/ ?9 _: N  ?0 J: ~+ z9 u
   struct sockaddr_in from;  D1 v3 t1 O  y0 v
   int nLength=sizeof(struct sockaddr_in);
& F* m9 s% w2 o, ?/ O2 F   switch(WSAGETSELECTEVENT(Message.LParam))
8 `- D) T6 w1 G$ H4 l4 R/ |   {
& G& E. Y+ u% Q- `      case FD_READ:! g8 u+ V' A! z6 R" o
         switch(m_Protocol)
9 w2 }$ y' {( p" ]+ X; C         {% f; e- s9 }2 O2 |
            case TCP:
: b3 H7 H0 t% L3 O; P* ^               nLen=recv(m_Socket,buf,4096,0);. `( P7 N7 [4 I: x4 Q/ Q
               if(nLen>0){
; e( d" j# n5 m! A0 q- E                  buf[nLen]='\0';2 {6 Z8 V. [0 X! s9 h/ f1 F
                  TxtEdit->Text="Received Length:"+String(nLen)+"\r\n"+StrPas(buf);) b. s! {  h. s0 l, ^( q
               }9 o; a" K$ H. q3 |+ W1 B7 p8 m
               break;* d- |3 S) c) w" o& D
            case UDP:
, D& V8 }/ ^. |" I' }, o; e6 a               nLen=recvfrom(m_Socket,buf,4096,0,(struct sockaddr*)&from,&nLength);8 q7 N0 Y: s+ U6 r- S
               if(nLen>0){
  Q. O0 ], b1 g3 @' f/ M4 K  z                  buf[nLen]='\0';
8 @; p' e( R6 N2 j* ]                  TxtEdit->Text="Received Length:"+String(nLen)+"\r\n"+StrPas(buf);7 C1 X' F7 `' w3 E3 Y2 V
               }
; @/ u9 J" n; @% E% |" z               break;
3 a4 O& k. L  I& u         }* _$ G- z, a/ H9 \, \+ p: I
         break;
1 H3 y( a) @6 _" l, a      case FD_CLOSE:
; ?' `( M1 ]* L2 n6 X1 B$ J& c         closesocket(m_Socket);
; a5 c# v" r2 H# H' g         break;
& G) q" S! P, Z3 @1 d   }  V$ N/ f+ t4 Z) c: S$ J
}4 h3 T7 @: w9 S5 l( z. m6 f

5 Y1 R; \2 Z- E( z" bvoid __fastcall TLANForm::Button1Click(TObject *Sender)
0 Q1 y* f; z! R+ w& [, @, x& l8 \{
. z1 o, z, V* t3 b2 G   char szTmp[256],buf[4096];
9 g! d6 N/ L* }   int nSize=0;
9 k5 I" C8 D) J9 H4 M. D   UINT m_Port;
$ X' d- W, \6 ?' @. ]6 Q  X   AnsiString addr;
$ ~: N' G2 ?6 G$ Y6 [   addr=Addr->Text.Trim();
1 }" a1 p9 |. q: W" l$ E   if(addr.IsEmpty()){
  k) M1 f1 X* ?7 K) I/ E8 H! E: |      ::MessageBox(0,"lease enter the server IP!","Error",MB_OK+MB_ICONERROR);
4 p. r% ?6 y/ W$ x# g  p      return;
! y, w/ f# P. _   }
! H# p4 Y( l  q% O( Y   unsigned long nAddr=inet_addr(addr.c_str());& S' e" K6 y: g0 d
   if(nAddr==INADDR_NONE){( p7 S* M; a) n+ X
      ::MessageBox(0,"Bad Internet IP!","Error",MB_OK+MB_ICONERROR);
" K$ H* z1 l* _: E, H      return;}
+ _8 ]- V* e/ l) d2 n- g; o) ^. m% O; I6 Q# T) b
   try
' Z/ a. u% D" T; ]8 R   {
6 |& n" i6 G0 b2 C6 q      m_Port=Port->Text.ToInt();
6 b6 l, S7 G6 N) G* w6 s   }
9 [# p3 E1 U8 t7 z6 d   catch(Exception &e)
" b" L  [, Y0 G/ l   {' f. U: g9 K* \- W
      ::MessageBox(0,e.Message.c_str(),"Error",MB_OK+MB_ICONERROR);
" b' t( v- @" c8 w      return;
* w" V0 }1 {4 l3 M) c1 L   }/ c7 o- @# h4 F. D& }% r* r1 C
   switch(Prot->ItemIndex)
) r3 \, F& x) P6 t   {
+ x6 O2 S* G! @1 ]      case 0:0 _  v2 W  v0 o) [, @0 _& R1 j7 ~% J
         m_Protocol=TCP;/ \' b; X& M" d" {; Y; M
         break;
3 n! u0 h0 L, O# D  _      case 1:( Z# I1 s+ k( {8 q8 ^/ e' X
         m_Protocol=UDP;
& l4 b. j; R# D. j6 ~+ a; Y         break;
# T+ |  E$ D  N   }- b8 a& @' c6 `- ]. L6 Q
   if(TxtEdit->Text.IsEmpty()){" }( }8 a# ?: O3 G7 d+ a
      ::MessageBox(0,"lease enter the text you want to send!","Error",MB_OK+MB_ICONERROR);( p6 N$ Z8 t6 g
      return;}
% I& Y7 d1 g5 H& u$ ^3 v) h" q1 K0 q0 _/ `" o8 y/ O* B6 j. p9 k; y  @5 I
   //Initialize Winsocket
4 P2 `+ G# i/ e" H6 l8 m   WSAData wsaData;* u7 b9 X: W$ @: U1 S
   ::ZeroMemory(&wsaData,sizeof(WSAData));
- E' E% l* }& i, T8 c   WORD version=MAKEWORD(2,0);
) H7 d8 Y  d0 w# S, P9 t  a5 g% Q   if(::WSAStartup(version,&wsaData)){: a, v: ~7 T/ z9 m% _
      sprintf(szTmp,"Failed to initial winsock enviroment!,error no:%d",::WSAGetLastError());
9 O3 t) V8 r- n; S5 r) B0 p/ D      return;}/ C2 [3 V* T" z- i( Q5 V

4 s8 D) q3 \# \1 F   //Obtain the active connection
: N' y& S5 Q+ D/ ~$ K* Y' I   char ComputerName[255];
7 H6 Z* j' G/ h! A- a) @   gethostname(ComputerName,255);
$ N0 ^* t4 r; M. m$ E   struct hostent* he=gethostbyname(ComputerName);0 K! F% x( u9 |4 m/ P) I2 O
   if(!he){
: H: J% M2 {7 f- ^1 l7 z/ c      sprintf(szTmp,"Failed to get information to host!","Error",MB_OK+MB_ICONERROR);& l5 \0 O" P* _& m5 r
      ::WSACleanup();6 u1 ?5 J. u) l3 h. G/ m$ [
      return;
* A7 x* J, E% u) W   }; C) n: K/ |4 }) T- H# C
   //create new socket
" P& ?: w+ ]: P9 Q; L0 f9 L/ E# ?   m_Socket=INVALID_SOCKET;( F, @. h3 A/ r. Z% J/ k
   switch(m_Protocol)
* ?7 M! O7 B' v! F; r3 f% @   {
4 }8 K6 w: `0 a! Y      case TCP:6 m1 T1 O; B+ E$ Z% H4 c
         m_Socket=socket(AF_INET,SOCK_STREAM,0);# ^4 g5 m  Z( ~+ S, w
         break;
% Z: s/ O8 s: _  s7 y4 v      case UDP:
) y. o1 Z7 I  q# o! q         m_Socket=socket(AF_INET,SOCK_DGRAM,0);
: r4 m: ?/ K( ]4 M7 ^: @         break;
6 o, l- |3 w2 S) K+ y6 g% h4 x   }3 {3 w; N7 ^  ~
   if(m_Socket==INVALID_SOCKET){$ J/ I# b2 ^* |, \5 b* C
      sprintf(szTmp,"Failed to create a new socket!,error no:%d",::WSAGetLastError());
$ S$ n7 U, u) w# f  Z* J; s      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);2 A" [# z1 q$ o# c2 k7 `( H# q5 o/ |
      ::WSACleanup();
' d: n: b$ r3 u2 M" P      return;7 V9 U, F7 @. o# C5 u+ F4 t
   }/ B# q- ?( s: T: e- w% p) V
   //bind socket
# O5 p7 ?; M0 D1 X, q   struct sockaddr_in client;
2 d9 r: y; G0 V3 M1 @! v: V/ S   unsigned long nClient;
3 _: s9 K; F  `0 a* x( c" n- a- z" ~   memcpy(&nClient,he->h_addr_list[0],sizeof(int));7 Z1 ^) K2 V# \- z" D3 H
   if(nClient==INADDR_NONE){, \' o- v- l0 T. z5 Q
      sprintf(szTmp,"Failed to obtain the local machine's IP!","Error",MB_OK+MB_ICONERROR);7 {7 k/ M' J7 Q8 v0 j
      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);
# s/ Z! J5 ?& n7 R      closesocket(m_Socket);
0 l9 \' P1 a. e) f# ~+ S) D+ z# y      ::WSACleanup();+ u7 ~4 z0 D0 P2 j
      return;. B# M. [2 d9 v  E
   }1 ~& \* B$ k! R- g) ^
   client.sin_family=AF_INET;5 U9 T1 {$ d0 g: Y; V( _( T- i2 S( \
   client.sin_port=0;$ J+ V3 K/ S8 `4 Z, M; w% z( }
   client.sin_addr.S_un.S_addr=(int)nClient;
+ Q8 N- b  ^% `9 D8 F1 u   if(bind(m_Socket,(struct sockaddr*)&client,sizeof(struct sockaddr))){
+ b) z. x. W) d      sprintf(szTmp,"Failed to bind socket!","Error",MB_OK+MB_ICONERROR);
1 i3 U1 T$ u7 T) E7 }' P      closesocket(m_Socket);
1 G/ T: u* X4 e8 `      ::WSACleanup();
( v$ ~# x; s8 h& e+ b2 _      return;}- G. L5 c5 J8 F3 T
   //connect socket4 G7 ^( t) H; z% D6 L
   struct sockaddr_in To;
' Z) @2 H, B3 W+ ]$ e   To.sin_family=AF_INET;: f0 r) ]; R, J8 ]- G# k* E
   To.sin_port=htons(m_Port);* p9 t: e% F- E; j
   To.sin_addr.S_un.S_addr=(int)nAddr;
5 d( E& W' F# i& \   fd_set FDSET;
4 a: @. m. ~, U) P8 _4 I   FD_ZERO(&FDSET);2 v% W2 M" C2 v
   FD_SET(m_Socket,&FDSET);2 a0 z+ |; ]) k' A

8 r) T, A( F  p" k
' x5 \  n, w* K( Q% Y# Z   if(m_Protocol==TCP){1 m4 {0 D2 F) C
      if(connect(m_Socket,(struct sockaddr*)&To,sizeof(struct sockaddr))){! r: D$ y/ ]9 G& V
         sprintf(szTmp,"Failed to connect the object!,error no:%d",::WSAGetLastError());
% L/ S! d* A+ b) u% \4 L4 L         ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);
1 n7 P' r: ~9 N; n. d         closesocket(m_Socket);
' V. d# B3 Q3 [& Y) v         ::WSACleanup();, T$ m6 h* m7 a" Y5 k/ }
         return;( E; W& U; O+ e+ d; B6 {) U
      }% @! Y) I3 D4 [8 v8 g
      int nError=select(1,0,&FDSET,0,0);
( @+ @7 X/ m7 Y9 E: s6 |      if(nError<=0){
  Y' h+ L  ?& i  V, E+ ^      sprintf(szTmp,"Failed to select socket!,error no:%d",::WSAGetLastError());# H4 n: {' a  n9 l! \
      closesocket(m_Socket);9 g! Z0 J- @% A" T; V4 q" Z3 Z- i
      ::WSACleanup();
; Y0 J* w2 U! R. s      return;}
1 w9 H; d3 x3 G9 M; I5 Q1 v   }
5 x4 Z( o* ^9 F1 F  @   //Send data
  B6 n$ b, g# ]3 z( T" J   int nLen=TxtEdit->Text.Length();8 y1 c+ n# P$ K; H) y: P
   if(nLen>4096){0 |! k* w1 `( \+ X/ k+ n/ j( o; s
      sprintf(szTmp,"The buffer is too size to send,it shoud not be more than 4096 bytes!");: u' v. O  p2 w8 g( ^/ p* _
      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);3 R; i# V- ^" r; r2 ~+ _, [* P: F
      closesocket(m_Socket);
' u# I" h8 @# K1 ~$ U8 V      ::WSACleanup();
! i" H" T+ {, n( E7 s8 R      return;
% j( u! b  c# F( K# b% I( F   }
% E/ ~: z" L8 V- k/ o+ n   strncpy(buf,TxtEdit->Text.c_str(),nLen);7 D8 r& i2 _1 |( B
   switch(m_Protocol)
, g( B1 J$ u% A. I   {
7 m( Q* G. E& Q, b      case TCP:
0 M, f( p5 J% I. d5 c) |         nSize=send(m_Socket,buf,nLen,0);
+ a. U6 Z8 N# V6 q+ ^: J" ]0 H         //ShowMessage(nSize);
2 V  K8 W3 |6 Y0 Y9 d% R* S         break;$ C5 D+ O% J# v) {- S. S
      case UDP:5 W" \  r4 m0 h
         nSize=sendto(m_Socket,buf,nLen,0,(struct sockaddr*)&To,sizeof(struct sockaddr));
6 Y- F0 r; |5 d         //ShowMessage(nSize);
+ J# |/ [+ {1 w         break;
. a5 B4 I0 R- S5 }, H6 b( G/ n; G& `
   }
  N6 f& A8 A8 ]" `   if(::WSAAsyncSelect(m_Socket,Handle,WM_SOCK,FD_READ|FD_CLOSE)){
( M+ E6 _3 B/ \! g( f3 Z) c7 ?      sprintf(szTmp,"Failed to register socket event!,error no:%d",::WSAGetLastError());
  k& }& A" E. O. @- w; i0 Y      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);, D% x3 X( y0 u
      closesocket(m_Socket);
% x+ b0 a0 b( n; w3 k. V, f* X      ::WSACleanup();
! u1 S" |0 S, s      return;}
0 a9 U* q5 H( G$ a) {5 z) C}8 e6 n* U  p* i/ i
void __fastcall TLANForm::FormDestroy(TObject *Sender)  s9 P- P) g) i& u4 `
{
5 G0 m- c5 v- I1 T   closesocket(m_Socket);  x" x. l' _1 j) ~" y
   ::WSACleanup();
5 B1 @! Z2 f/ k9 `}* ]" M4 a3 W! N

: y* N/ ]1 w' e. R6 z- u6 MSocket api Server:
# P5 o- D/ x' Z+ Q% z- L2 ^.h File$ l1 Y0 b) p3 ^0 _! {
#ifndef UDPServerH
" V, Z- U5 L" F#define UDPServerH) B3 e( h$ k( {9 a1 l2 ~! s2 J
#include <Classes.hpp>  x2 R9 k  y. j/ \) a( Y7 c7 v8 g
#include <Controls.hpp>+ T6 j& o* F; K8 M
#include <StdCtrls.hpp>3 p' @; ?  w+ Y  ^( p7 M, }
#include <Forms.hpp>% o, h# O6 N3 L( r
#include <stdio.h>
3 x. U2 S9 b7 Q& G+ X; ^#include "WinSock.h"8 f. ?- N! N4 A) G' l/ s/ {
/*#define WM_SOCKET WM_USER+1000! T# Z: @! e. ]" V, B* Q: O7 E2 J
#define INITSOCKETSUCCESS 0) k2 T, ~2 t4 b) h" _/ k
#define INITSOCKETFAILURE 1
, b( o3 |* z% m! e6 o& y, i8 W8 u#define CREATELISTENSOCKETSUCCESS 2
/ [6 [* @2 }( @. z#define CREATELISTENSOCKETFAILURE 3; T4 }- P7 _# B5 C
#define SETLISTENSOCKETSUCCESS 41 C; A" g" i' D8 t0 L
#define SETLISTENSOCKETFAILURE 5
) v0 \2 p3 m; E6 c; X- H3 R% O#define BINDLISTENSOCKETSUCCESS 6# d5 s! V  j6 ^4 \  y3 G
#define BINDLISTENSOCKETFAILURE 7
  Q& }' u# c# I- g" O* `, A#define LISTENSOCKETSUCCESS 8% q. j3 {5 X& g; P5 {$ y3 c
#define LISTENSOCKETFAILURE 9$ g: i4 j9 w# k" J  n
#define ACCEPTSOCKETSUCCESS 10( @+ ^7 l% W, v
#define ACCEPTSOCKETFAILURE 11) U$ C" p. c* Y" @1 `  h
*/
/ n) Y- X9 W* O  zclass TPSTNForm : public TForm
4 e; ?9 z0 r/ q: k" E{8 A+ }7 ^/ W+ s& o% C' ~
__published: // IDE-managed Components$ C( Q1 ]. ]# ^) a3 ~" s+ o9 I- s
   TEdit *Port;
. b2 G' H3 }5 L, v   TLabel *Label1;
" |! \; `% f0 K, T1 \   TMemo *Memo1;
3 o9 P" A' U& @  i/ v1 _6 e   TButton *Button1;4 D! V* s, f2 X. W$ Z. l/ z
   TButton *Button2;
+ N/ b( K# z. ]. F8 Z   TLabel *Label2;
* C, U7 C  `6 _4 _" ~6 O4 a   TComboBox *Prot;5 |9 N& k% p5 L$ o  d% S# b
   void __fastcall Button1Click(TObject *Sender);' K& D9 N0 ^1 M
   void __fastcall Button2Click(TObject *Sender);
1 }" o7 E' s! c5 r; ~% I/ s* @8 ~   void __fastcall FormCreate(TObject *Sender);) A/ p  r9 @3 Y$ l: g% ~5 o
   void __fastcall FormDestroy(TObject *Sender);  o3 C- }: W( o+ u3 E5 j% x
private: // User declarations
8 \$ n! q3 u9 a0 _$ d, }3 w; F4 cpublic:  // User declarations
, d  O. {/ A5 z: d   __fastcall TPSTNForm(TComponent* Owner);
: d: z# B& @8 y0 b, c' a};
: C& A2 l  j- K4 ]# b5 a: menum PROTO {TCP,UDP};
: M" X/ V- x4 Z% A: ^; ?class TCommunication:public TThread    //Communication Thread* a) [6 B5 }: I) ]: i6 `! ^
{( j$ z2 u4 ?) H8 n+ v: _# k
private:
# p8 E9 z: S9 v$ W, f; }! b+ C, v   SOCKET m_AcceptSocket;& t0 D, [, u2 K. g4 C
   char szTmp[256];//ERROR MESSAGE
% S9 ?! X" H( Y" C8 x0 npublic:7 y3 e; q6 D& D& Y. E# H
   __fastcall TCommunication(SOCKET m_Socket,bool CreateSuspended);
& s% D* [8 p; m5 h7 U   __fastcall ~TCommunication();7 A& J1 F4 x9 T6 g9 A
protected:, P+ W: M3 Q1 s' o( z
   virtual void __fastcall Execute();, p+ k1 w8 g* F9 r) _
};
# Y1 e) f! F* q9 O# |7 o& Q5 fclass TListenThread:public TThread //Listen Thread
7 y" B* {3 a3 R+ f$ k{
6 O. B$ _5 s* v' @3 |private:
/ _. X7 `1 I: z   WSAData wsaData;' F' I- V1 W- m% C' y* i7 g0 o
   struct sockaddr_in server;
0 j4 `* U; E+ `6 z' D& p5 T   fd_set FDS;
$ r0 n0 M/ D  q! @4 ^( E   UINT m_Port;) ]. l, G( g/ x& b% p
   PROTO m_Protocol;) y- k5 ^( h. ?% x7 l1 R
   char szTmp[256];//Error Message, {+ g, q/ [4 w& u) e( S2 y/ @
public:
5 K% I1 ?, O3 G* G   SOCKET m_Socket;. Z1 j( N. y6 x( M
   void __fastcall DoError();
* h1 n5 L' Y8 H8 U& {   void __fastcall InitSocket();
- k& p" s7 ^# ?   void __fastcall CreateListenSocket();
# E7 P4 {6 z8 S$ V6 x2 e% m   void __fastcall SetListenSocket();
3 J1 Y( p' [' D/ j   void __fastcall BindListenSocket();/ s! `! _6 X/ r" l3 c8 u3 M# \
   void __fastcall ListenSocket();' a( t! n4 \& W! a! S: B$ e6 e

" G* m+ f! w0 R+ P# Qpublic:; f& t* O0 w9 p
   __fastcall TListenThread(PROTO m_ProtocolA,UINT m_PortA,bool CreateSuspended);
7 K! U& V3 v* k9 _5 g2 Z* A   virtual __fastcall ~TListenThread();2 B. V' C1 `  w. Y0 P0 `3 @- q
protected:
8 T% }. z) }7 _1 M- `& C# z( S: Y   virtual void __fastcall Execute();
/ R. A% h) p' O};' j( M5 |- w" B( U. [1 `
extern PACKAGE TPSTNForm *PSTNForm;, w  n; L( L' @# ]% j
#endif: J2 [1 V8 f. j
.cpp File
8 J- }! ?3 E8 E: M( o/ X' i#include <vcl.h>
, C; A" |0 D1 i2 Y9 O% `#pragma hdrstop& |( J& b6 O/ C' c
#include "UDPServer.h"2 n* b% j+ i  Q$ T
#pragma package(smart_init)
* }8 R* o: o9 z7 U7 I#pragma resource "*.dfm". v* Q' n# W5 @& M. M
TPSTNForm *PSTNForm;
; m4 q* @+ }$ Y$ c' }TListenThread *pThread=0;5 y0 Y! \9 T$ a: _+ e
//******************************CLASS TCommunication For TCP****************************************************
% c( o" n2 b0 T( ___fastcall TCommunication::TCommunication(SOCKET m_Socket,bool CreateSuspended):TThread(FALSE)) W3 B: a: s$ K$ |+ H) X
{
( O/ B9 {5 k5 E& h( B% D. s   m_AcceptSocket=m_Socket;: `: E( n) W" Q- f2 g/ z( V# K* C
   szTmp[0]='\0';* r% P& Y1 A7 Z) v/ P# \0 w
   FreeOnTerminate=true;" g2 d9 b" a/ ?  E" E6 o
}1 g2 I7 x+ {! Z9 B' ^
__fastcall TCommunication::~TCommunication()
7 m: _4 a3 u0 ?- i/ q! g; I{
% h" a6 ~# {, _( M& O* D6 s$ h  // closesocket(m_AcceptSocket);
" V7 y- s( b/ P. L. m2 _2 @- V}/ q  r, I( S0 q- s; P6 X
void __fastcall TCommunication::Execute(). g0 f3 S* l- M4 o
{
% R5 l3 `+ N) u' S: E   char buf[4096];) p" m1 `- U# ~4 f2 q/ b7 z+ W
   int nSize=0;
2 z9 F) w( n& @   nSize=recv(m_AcceptSocket,(char FAR*)buf,4096,0);6 E. q$ J, L% W0 S
   if(nSize>0)* h, @. ^/ S* w; S+ E
   {& l: R5 t7 s+ W* N7 ~
      buf[nSize]='\0';
7 D8 U* R) [# n6 ?- P. u# K8 t% |6 [      //Display0 f! o/ d5 o& g- r7 T0 D! p0 ]
      PSTNForm->Memo1->Lines->Add("Received Length:"+String(nSize));
2 Z$ w0 T' V  O' I      PSTNForm->Memo1->Lines->Add("Received:"+StrPas(buf));2 u% `. A6 A$ b5 y& |+ O1 b
      //Deliver
, A5 I# h% S! q! Y7 g) o: e, \0 s      ::Sleep(100);
% C* n+ b0 p0 [" t/ d      send(m_AcceptSocket,buf,nSize,0);, K9 e9 R5 i  w
   }
+ Q1 L+ p) J1 ]7 b# i/ \7 O) s) i- S5 Q; ^9 x, r
}2 X2 m, A* c, z
//******************************CLASS TListenThread*****************************************************
7 J3 i: X* _& F; {; c' D__fastcall TListenThread::TListenThread(PROTO m_ProtocolA,UINT m_PortA,bool CreateSuspended):TThread(FALSE)( ~, w5 L; T% \9 U1 M
{
% g. J* `+ @& d4 ]# f1 b* s9 _  b   m_Socket=INVALID_SOCKET;
$ R! c8 i2 z5 \# j3 |, r4 v. r   m_Port=m_PortA;
7 `, i/ Y( i6 r   m_Protocol=m_ProtocolA;$ t# ?4 p1 }9 \' M8 f  Z! w
   szTmp[0]='\0';2 P  s- {: q: Z! Q( J2 ^: ~
   ::ZeroMemory(&wsaData,sizeof(WSAData));
' ^* R- r9 t0 y$ N2 B   ::ZeroMemory(&server,sizeof(struct sockaddr_in));- p5 g* P% q% C% e6 i
   FreeOnTerminate=TRUE;//Automatically delete while terminating.
4 S! N& u8 G/ H6 C0 b}
% h8 R7 d1 V% V1 p4 s9 }. y. X7 |, v__fastcall TListenThread::~TListenThread()8 u) t6 Z% W9 O9 d' o
{
* A- N; f6 D- m   closesocket(m_Socket);
; B/ Z3 m5 t; }! `$ V; \) a9 n   ::WSACleanup();. c; }7 a$ f. @  l$ f; X
   m_Socket=INVALID_SOCKET;
. e5 i* R0 f' O# g5 p   m_Port=0;
6 `3 K3 v& x3 q+ Q+ ^$ V   m_Protocol=TCP;! a6 w; }/ }- p+ U
   szTmp[0]='\0';
3 u/ Z! S. `& F   ::ZeroMemory(&wsaData,sizeof(WSAData));
' I6 }' n8 V7 p   ::ZeroMemory(&server,sizeof(struct sockaddr_in));
6 k; q5 z; f. g7 a4 A( q& s}* z  ^1 F! N4 e# s3 @' l3 X
void __fastcall TListenThread:oError()3 I$ U/ }- V- u9 f# j8 i/ N% u
{& k/ R. u$ v$ v2 f, t
   if(m_Socket!=INVALID_SOCKET) closesocket(m_Socket);2 a' N+ |) h9 L+ A7 Y9 O5 ^
   WSACleanup();
6 c8 d: g3 |2 I2 j$ X3 k& [, F   return;
3 y. l2 X4 B/ v; {* A4 w}- m( O# `) O% I( v; Y7 j
void __fastcall TListenThread::InitSocket()
3 }5 I* g* ~  @( x; s+ M$ _{: |! k. a/ f8 ?
   WORD version=MAKEWORD(2,0);9 D% `$ n; b) ?4 G4 O' S8 }  Q
   if(::WSAStartup(version,&wsaData)){4 p9 L( f6 v; d+ s2 s
      sprintf(szTmp,"Failed to intiailize socket,error no:%d",::WSAGetLastError());
* u, n( \# r( b* m$ N0 C: B. V- G      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);- [5 P- W% o+ X' H' N( w! w3 |% [
      DoError();
: l, @" L" [$ j      return;
( b3 T2 [0 \; d9 T, V6 Q7 Q6 }: [   }
" \! H) C( A& _9 d, K}
! _1 Z* e* A' A8 f7 P$ ?8 Cvoid __fastcall TListenThread::CreateListenSocket(). Z; ^1 O" v" P8 f% A8 P3 B
{& B: E* X2 _; j
   switch(m_Protocol)
) {0 J( s4 i- u* m. x+ I) f) y% p   {) ?$ O* k: `$ U0 @" ^
      case UDP:
! M* U2 l$ q5 _# b3 K8 w/ R         m_Socket=socket(AF_INET,SOCK_DGRAM,0);
; u' F& \- }# s* P: m  V, V         break;
! O! Z( ^: w9 X4 |7 c      case TCP:+ c) F4 m! w2 ?/ S; w* z' f
         m_Socket=socket(AF_INET,SOCK_STREAM,0);
. |0 O, |% G! _, Y: A) q         break;
- ]# _- t" W5 e8 o" o+ {/ U% ~      default:
6 K: U, S0 I& N/ ]         sprintf(szTmp,"Error protocol!");
7 v/ o/ ?. O# r( s$ @8 i/ r         ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);
8 p0 ~, N0 [$ k( f6 n         DoError();1 j/ _) R% |) \
         break;
6 V$ f9 K, A- X& Q! F  T5 c   }
' k6 Q  O* R8 g+ t# m   if(m_Socket==INVALID_SOCKET){
2 _* ]2 {  E" |' j      sprintf(szTmp,"Failed to create socket!");. C4 m* L: t" _: R; F
      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);3 i0 A" v: e* m$ w, {
      DoError();
: i5 v; k' ~! B& s      return;
  j, Y' x/ ]/ g0 ~   }
% o0 v  D% `, M4 V0 E+ m4 _}
( F$ Q0 m& Z% p# x. y3 @6 Q" nvoid __fastcall TListenThread::SetListenSocket()" D* h4 `3 M7 a3 H
{
/ A# [! M+ f6 u0 A# t4 T   server.sin_family=AF_INET;% y0 ~, X' I& C  R) ^  H
   server.sin_port=htons(m_Port);, U$ o6 |3 f$ e/ M8 d
   server.sin_addr.S_un.S_addr=INADDR_ANY;
) k( L2 ^4 h+ x   int NewOpenType=SO_SYNCHRONOUS_NONALERT;% |5 {" {  |! M7 w9 O8 @0 R5 G+ B
   if(setsockopt(INVALID_SOCKET,SOL_SOCKET,SO_OPENTYPE,(char*)&NewOpenType,4)){
$ d/ Z" q% W7 l; f* p: N# }      sprintf(szTmp,"Set socket option error,error no:%d",::WSAGetLastError());% a7 Y4 R* f1 \8 s  Q. w
      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);
5 J( t6 |! q$ n* G. }  x# ?      DoError();( F3 E' K9 j! J; R4 l  i% y& Z6 @
      return;! m1 c5 t' K, x! u1 _
   }5 u2 p+ \+ H' k: A& D
}- u2 T6 O* H- ]* j+ \. N
void __fastcall TListenThread::BindListenSocket()1 V+ X3 i/ y/ t, V# Z
{5 S; B; ^+ q5 r: D& l
    if(bind(m_Socket,(sockaddr*)&server,sizeof(struct sockaddr_in))){
- [% J, Z* N3 k4 }      sprintf(szTmp,"Failed to bind socket,error no:%d",::WSAGetLastError());' S) Q6 t# C* I% G) h; K7 x" D& _7 Y
      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);" f% `6 u! g5 b
      DoError();0 p7 O' d/ w# @& V, y
      return;
, a! V) U! ?! l! m9 Q3 u  l8 a- X   }
+ ~9 {. d0 G  v1 X; q1 R2 I; C  E! E6 V" @
}. N! ]2 ?! w/ e8 f! p
void __fastcall TListenThread:istenSocket()
1 m0 g3 p; [" E- r: M& L  w{& _4 F& A% s* G) j
  if(listen(m_Socket,SOMAXCONN)){2 V' K# [3 S3 Y( k7 S2 ^. @
     sprintf(szTmp,"listen error,error no:%d",::WSAGetLastError());' T9 Q- O/ v  V2 [  T' H
     ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);
4 `1 m. R- W8 n6 e, W% X: g8 l     DoError();& ]* {, y, l/ j* B8 C
     return;9 l" l  U+ G- F" I5 x% A# E! [0 R
  }- b. {9 b: p3 [) D0 g% [
  //Determine whether there is any connection
) V/ n3 t9 n8 j3 d) l. z, e. B  FD_ZERO(&FDS);9 [) U% p# B4 y7 j) j; d, a. ]
  FD_SET(m_Socket,&FDS);
4 o9 ~1 b9 q. m" W: P5 C}
7 }* {7 f% k# i4 Q9 }$ _( Y. Ovoid __fastcall TListenThread::Execute()( i" ?. |5 [5 z/ P# T
{
  c0 e! B. @: z) w   char buf[4096];# M7 l5 }# f% V1 A& s! b: A
   struct sockaddr_in from; //for UDP
# U. U2 A% Y- l7 {: z1 t# e1 @   int nLen=sizeof(from),nSize=0;  //for UDP. ^! H8 E6 s+ t0 e
   InitSocket();5 v5 @0 t( \$ b7 C' K
   CreateListenSocket();
3 _) }! P) F) r& B+ h   SetListenSocket();
) b$ d& R% z% I  }0 p5 G1 U   BindListenSocket();
% n8 z% h% c, }! A- k+ G) V8 O   if(m_Protocol==UDP){
$ r$ y/ q) Z; d7 y: @6 ?      while(!Terminated){* i3 d" ]7 K0 C. p6 X5 K- {
         int nSize=recvfrom(m_Socket,buf,4096,0,(struct sockaddr*)&from,&nLen);2 X# n: m6 ^( A
         if(nSize>0){1 X% i4 `* l7 v& ?* ?; g+ T
            buf[nSize]='\0';0 H6 e7 V9 h& u" @
            PSTNForm->Memo1->Lines->Add("Received Length:"+String(nSize));
, [* V8 S' q& k, k. g, j+ v3 _% c            PSTNForm->Memo1->Lines->Add("Received:"+StrPas(buf));
9 U5 K( V$ o3 j7 U) U5 _5 r" O            ::Sleep(100);- r* k) ^: b& S3 k9 C( o5 I5 j; Y
            sendto(m_Socket,buf,nSize,0,(struct sockaddr*)&from,sizeof(struct sockaddr_in));
& `1 w/ B7 l6 k5 L         }4 g( D9 f3 o; }/ _/ _' c
         else return;9 I& I6 ], p( g7 m% R) {

: v+ z$ O/ e/ n/ t# ~& f3 ~2 t      }* \  c- \+ S0 i9 L- Q
   }
/ l6 A( ~6 r0 o   ListenSocket();- L" E9 R5 R) A% {
   struct sockaddr_in client;2 H) n6 S4 y# v3 ^! n/ ~7 O6 X
   int nLength=sizeof(struct sockaddr_in);* \* {* `+ d! N
   while(!Terminated){5 I+ P' ~0 f. C- ]( i/ V
      int nError=select(1,&FDS,0,0,0);" ^$ U$ ^+ A. o
      if(nError<=0) Terminate();5 S- {$ T' [) F
      SOCKET m_AcceptSocket=accept(m_Socket,(struct sockaddr*)&client,&nLength);
! x/ ]* |. N$ E; o" Q7 L+ Y      if(m_AcceptSocket==INVALID_SOCKET){; f9 R9 {5 Y0 ^5 a1 ^
         sprintf(szTmp,"Failed to execute accept,error no:%d",::WSAGetLastError());
$ N6 R7 h) L( m         ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);8 V3 ^1 h1 L2 {& y+ Q5 K
         DoError();+ c3 t  N9 W. B4 X5 |- h% ]0 y
         Terminate();
! D5 V2 C; G: w7 ]& i         return;. K" \% m- w: I, g7 Y8 r# e0 i
      }8 ~9 C/ i+ I" d/ M1 S! a/ C2 ]5 ]
      TCommunication *pCThread=new TCommunication(m_AcceptSocket,FALSE);) [9 b. k5 k9 J3 L
      pCThread->Terminate();- n4 z6 K- P% w3 K5 P! ?
      pCThread->WaitFor();
8 ]! D) y* S3 v1 Q   }" q9 ~6 l1 u7 T
}; H3 y8 \0 S; m8 A
//************************PSTNForm*********************************************//
6 x7 ~2 L# t" z__fastcall TPSTNForm::TPSTNForm(TComponent* Owner)
" g: Q8 g2 \* _. d! R& }   : TForm(Owner)
! g$ C6 u( N! p3 g! O# Y0 s{
# S* e$ t: o/ `4 n! Z}) L2 x8 B$ V( [5 r2 }1 D. j
void __fastcall TPSTNForm::Button1Click(TObject *Sender), Q3 W& f: h! u' a; S! r2 ^
{* F; L6 r: F* q
   Close();' v; `$ {& F* E
}
9 n8 T5 ?: S+ z  Y6 yvoid __fastcall TPSTNForm::Button2Click(TObject *Sender)( C6 O0 ?- l2 |
{
. i% Q3 V2 |  u& O5 I   if(pThread){+ W! ^- n9 r8 N
      pThread->Suspend();
! X% {0 H' }; O+ u. v  n4 K      pThread->Terminate();
" q- x1 P1 z2 B, ]: @7 k: m      delete pThread;
. q  w% p  i  q2 x1 T      pThread=0;
4 n1 t% E+ V/ \9 s" C9 _   }
! c4 Q7 B) `* z) D4 H9 T   UINT m_Port;' \  z- j3 `! l* g% r7 b  ~
   try5 i/ r3 `% h0 _7 r# ]) L
   {( [* E' `9 i* A2 c" t; k, ^4 ?
      m_Port=Port->Text.ToInt();- P% a' K& r, E/ a
   }5 l0 O$ T. h4 h6 R4 C- Z2 q1 D# m6 F9 v8 e
   catch(Exception &e)
# e- |: W5 e! {% X- o- |   {
8 ~7 w+ T' u$ u0 O( |      ::MessageBox(0,e.Message.c_str(),"Error",MB_OK+MB_ICONERROR);. |* i( ^+ R( v" E% e$ N1 ]1 Z% I
      return;: ^0 U/ g" y0 S8 E4 h- D
   }- u& G& W1 o/ @/ a# n8 {; g1 G7 A
   PROTO m_Protocol;
+ ^! I( M4 c# x8 ?4 [3 j   switch(Prot->ItemIndex)8 A7 h) H. D/ c( d- }$ t
   {% x. \) K0 b. ]; ~% K. V3 M. S- t
      case 0:6 i7 j7 r) W8 j: Q" G
         m_Protocol=TCP;! v2 [9 c6 L! h) c4 {; A
         break;$ Q0 `0 l1 U1 ]1 c8 Q- ^: z
      case 1:& ?# ?; q! T$ {) }1 ^( l( C: O0 u
         m_Protocol=UDP;
. M, ]3 ?# _( \6 ~2 k         break;
: Q0 m3 Q# s; `      default:& r- N7 u$ V( F/ f
         break;
, K8 X" F* P$ j" S9 K   }
3 g2 Q# ~0 t3 ^3 R2 U1 J/ O   pThread=new TListenThread(m_Protocol,m_Port,FALSE);
( a- r1 k- I. r' t   //pThread->Terminate();1 a) V" m# v' ~& A% ]0 F6 l
}6 |, Z' n+ _9 g6 V1 I; a
void __fastcall TPSTNForm::FormCreate(TObject *Sender)5 j# A! h6 u3 a/ F* h; s9 W- [
{
0 O% I* i& ]  {- O   ::SendMessage(Prot->Handle,CB_SETCURSEL,0,1);% k0 Y5 C0 D( x3 \5 @) i# L
}& r" x* D) y% t4 V

  x6 ?8 k  X1 @8 Jvoid __fastcall TPSTNForm::FormDestroy(TObject *Sender)2 O/ d( e2 U2 F: T! x
{
* S. Q4 K. ]$ z* l2 I% F4 l( ], ^& g7 Y   if(pThread){) S+ C9 n5 r6 `, g, n
      pThread->Suspend();
3 `, m) e. q; N+ ~      pThread->Terminate();}
6 G+ f1 m5 M/ }8 C; T( e}
; O7 u# H- n0 z% J8 a. z$ t1 d上面的代码,各位可根据自已的需要和针对自已的应用,在数据处理方面加以改进就可以了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|宁德市腾云网络科技有限公司 ( 闽ICP备2022007940号-5|闽公网安备 35092202000206号 )

GMT+8, 2026-5-4 16:52 , Processed in 0.023496 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表