找回密码
 注册
查看: 4367|回复: 0

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

[复制链接]
发表于 2004-2-15 14:01:13 | 显示全部楼层 |阅读模式
在CB中用socket api来写网络通讯程序* B, M  a) d+ }
作者: kingcaiyao ,如转载请保证本文档的完整性,并注明出处。
, _$ ^, \( ^% Z. W欢迎光临 C++ Builder 研究,http://www.ccrun.com/doc/go.asp?id=569$ a. R& ~; `) s7 f0 L0 x
本文转自csdn,作者:kingcaiyao
" i8 r. K8 Y! E/ k$ R0 Y! F* o1 }原标题:在C++ Builder中用socket api来写网络通讯程序(同时支持TCP和UDP协议)
% v# |& v% H# c: j1 q3 _( r2 U原文:  http://www.csdn.net/develop/read_article.asp?id=19883" q/ W- Y6 |+ X. ~

% ]/ o% E; q" m2 U/ a: @0 d9 C+ L1 G6 ?1 K8 m- s& b$ w& V$ c( ?% j
在7月4日看完sockcomp.pas后,我决定用socket api来写一个客户端和服务器并且同时支持TCP,UDP协议,于是我就去做,现将代码贴出来(已调试通过)
* W$ _/ M& \3 Q; F1 P6 ?0 U. `Socket api Client:* E: {$ I8 @: h+ r4 @) W8 E! z( t

# }3 k4 g- @* x6 }#ifndef UDPClientH  t% w) \; K. B8 }2 T7 Y$ Z+ @
#define UDPClientH$ L! g5 j  R/ |( {, @1 e
#include <Classes.hpp>
/ L% `- V5 {0 @% C#include <Controls.hpp>
) @6 D  V8 B3 ~1 J#include <StdCtrls.hpp>
# c  P/ }3 X0 P  C#include <Forms.hpp>
# M+ A8 W. r$ [/ h9 T#include <stdio.h>$ b$ n4 z. ^* P  z0 q
#include "CCEdit.h") `8 w6 L% ^8 \3 W6 _
#define WM_SOCK WM_USER+100* h1 a" T$ S( j5 H
class TLANForm : public TForm+ X. j+ S, _3 h, p; q" [+ {2 d: m+ b
{% y5 ]* ~  ~% t8 Q$ L+ S
__published: // IDE-managed Components
0 I* p6 c7 v6 P) Q   TEdit *Port;
2 f: F: t* }0 J% J& v$ ?   TLabel *Label1;
5 N1 R3 e* |+ r$ a   TLabel *Label2;
; c$ G" V& |/ o; `" V8 A) @6 a   TComboBox *Prot;
0 V1 K) M; E9 b$ _   TButton *Button1;
/ ~! S& H, }& p0 S8 |2 F   TLabel *Label3;8 N- X* b6 n1 ?: B, }  G9 K# {
   TEdit *Addr;
% A, [6 Z4 Z8 n" }. z   TCCEdit *TxtEdit;' m$ t" k, a: v8 c% f7 G
   void __fastcall FormCreate(TObject *Sender);
# a3 W! U. S5 k) ~  J1 F   void __fastcall Button1Click(TObject *Sender);/ {( a! H2 K- B# P( v3 F+ Q
   void __fastcall FormDestroy(TObject *Sender);
) C+ ~1 b! A4 t/ z! N/ Uprivate: // User declarations4 [" O: R* G5 d* B6 f" G
   void __fastcall OnRecv(TMessage &Message);
5 Z* y! _+ I0 t# u! \public:  // User declarations
. e: U! y- j- K. ^5 [   __fastcall TLANForm(TComponent* Owner);4 ]0 v$ F7 r0 S
   BEGIN_MESSAGE_MAP
/ F& Q! [8 r* |& D/ ^0 h7 i. b- V/ ^      VCL_MESSAGE_HANDLER(WM_SOCK,TMessage,OnRecv);
7 S; @' z! ?3 X   END_MESSAGE_MAP(TForm);8 q2 \/ O9 z4 z+ m: s' p
};4 F0 z3 H9 w/ Y9 m4 F8 }
extern PACKAGE TLANForm *LANForm;2 o$ t2 c/ u# g7 Q7 Y
#endif
% Z" E' M# D( l1 }+ O+ d8 R) m/ w1 D4 ]; k+ F. b

# F' p! d& J8 A" t7 u0 i.cpp File, _3 Z( O' ^% `+ O
0 [/ f4 U: i! @$ N6 R! [
#include <vcl.h>/ I/ a$ b. P( `6 E
#pragma hdrstop3 V' _; n4 x- B9 c* j& o6 c
#include "UDPClient.h"/ X7 b* r; ]+ p) O/ S' Y% u8 C
#include "WinSock.h"
$ A- S* M4 D* r$ m#pragma package(smart_init)
: F" ?2 ?/ V5 V! M% |9 F  V#pragma link "CCEdit"
( F6 T; Q2 M; o) q$ k! a#pragma resource "*.dfm"
, O. {0 E8 P2 ^" {+ r' p! UTLANForm *LANForm;
7 S( ?* d  |* ]( Genum PROTO {TCP=0,UDP=1};
5 g! T! G1 }# k! QSOCKET m_Socket=INVALID_SOCKET;8 F) e( L3 U! B) X5 v
PROTO m_Protocol=TCP;. t: S- D6 [7 D
__fastcall TLANForm::TLANForm(TComponent* Owner); }+ Q9 z9 y& a
   : TForm(Owner)5 @) p8 I1 E5 ~+ L& G1 b- k
{
) ]* a% G3 _" C; V
) f0 e8 F0 I) I, O}
- z9 y9 [) D% A) ^: H4 f) Fvoid __fastcall TLANForm::FormCreate(TObject *Sender)8 f1 l0 X- W% C4 z! m: y8 K
{  m2 s/ Y# P7 H$ m
   ::SendMessage(Prot->Handle,CB_SETCURSEL,0,0);8 j. J, c, X* g. O" a* X% D. X
}8 Z1 a2 j( k- K  x
void __fastcall TLANForm::OnRecv(TMessage &Message)9 N) y! m1 _; o* t
{
9 x& t' c; N# ~- d2 e- j5 r   char buf[4096];
& P. h) F& |4 i3 p% E1 G   int nLen;
# f$ c" O8 {, `2 y   struct sockaddr_in from;9 Q2 @+ ]/ {) N* }( x: M0 i1 }
   int nLength=sizeof(struct sockaddr_in);
$ `. R7 X  S9 j4 \+ j) y1 L. }   switch(WSAGETSELECTEVENT(Message.LParam))
. |* I/ q  w. c7 Y( V: }; F* b   {
/ I4 j* e5 g7 z+ @+ ^2 R) r- S      case FD_READ:  r8 g2 n* C/ \7 y. Z
         switch(m_Protocol)
; r6 j5 c  Z* \) g& S4 I0 s         {% u( y% W& d2 K
            case TCP:/ \# ?. V  m: v+ p
               nLen=recv(m_Socket,buf,4096,0);
  W; r6 N6 O5 D, O               if(nLen>0){! O* T! y6 b2 ~/ p0 s0 o
                  buf[nLen]='\0';
5 F. d5 T! U- J6 l                  TxtEdit->Text="Received Length:"+String(nLen)+"\r\n"+StrPas(buf);6 J+ e9 K& w1 Q4 {
               }* {1 Y7 U# i8 m7 F6 k0 `; Z
               break;
& n+ N7 f( P% J8 ~7 K" H' B% {            case UDP:
4 e" E: R% E; W8 O& x- P               nLen=recvfrom(m_Socket,buf,4096,0,(struct sockaddr*)&from,&nLength);
2 |5 V; k0 u+ P) G               if(nLen>0){0 Y$ p; T* Z, q
                  buf[nLen]='\0';( X7 f' f8 Q% @
                  TxtEdit->Text="Received Length:"+String(nLen)+"\r\n"+StrPas(buf);
. P2 r4 h, S' m2 A! G% i               }! h4 {& S: i7 A0 Q# A/ y
               break;% T0 r3 M" ?; v( t% S- [
         }
, \  g2 p/ f& {4 c( ~3 ]         break;* k: H/ L; @: t) `$ ?; H9 X/ I
      case FD_CLOSE:7 R7 [. m5 U0 t+ W# b* \
         closesocket(m_Socket);/ a% E% t# Q1 C5 L6 m
         break;
+ Q5 O4 M1 I. A; N   }
+ [. G. E9 ?4 `: W9 c3 G}" Q" i/ [7 K/ b7 m

( B0 s& |( `0 @. [5 lvoid __fastcall TLANForm::Button1Click(TObject *Sender)7 I& w. M6 I0 ~- u0 q- [% [4 W
{: |5 G. L3 A% E5 ^! s8 t
   char szTmp[256],buf[4096];
  _" s  A+ l! Q" ]   int nSize=0;
, B* y7 j( S% P- ^' K   UINT m_Port;
) w/ r( u/ O  K' P1 _5 S   AnsiString addr;
& j3 g0 o, n+ Y1 |   addr=Addr->Text.Trim();
: j/ q! w- [1 k   if(addr.IsEmpty()){$ S- y/ K! y* Z7 C) r: m
      ::MessageBox(0,"lease enter the server IP!","Error",MB_OK+MB_ICONERROR);
- N8 T& i/ x8 g8 U# J! o1 @      return;
+ j8 t) a7 n5 }# D# j9 G   }3 g, j# @6 _( W; r  Z% j, h
   unsigned long nAddr=inet_addr(addr.c_str());$ V# g2 a; E/ c, d
   if(nAddr==INADDR_NONE){
3 P. H8 w0 o* b: e+ e" `      ::MessageBox(0,"Bad Internet IP!","Error",MB_OK+MB_ICONERROR);2 [0 w" l. b7 }# P1 B. o5 p* v0 S
      return;}% }* u" }5 e7 }: o1 I8 L

: b& f, W* V) r0 ~4 ?: J: D! f   try
* i- P/ ]6 M6 z9 g$ K. u   {3 I- Z% K) r) z. D6 N3 R
      m_Port=Port->Text.ToInt();
' C: b5 n7 f1 H4 K) }* H   }
  C8 z" s+ b' n" S( j   catch(Exception &e). a- C  \9 }; D5 ~3 q
   {  {  Y3 E( A% l; Z" k9 T0 Z
      ::MessageBox(0,e.Message.c_str(),"Error",MB_OK+MB_ICONERROR);
! _) _( ?$ F  Z9 l. u; @      return;
5 a( Z( K* p% F7 k6 f# {0 b6 k   }( j. Y( ^' ?5 |7 p8 c
   switch(Prot->ItemIndex)
1 A7 Q  C) z5 y; V  i   {
) s. \2 @" u3 k: w8 A" L$ U      case 0:
' H9 O: m" u/ L5 Q7 X8 T         m_Protocol=TCP;3 L  p( ]) a6 w0 @' |5 g# W+ v% d( J
         break;
* y) f) o8 v; Y! D. r4 v$ y8 [" @      case 1:
" n9 ^) S6 i- l/ V         m_Protocol=UDP;: g( e/ a8 K$ m$ \  g: k, ?
         break;
" u; {  k7 r* n) R/ }   }
: N5 J$ R* l4 {1 I+ [' L   if(TxtEdit->Text.IsEmpty()){& Y% M% h. j4 o) q! l9 J* {1 D
      ::MessageBox(0,"lease enter the text you want to send!","Error",MB_OK+MB_ICONERROR);3 R9 x' X- F$ C6 K
      return;}& u8 Q" X6 q1 M6 J+ C
1 `5 x  T2 Z, `" P: t! x! w
   //Initialize Winsocket* d" M; n/ o  g9 H: C: l& F9 h
   WSAData wsaData;
8 R( [- n- ]+ m   ::ZeroMemory(&wsaData,sizeof(WSAData));
# q& X: ~0 E) n4 w. K6 S   WORD version=MAKEWORD(2,0);
# Y3 m- {; ]. Q# ?. e   if(::WSAStartup(version,&wsaData)){
; o( _: t3 G, b' Y6 `$ |3 v; z      sprintf(szTmp,"Failed to initial winsock enviroment!,error no:%d",::WSAGetLastError());
& r7 x$ ?$ i# ^: e( a      return;}8 ~- m6 p. G0 ]( k3 \; r
2 ?1 d3 g  O7 i4 Q
   //Obtain the active connection8 q. V) ]; t4 z
   char ComputerName[255];
. d( {8 S' t8 ?7 x3 E4 |- N: Z/ Y   gethostname(ComputerName,255);
3 Q0 v  S) v7 e7 v% O6 J3 @7 J   struct hostent* he=gethostbyname(ComputerName);
- _. E* M1 W1 P   if(!he){
+ [# Q6 }. v& v/ d7 h  u6 K      sprintf(szTmp,"Failed to get information to host!","Error",MB_OK+MB_ICONERROR);. A& o5 _3 ]/ Q( x  g
      ::WSACleanup();. o( _* {- j- l
      return;
5 l9 o, G; n: i   }7 U$ @+ H7 H' X
   //create new socket7 f. F# G3 k. j! O/ u
   m_Socket=INVALID_SOCKET;
3 }2 m5 H: \3 c6 L* A   switch(m_Protocol)
. @$ Q6 x* X1 d# i0 z" _   {
  W% I8 a- v( u/ U4 F      case TCP:
* r6 |8 p9 E9 i4 |  B9 ^7 i         m_Socket=socket(AF_INET,SOCK_STREAM,0);" g- r2 X$ `* a& A" n+ k
         break;1 \% m; e3 @2 u; p
      case UDP:4 q3 G9 E: T. w9 B' y; a
         m_Socket=socket(AF_INET,SOCK_DGRAM,0);% `0 L& o  f! m& y9 A5 z4 ~
         break;! ^. P' y" t! w) b1 C
   }2 r/ w2 Z- `# i) N8 n( ]; r. Y
   if(m_Socket==INVALID_SOCKET){0 v' K$ f  d1 u9 `6 \) N. W3 m
      sprintf(szTmp,"Failed to create a new socket!,error no:%d",::WSAGetLastError());: ]5 Z* V7 l, D( }. W1 F! s4 C3 i
      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);
$ ?& e3 J$ z6 E      ::WSACleanup();
5 h# h! o& O+ V5 a% B      return;
8 E) ]/ j) j/ [+ h2 j, M   }
* @: z2 A6 ^4 t4 \+ y" N: S   //bind socket
+ N& O7 O) `+ |- f* z   struct sockaddr_in client;' T% S2 W3 i4 O: ^- F) l8 R  G7 d
   unsigned long nClient;9 O1 B  h. p5 @* o' k
   memcpy(&nClient,he->h_addr_list[0],sizeof(int));% m0 Q& `7 L! W2 V
   if(nClient==INADDR_NONE){7 e3 c  [. k  Q
      sprintf(szTmp,"Failed to obtain the local machine's IP!","Error",MB_OK+MB_ICONERROR);
6 C1 _, X) j7 y! Z% T8 M0 L: Z      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);8 _# G$ D1 Z/ v" P& A! `
      closesocket(m_Socket);6 K1 [3 ~2 W5 Y. ^* o) m
      ::WSACleanup();
3 E% Q5 r$ {1 u8 c+ q      return;2 A# x8 u3 ]( M- T$ w* u# N) n
   }
/ ^! c8 U5 Z% g# a* y+ Y1 G* Q! L   client.sin_family=AF_INET;# c, ]* G2 J/ a* Y- {
   client.sin_port=0;' r2 W: ~* B- M. }7 K2 S( r" ?" X6 \  P
   client.sin_addr.S_un.S_addr=(int)nClient;
3 b. `# J( a4 {/ b! @, _& }   if(bind(m_Socket,(struct sockaddr*)&client,sizeof(struct sockaddr))){
8 \, x+ A( y2 R9 o3 d+ _: i      sprintf(szTmp,"Failed to bind socket!","Error",MB_OK+MB_ICONERROR);
+ Z  R+ h5 ^6 H0 p1 b      closesocket(m_Socket);3 y4 h2 P! t+ l1 `+ v0 b# T" |$ ?
      ::WSACleanup();, P% m) x! e8 m  M- J$ y1 n
      return;}6 N4 H" Z2 C: S) {) {3 |
   //connect socket
8 x' l5 C3 ^. W   struct sockaddr_in To;
. h9 u: Q5 V4 t   To.sin_family=AF_INET;( ^1 X4 W) q9 n0 h1 r  L
   To.sin_port=htons(m_Port);/ T! ?8 S4 l1 j( s
   To.sin_addr.S_un.S_addr=(int)nAddr;
  W* ^: t6 r/ }9 D0 b( K: G' s   fd_set FDSET;% C/ }0 R  d  t
   FD_ZERO(&FDSET);, Z  m! A9 R9 u: C' V1 c
   FD_SET(m_Socket,&FDSET);
; H8 g! z" u. ^& W$ M0 D' W9 c: _0 B2 z
0 O, u1 q2 {/ C7 C
   if(m_Protocol==TCP){
9 X  ~0 M4 ?! X# t      if(connect(m_Socket,(struct sockaddr*)&To,sizeof(struct sockaddr))){3 j4 X, g' G4 ]6 J+ R' ?
         sprintf(szTmp,"Failed to connect the object!,error no:%d",::WSAGetLastError());! M2 }" U9 x# k0 d
         ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);
- {- a; _( K" c0 w6 \         closesocket(m_Socket);. ^  ~' g6 {- `8 t2 T
         ::WSACleanup();: s% ~0 U" u/ x2 t2 B) ]- |3 t/ \
         return;4 f8 P8 i, L& {) E
      }, g( @( \2 ]) B; s# }; r/ v
      int nError=select(1,0,&FDSET,0,0);
  s, E, P( p% Y* }0 Y+ `      if(nError<=0){7 p5 C% P& `8 o4 e4 C: _
      sprintf(szTmp,"Failed to select socket!,error no:%d",::WSAGetLastError());  m6 `' `/ g/ Q) S
      closesocket(m_Socket);0 ~( X7 c$ Z1 L: m$ P% U
      ::WSACleanup();
5 e  V: ?2 Z  T1 d, N0 s( L      return;}4 I* Z! O% ]1 N' T/ D
   }; Z6 i1 t4 x! O: W( `( S
   //Send data% H4 ^8 p7 o8 H8 m8 J
   int nLen=TxtEdit->Text.Length();) _- `7 ~6 l: I
   if(nLen>4096){  F& ~: {% _( v' u, \
      sprintf(szTmp,"The buffer is too size to send,it shoud not be more than 4096 bytes!");
, u( n) `9 _* w* T$ X      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);
, R; r6 E7 l% ^# \" A      closesocket(m_Socket);
0 s+ }' I2 S3 m) T      ::WSACleanup();
3 k' h% B& Z; D, z1 T      return;# v& ~$ x# e* G
   }
; I. W3 O/ O0 E- G+ q   strncpy(buf,TxtEdit->Text.c_str(),nLen);
4 i3 Q+ v5 r! S4 B1 n0 B   switch(m_Protocol)
5 N" {) A& a& A' b   {
6 K( e  A& {& y$ K      case TCP:+ l' w2 B' D7 y% m9 K3 H: N
         nSize=send(m_Socket,buf,nLen,0);& F; d# @# T' R5 N# j
         //ShowMessage(nSize);7 W/ K% P- ?; B
         break;1 v* H2 q0 ~+ w# B  f7 e* q% [
      case UDP:; r% P0 o6 I! n8 u
         nSize=sendto(m_Socket,buf,nLen,0,(struct sockaddr*)&To,sizeof(struct sockaddr));. P! V% d) D. |
         //ShowMessage(nSize);
* A# a) a( w& x4 G- R. K/ o8 B         break;
/ i) P- p# m+ e% I  S# ~* s- Y/ X. w
   }8 z; z' [- z) ~7 I# u) |5 H6 ~
   if(::WSAAsyncSelect(m_Socket,Handle,WM_SOCK,FD_READ|FD_CLOSE)){
- K* D9 {+ t/ x3 P* z- c. b  x      sprintf(szTmp,"Failed to register socket event!,error no:%d",::WSAGetLastError());' B2 k% E: A# M& f
      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);
6 r2 {; L- n! l( E1 z      closesocket(m_Socket);
- p- V; w4 W* ^      ::WSACleanup();' e" t9 e6 A" O- {
      return;}5 o4 G" m+ @1 G- ~( D1 r  c  ?
}
6 l8 b3 b8 Q! g; mvoid __fastcall TLANForm::FormDestroy(TObject *Sender)
: S$ S: Z, Y2 ^8 z2 e{7 u4 k/ A' B: p' G  h2 K7 A( s
   closesocket(m_Socket);6 f  }* v& W$ @- B9 O" M
   ::WSACleanup();. C0 g# p, B$ O; C* T8 H; I+ K  J
}, O* }/ @! R: l1 D9 H1 e
0 e7 z6 A' T; x) D
Socket api Server:! z% Z5 O9 _1 O4 z$ S
.h File
! l0 @( i. L" M; q3 I& X#ifndef UDPServerH; Y. ^. X) Y' V/ i
#define UDPServerH! K. F+ f) W& ?4 c5 D2 e" b' k, ~
#include <Classes.hpp>
, I: C- e' S+ n( `#include <Controls.hpp>8 m3 y& S! Z& k% G: G& k$ M
#include <StdCtrls.hpp>' v$ E( U9 h8 c# P# s3 F1 }
#include <Forms.hpp>
. R  F7 i+ E* K3 {( X. Q#include <stdio.h>0 G  R; r+ [0 o# v8 Q
#include "WinSock.h"
, e* g6 ]% D" j( k% G5 R/ v; o/*#define WM_SOCKET WM_USER+1000$ i. C8 e+ d6 E8 ^( O# V
#define INITSOCKETSUCCESS 0' D4 z6 `2 ?$ a; k; i  X
#define INITSOCKETFAILURE 13 E& u# P0 u+ L
#define CREATELISTENSOCKETSUCCESS 24 U0 G; a- Q8 F' g* M$ }! S
#define CREATELISTENSOCKETFAILURE 36 \1 Z0 M$ U; D* d8 o8 I
#define SETLISTENSOCKETSUCCESS 4
6 L: r9 d/ `5 T; a7 w+ y1 ~#define SETLISTENSOCKETFAILURE 5
+ x3 L) s2 e' N: p2 o( m: C#define BINDLISTENSOCKETSUCCESS 6" a) C4 X+ N& d7 N" h2 \" [% r" f
#define BINDLISTENSOCKETFAILURE 7/ x1 n1 {8 C- X+ }+ J" ^9 p  T) }
#define LISTENSOCKETSUCCESS 8
/ l  W4 v+ p) m+ O4 X#define LISTENSOCKETFAILURE 9( {' |2 J0 O" j8 J/ l
#define ACCEPTSOCKETSUCCESS 10& @2 u) u+ l$ O2 B6 p) L
#define ACCEPTSOCKETFAILURE 11
0 i2 ^% q6 a/ t3 W*/
0 _! A. }- F: jclass TPSTNForm : public TForm
, K( F/ E5 P1 V  x% n" b, g{
* n1 A0 a' L- o  [: {__published: // IDE-managed Components6 d6 L$ O- @7 R& n
   TEdit *Port;. j- B! d3 z* R1 Z
   TLabel *Label1;
$ }. ]8 R9 `8 Z" i7 D( h( N3 [% b   TMemo *Memo1;/ v- W  b& o) g  j! n* j! X
   TButton *Button1;& y3 X  j8 J) I: q& R" W
   TButton *Button2;
3 ?) T4 Y7 b( S5 \7 W   TLabel *Label2;
1 Q+ o3 Y4 T4 @9 _3 y- w  @, {   TComboBox *Prot;2 \" W* `! s) u) l! `
   void __fastcall Button1Click(TObject *Sender);3 y6 ]" P4 N5 M% a
   void __fastcall Button2Click(TObject *Sender);, Z' j* e  Q' I- I
   void __fastcall FormCreate(TObject *Sender);
% w6 U- [. I8 q  y. D, ?   void __fastcall FormDestroy(TObject *Sender);
4 S9 i3 g3 i5 Y1 \private: // User declarations- t. i6 v& j/ s: {, Q7 {, |
public:  // User declarations- u% o/ O' Y% [4 @- A
   __fastcall TPSTNForm(TComponent* Owner);1 D9 r# d$ P8 _) u/ H# m4 d7 Y* y
};* ]) i& F4 k% }  k! ^& y: J( F+ y& e+ U
enum PROTO {TCP,UDP};
1 W& Q: n1 |$ ?/ M1 Uclass TCommunication:public TThread    //Communication Thread) i8 `6 B: N- J4 z! e
{
' s2 Z; r+ W3 w- p. f3 Fprivate:5 [3 b/ p; e8 v9 @, S$ ]3 |
   SOCKET m_AcceptSocket;  ^  {* k; {; l) _
   char szTmp[256];//ERROR MESSAGE- W1 p0 T6 B0 u) W
public:
, `! Z$ R% X4 ?) S9 q   __fastcall TCommunication(SOCKET m_Socket,bool CreateSuspended);! B7 T7 s! X% d2 [, d2 O" ^
   __fastcall ~TCommunication();" a5 |2 U0 R5 R0 @# g* l
protected:3 M/ k# R, E& t. a( U7 h
   virtual void __fastcall Execute();6 A; {. T! |2 v8 m9 H, b
};
5 v/ }+ M) l8 g" W0 Z4 y$ ]class TListenThread:public TThread //Listen Thread( `8 R& E: I+ A$ y: G* K! a2 g
{
& E: F! V8 W# L& n& D8 cprivate:
2 F7 c3 c, g! f2 D" p; f   WSAData wsaData;- e' u# E- \. d; U7 y  w% F
   struct sockaddr_in server;
4 I) r, K# b- ?1 ]) ?   fd_set FDS;6 B& G4 A* J1 ]+ |/ j: U+ l
   UINT m_Port;$ z' ?6 F4 S& d9 [! ]
   PROTO m_Protocol;2 g! _6 C/ d3 _' v
   char szTmp[256];//Error Message; w8 ~& O! R! ~
public:8 i8 I3 c8 T: \9 ?% W* d4 W! {
   SOCKET m_Socket;
& T: e! L) ]8 ~   void __fastcall DoError();
! B% o2 p9 p2 W. w9 B' y$ l   void __fastcall InitSocket();
2 }5 D" @2 ^8 K) r9 c   void __fastcall CreateListenSocket();: G0 l' }  G" b; v1 F5 u1 d
   void __fastcall SetListenSocket();
5 k$ G$ A% K/ `' w% a   void __fastcall BindListenSocket();
( W$ x7 }" p0 ]( H- s3 j; {7 s   void __fastcall ListenSocket();+ t$ _8 _3 `0 k/ |0 U
% ~/ `0 a4 M/ v5 }6 H
public:
, \6 R% h7 T* y   __fastcall TListenThread(PROTO m_ProtocolA,UINT m_PortA,bool CreateSuspended);
0 K  B$ |7 x8 ?: v7 l   virtual __fastcall ~TListenThread();
; p  H1 j. e% |- ]2 gprotected:4 r/ t) y  K0 b" ]" h
   virtual void __fastcall Execute();) g& g. B  M$ ^% G$ ?9 m
};3 |" ~: ~% O' K3 K! K% e" Y) _
extern PACKAGE TPSTNForm *PSTNForm;
5 E' z* g' f3 H- y/ a% _3 l#endif/ i) C- O1 `4 V$ ]1 M( ~5 O" o  P
.cpp File0 n2 H" j: X" _# a6 Z" Q3 ^7 g
#include <vcl.h>
: R& }* m) F2 R9 ^; C" U( q, ]#pragma hdrstop
1 ^- C; n7 {0 \7 L$ u#include "UDPServer.h"  C! h+ b6 ~. u
#pragma package(smart_init)
1 }) m* Y" B6 `' q( d9 Q; M#pragma resource "*.dfm"! U' N( R% S8 d# @7 b( P8 g# A
TPSTNForm *PSTNForm;
- p( R9 |  S/ @) nTListenThread *pThread=0;
4 c' _/ ~/ `: L' K: u1 }//******************************CLASS TCommunication For TCP****************************************************
) E% D3 E) Z' `__fastcall TCommunication::TCommunication(SOCKET m_Socket,bool CreateSuspended):TThread(FALSE)
, S5 U+ N# v0 A{
' _* y/ |  L! w* A$ q. l% L& U   m_AcceptSocket=m_Socket;
2 _4 a1 s# H1 V' u( W   szTmp[0]='\0';0 |$ q9 x. M9 S5 F' H
   FreeOnTerminate=true;
6 `7 O8 t" d# _! _' t}- Z  ?9 R1 T$ {) S6 m: @+ g9 B5 d% o
__fastcall TCommunication::~TCommunication()
& K1 J! j$ p# t! r; q' u1 C{
7 v7 s8 x6 h, g) T, b! V# L  // closesocket(m_AcceptSocket);9 i( \1 @4 `& E1 o) ^8 }% s
}
* n1 h' t, _9 J7 y: m6 U8 f% p2 mvoid __fastcall TCommunication::Execute()0 I$ m% B% _" q1 u* V; m8 `4 w
{9 `2 K6 h/ v  o- ~( a6 d
   char buf[4096];
& |; b+ C. I2 t  _. m   int nSize=0;8 [, P, N. G2 ~3 A* ?* q9 V
   nSize=recv(m_AcceptSocket,(char FAR*)buf,4096,0);
5 _0 }% f3 k& w+ D# Y8 g   if(nSize>0)
# f. A, x  X. p4 z% x4 a   {
$ m4 s1 w1 V9 g5 c* X8 z6 X. S      buf[nSize]='\0';! U1 r2 B3 p2 z& @1 g' I
      //Display% w6 N7 h% `0 C5 ?" m5 g
      PSTNForm->Memo1->Lines->Add("Received Length:"+String(nSize));: e& g/ `: o- n: M
      PSTNForm->Memo1->Lines->Add("Received:"+StrPas(buf));4 I# n* k% V: `4 `! {' D0 D
      //Deliver/ X3 j/ |1 q, b4 ~3 E% {1 `
      ::Sleep(100);, _/ S5 I- R4 p/ j2 M
      send(m_AcceptSocket,buf,nSize,0);
9 F2 }1 t$ V( B' \   }& y6 y, b& _# \; R2 ]" }9 R
' ]1 u2 P) m8 N
}1 m9 x& T, N- G) z
//******************************CLASS TListenThread*****************************************************: {  e% p* b1 O# K
__fastcall TListenThread::TListenThread(PROTO m_ProtocolA,UINT m_PortA,bool CreateSuspended):TThread(FALSE)8 n; ?1 |/ {) C! E* g
{
3 s9 }  Y: d! I- y2 x   m_Socket=INVALID_SOCKET;, q0 r! H. X! S* i8 J
   m_Port=m_PortA;
; ^1 b3 Q' E* E/ R* ^; B8 ~   m_Protocol=m_ProtocolA;& h+ {9 {/ S( A+ p+ l# I, J
   szTmp[0]='\0';/ _: M7 ~2 J" p9 u  G& r4 H' m
   ::ZeroMemory(&wsaData,sizeof(WSAData));
8 W7 t4 u2 }* D$ U, r7 X   ::ZeroMemory(&server,sizeof(struct sockaddr_in));0 w& l) u1 ]5 R+ Q
   FreeOnTerminate=TRUE;//Automatically delete while terminating.! I" J: n8 M( \5 P) ^7 T) F
}
3 U" w3 Y/ M$ a__fastcall TListenThread::~TListenThread()
  J. U6 a: R1 g" i) T+ c{
/ E/ r9 ?5 b8 Z4 O9 ?! M, ^$ p   closesocket(m_Socket);
7 v* u0 k1 k  m9 P2 Q6 W   ::WSACleanup();
7 Z/ \, Q7 j: o( T   m_Socket=INVALID_SOCKET;
" X" f1 v  c7 H   m_Port=0;
& q1 R7 W8 f6 ?" K8 }. e+ b   m_Protocol=TCP;
6 @4 ?9 d. [) P   szTmp[0]='\0';) @3 }6 m4 r8 ~# `5 d
   ::ZeroMemory(&wsaData,sizeof(WSAData));0 E# A( b. T/ a' P/ l0 q0 ^- E* u
   ::ZeroMemory(&server,sizeof(struct sockaddr_in));+ m4 a' r3 y8 b2 p. ~
}
! Y. J/ L$ I) i4 }void __fastcall TListenThread:oError()
. k9 p5 @; N$ e; h& z% u{
1 R; `( |) d+ Z7 C; w) }! x, a   if(m_Socket!=INVALID_SOCKET) closesocket(m_Socket);
: C. F$ H; F% g% L: V' \5 \   WSACleanup();+ `3 o8 J% u2 B" A4 b
   return;  S4 y  [( l/ i& _0 E- {# b
}- Y9 s3 R2 z9 ~! Y
void __fastcall TListenThread::InitSocket(), V+ t) Z7 \7 p/ S6 q
{
: n' ~3 f8 ?2 |* `6 i% U! U   WORD version=MAKEWORD(2,0);" a3 ]" X1 ?( n, v2 p( X
   if(::WSAStartup(version,&wsaData)){
$ e8 `6 \9 z# m) Z5 O5 h( V      sprintf(szTmp,"Failed to intiailize socket,error no:%d",::WSAGetLastError());/ Q4 P# ?. x2 N
      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);1 O# l7 y& W9 K
      DoError();! |; v4 w  k5 O/ r9 ?
      return;: H. n- t, H: [' p
   }7 |! J% \/ J: M# l
}/ p' Q) ?/ S1 C* m9 `) W4 K- A* O
void __fastcall TListenThread::CreateListenSocket()% R3 {) C7 C& x0 T: P& W% @
{
; {  ?; X# \+ w! l( E! p7 Q   switch(m_Protocol)
2 S* s1 H4 V" O& O$ Q. i   {3 K0 ^& m" M8 t( b, A5 Q4 L
      case UDP:0 S2 N. j! B0 n- [2 d3 d0 J
         m_Socket=socket(AF_INET,SOCK_DGRAM,0);; [, Y& z% A8 i
         break;9 o9 f9 p6 ?' M- Z! I5 C
      case TCP:
1 T0 O# o3 N1 v+ V         m_Socket=socket(AF_INET,SOCK_STREAM,0);
, ~. p- k8 Q# ~% A; }; |         break;1 P9 q* h6 t3 v  \6 z9 Q0 B
      default:8 {2 }# D; E% W3 \8 _
         sprintf(szTmp,"Error protocol!");) h9 [% h. O: k. {$ u. f( y, _, M  l1 G
         ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);2 h6 h! B7 L0 n- [6 U; S
         DoError();
( ^( A' S7 |+ `. v0 f' i0 x         break;
  _6 v! u% A; T   }
9 G1 B# T1 o# a7 p   if(m_Socket==INVALID_SOCKET){! X- Z! _" y1 j. j# t1 |! S! K1 I
      sprintf(szTmp,"Failed to create socket!");: d6 |9 d; J" P+ S, X2 [9 r$ F/ U
      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);
6 o8 I) `: D3 P$ t4 O& I      DoError();) F& `. M7 h- q6 \$ ^
      return;4 J1 b5 I  j$ |( x' l2 u
   }5 H% D5 z0 a# X
}
* T8 \0 u% A. Q. ~' ~4 Ivoid __fastcall TListenThread::SetListenSocket(): |. Z% P6 _) Z. H& C# I
{' q) l, o0 ~' X( x
   server.sin_family=AF_INET;
  C. D8 r9 L& x1 I4 D3 R. A   server.sin_port=htons(m_Port);4 t, j% F3 c: a- m; J
   server.sin_addr.S_un.S_addr=INADDR_ANY;4 r9 k8 f! H6 L5 h% W) d
   int NewOpenType=SO_SYNCHRONOUS_NONALERT;, n  w! P+ t/ r. Z' |- D- c
   if(setsockopt(INVALID_SOCKET,SOL_SOCKET,SO_OPENTYPE,(char*)&NewOpenType,4)){( n/ P- {0 D( D9 z7 X
      sprintf(szTmp,"Set socket option error,error no:%d",::WSAGetLastError());  `' o) |3 H- ]7 M) L3 D
      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);7 A2 U& a- I) N1 ]9 W8 n
      DoError();
. d5 l& I6 g! Q- s      return;
3 w1 f- M$ i. @$ X* @) \; {   }
* A- W0 f( _* W3 J3 X- i# I& J}  ?$ `; L( }4 y8 Q$ f- z
void __fastcall TListenThread::BindListenSocket()
  }$ D/ `: V" ?  l2 }. f{  w" @' r  _7 q+ N$ c1 l+ @
    if(bind(m_Socket,(sockaddr*)&server,sizeof(struct sockaddr_in))){
9 ?: w5 M, N1 m! g; ]0 x7 S      sprintf(szTmp,"Failed to bind socket,error no:%d",::WSAGetLastError());8 j$ c/ ~9 `2 t. c5 j7 v0 G: w
      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);1 u0 q# J, A% m+ j0 f) U2 e4 I
      DoError();
6 ^4 @/ F  X0 d+ g5 d6 P      return;
  _9 u) I9 i( m* @' C   }
4 W: k: O8 E3 W0 h4 P5 P8 L9 H  E( m! E8 B( T3 B; s  x3 c
}! `" H0 |4 ]$ `
void __fastcall TListenThread:istenSocket(). d& s5 r2 N. f5 k
{8 H0 \& w- J& B" T
  if(listen(m_Socket,SOMAXCONN)){% t& y  M1 P  ]+ ?7 ]
     sprintf(szTmp,"listen error,error no:%d",::WSAGetLastError());
' o1 C5 c3 x& `& B     ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);
- `9 e2 [& F, j% [) D     DoError();1 q8 b: `9 `1 `% T6 i
     return;
) F9 `8 _; L9 r- h/ a( U% h( L  }
* u0 ]' O4 g  U7 O" H+ M  //Determine whether there is any connection( ]9 z* ^. u* Y" |, T1 E7 Y
  FD_ZERO(&FDS);3 D7 o/ X+ g' ~& t- m
  FD_SET(m_Socket,&FDS);
: r8 ^( @1 C+ s$ [: Q# f. a}' e5 v1 e# x% a; R- S! R6 W
void __fastcall TListenThread::Execute()
( O3 u# q1 M) [+ `% o, @{! {7 h  W  b: T& K: E. B! q
   char buf[4096];
6 G' S  J5 Z( e; C   struct sockaddr_in from; //for UDP
* r) L: l+ I+ i/ B7 |$ A: c( I' p! w   int nLen=sizeof(from),nSize=0;  //for UDP
/ u) o) P5 }4 n2 S: }   InitSocket();4 Y8 f' O, f6 G) i. B% z
   CreateListenSocket();+ P/ j) }- R. h2 p) [' C
   SetListenSocket();2 S( G1 x$ a; O; E$ h, U
   BindListenSocket();. [# O2 M  W8 H+ y  r2 q! ]
   if(m_Protocol==UDP){
# c% I/ b, _5 L      while(!Terminated){
# Q( b# N$ h' V7 i& v, d- n         int nSize=recvfrom(m_Socket,buf,4096,0,(struct sockaddr*)&from,&nLen);, H2 x8 k' S' _  J) _! n- O& w
         if(nSize>0){% P( D+ D5 }2 L5 ^: M4 [
            buf[nSize]='\0';
4 ?/ v1 o: }; Q8 @+ ?! [, f' R            PSTNForm->Memo1->Lines->Add("Received Length:"+String(nSize));  ~+ S: q0 t6 ?+ A9 W4 t. r
            PSTNForm->Memo1->Lines->Add("Received:"+StrPas(buf));
- f$ l3 T" \+ {+ y1 g$ F4 C            ::Sleep(100);2 c1 n/ d: f) x9 \! D8 O
            sendto(m_Socket,buf,nSize,0,(struct sockaddr*)&from,sizeof(struct sockaddr_in));0 U! h1 x0 m$ ~$ ~: }3 R; f
         }5 U( s+ p0 O- ?4 V/ k
         else return;
; n& @% C3 h# ~. ]5 X
/ M9 Y9 o& H/ A0 ^' k, u      }* h: H3 ^9 Y8 v  v( a) y
   }2 A; G4 S" o7 o
   ListenSocket();
: h4 `0 Z- R$ p# l   struct sockaddr_in client;  o- S" j% O& N  V/ N
   int nLength=sizeof(struct sockaddr_in);
6 T& X: B8 D9 i$ {: M8 ^- _   while(!Terminated){
* F9 o, N1 @( i% X4 s      int nError=select(1,&FDS,0,0,0);  X5 d/ J7 K7 N% F9 y8 {
      if(nError<=0) Terminate();' S: F) \) T, t7 |
      SOCKET m_AcceptSocket=accept(m_Socket,(struct sockaddr*)&client,&nLength);
, V, [4 U6 T, J8 T' G      if(m_AcceptSocket==INVALID_SOCKET){
$ H4 |8 i  O; j0 T0 n9 k         sprintf(szTmp,"Failed to execute accept,error no:%d",::WSAGetLastError());
; A: w: Q; `/ y$ |) _# r& ]0 X         ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);! S  D  x5 m* r4 o# Y
         DoError();
# D# d0 l7 f1 \+ f. z" X         Terminate();$ \! ]' _# P2 u7 k
         return;7 f$ H  {! x  x$ G" \0 G  m
      }
% w' J5 M6 Y* A( A( j      TCommunication *pCThread=new TCommunication(m_AcceptSocket,FALSE);
/ w0 G  y3 |: V  e5 ?. f2 {      pCThread->Terminate();
9 B8 }& V& C+ Y8 {" B. [  [! l      pCThread->WaitFor();
$ W: `/ W# \3 x- L/ S   }- F8 Q3 C+ h0 K4 g2 g
}
9 Y6 _8 l9 _) l6 c4 K( T//************************PSTNForm*********************************************//2 P5 n5 W( x& Z7 L2 G( m
__fastcall TPSTNForm::TPSTNForm(TComponent* Owner)  f% }7 P; l- D, V' r6 C, v
   : TForm(Owner)
+ L) C* J8 J2 F- |$ `/ P5 l{
$ ^# @4 d( w6 X! ^5 T3 z) I) d}
( ?5 i6 v3 W0 \! s4 ~7 Z5 cvoid __fastcall TPSTNForm::Button1Click(TObject *Sender)5 S) X0 v0 I- F' }" e5 `% O! \
{, v+ n5 y  D. W: B
   Close();5 \, g7 ]9 S: `8 a8 H
}. K1 b% k; r: i; _* S
void __fastcall TPSTNForm::Button2Click(TObject *Sender)
9 d9 A# X6 p* d' `$ e0 p{: p$ k; d9 L0 G0 s) F
   if(pThread){! r# O6 g. v7 A2 A: L, Q2 s
      pThread->Suspend();8 [* K) K; t) n/ N) i$ }# V
      pThread->Terminate();
0 \% B! }; A# ?# g4 A      delete pThread;' M! u  Q4 U( x
      pThread=0;* B. o' F$ y( J
   }. S- u  O5 N. Y7 s: p  x7 x2 J2 O
   UINT m_Port;
1 e& u$ Q* R) L   try6 u, M. Y+ d; j( a5 O6 \
   {
+ t4 D7 ?, ~8 B$ F      m_Port=Port->Text.ToInt();
% n: n0 o# k6 O- S# E9 M# i   }
/ U6 N% e' K9 v4 ^1 B   catch(Exception &e)  u, n# [3 ^+ p0 f) U
   {' j( Q" x) i( `- O5 e5 i
      ::MessageBox(0,e.Message.c_str(),"Error",MB_OK+MB_ICONERROR);; z2 T, R: k$ B/ A
      return;
$ J' u# L5 L3 ^- r8 q   }$ V* q- X1 k6 b9 Z4 \1 R
   PROTO m_Protocol;: o# i( x: o* q: ]# Z* h+ ~+ Q
   switch(Prot->ItemIndex); r1 d8 r& y! [. I& O$ m, S
   {
0 l8 ~. h7 e, C" G. F0 C, v      case 0:
: o/ q# r5 z) R1 z! j7 C2 o         m_Protocol=TCP;- o3 A" r0 i! ]
         break;
# I# h' y1 o% L# d      case 1:9 C& C& ~3 r  o' \$ e; @6 C+ Y, e
         m_Protocol=UDP;
7 n. H& Y# A. W4 R         break;" t# ?+ s8 g3 K0 |; l* k
      default:
4 f) y) m( u" E         break;
& L+ \8 c  a$ \$ @. H+ V   }3 }  G. T# M, y9 a. }
   pThread=new TListenThread(m_Protocol,m_Port,FALSE);2 [' B/ k: r% B( f8 O
   //pThread->Terminate();$ M6 q% h5 {( f+ k! x: t0 k6 b
}
% }7 i% A7 v) {  `: u  g" Evoid __fastcall TPSTNForm::FormCreate(TObject *Sender)# p+ g, \2 e6 A+ R+ K
{$ |- O( ]: y9 _& F( q# r% N
   ::SendMessage(Prot->Handle,CB_SETCURSEL,0,1);
( {+ ~: u- B, A' s  f}$ z- b9 b1 m  o& Z

5 Y8 T- k; _" U1 Yvoid __fastcall TPSTNForm::FormDestroy(TObject *Sender)
3 _. ]2 k( d5 O% v% E% m{, Q$ H6 n  l. Q4 l0 E/ a
   if(pThread){- s6 F) z, }% c& ?3 v
      pThread->Suspend();
5 ~, d6 D- n0 {' C: C3 p      pThread->Terminate();}
& P8 {( }+ Q4 Y: q$ ~' r& _}/ ]# N  M6 q' i% F! z! ^% M+ z0 p4 c( j
上面的代码,各位可根据自已的需要和针对自已的应用,在数据处理方面加以改进就可以了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-10-2 06:18 , Processed in 0.018962 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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