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

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

[复制链接]
发表于 2004-2-15 14:01:13 | 显示全部楼层 |阅读模式
在CB中用socket api来写网络通讯程序
! T0 s, ~0 {1 |$ O3 z作者: kingcaiyao ,如转载请保证本文档的完整性,并注明出处。
. P; Z$ @2 N- L1 g; ?8 ~/ I# R欢迎光临 C++ Builder 研究,http://www.ccrun.com/doc/go.asp?id=569
) G; I: E. P7 i& \0 a8 \2 Z本文转自csdn,作者:kingcaiyao7 {# {! H7 Y. W! h; f. b) C
原标题:在C++ Builder中用socket api来写网络通讯程序(同时支持TCP和UDP协议)
2 G! {+ O; N& [0 C% W9 `原文:  http://www.csdn.net/develop/read_article.asp?id=198836 s' a1 N3 o* g6 q  r: x/ h- z
; Z3 y5 i9 ?3 ~2 V3 j& D% H) e- M

1 M- f( d: S1 S在7月4日看完sockcomp.pas后,我决定用socket api来写一个客户端和服务器并且同时支持TCP,UDP协议,于是我就去做,现将代码贴出来(已调试通过)
% ]& U; N% l& RSocket api Client:9 f  A9 Z3 c. A! L& {( _8 w. \
7 x/ _( m/ x; m6 f
#ifndef UDPClientH2 y6 o- W4 h, e
#define UDPClientH, b# V, o9 x# S* x; f
#include <Classes.hpp>
/ d! M/ G( h% X6 F) z  }$ |' m#include <Controls.hpp>3 Z% Q0 Y$ m6 _. f
#include <StdCtrls.hpp>
) K# {. w  R; J# |' O+ A/ T#include <Forms.hpp>" ~4 E7 |- H9 z+ R
#include <stdio.h>3 {" a9 B$ x2 x- Z0 v0 A; v
#include "CCEdit.h"
6 x5 z" C" T7 ^. F7 ]3 M/ @#define WM_SOCK WM_USER+100
! p' Q8 A1 {5 W! ?/ Iclass TLANForm : public TForm
" `8 V  o- ~; p- G{
) \2 J+ L/ L# r: W__published: // IDE-managed Components
+ c, I- x8 y4 T# `) l! O' h   TEdit *Port;
) e5 c2 W% B( x- y   TLabel *Label1;1 E" u" o4 y/ X' r$ n8 b
   TLabel *Label2;
1 w& M' O; g" b2 ~3 A4 W7 R9 G# W* H   TComboBox *Prot;$ K+ F; D/ t8 X4 l/ Y6 R$ M+ U
   TButton *Button1;6 o, ^3 z7 q. z* X
   TLabel *Label3;
- ?: |  I) f9 B- i) B" R   TEdit *Addr;  M9 Y6 e6 i, I3 |7 R
   TCCEdit *TxtEdit;! m0 u' K1 t. Y7 D# t+ x
   void __fastcall FormCreate(TObject *Sender);
# m$ Q2 j/ c. `8 r   void __fastcall Button1Click(TObject *Sender);2 a' O) {6 r7 t
   void __fastcall FormDestroy(TObject *Sender);
0 h5 L1 N7 [# _6 L- xprivate: // User declarations
, S& g$ ?" P7 M1 h   void __fastcall OnRecv(TMessage &Message);5 z( O5 l& q) d. e3 a0 _* \- d
public:  // User declarations3 n/ h6 |7 I8 D1 Q% y/ V) H
   __fastcall TLANForm(TComponent* Owner);/ @% F8 h4 `$ }7 ~3 N
   BEGIN_MESSAGE_MAP
8 y1 ~. v+ B' M" ~7 S5 |4 i      VCL_MESSAGE_HANDLER(WM_SOCK,TMessage,OnRecv);
4 X: [. t1 W- Y4 h( h   END_MESSAGE_MAP(TForm);
2 p9 X- z+ W% H1 J/ K. X};
- C! y( K0 @1 _) A9 Eextern PACKAGE TLANForm *LANForm;1 {/ W! [) |6 m/ K0 k
#endif; X4 ~" I  [- G0 k6 C: Q5 Q

& I; u8 {8 G5 @, |, B" D# d! H* N9 q) G3 H! }* e) _6 x1 ?5 V
.cpp File
2 b; P0 t$ m$ R; F( z/ v) X$ d+ H# j6 `5 y
#include <vcl.h>7 r1 u4 ~: N: K
#pragma hdrstop' C) {1 F$ |% l. J) k
#include "UDPClient.h". i& j5 o' B) t" g: f, `
#include "WinSock.h". |/ G9 n% i3 A" R4 ?
#pragma package(smart_init); v1 i3 R- Z9 U  n* x
#pragma link "CCEdit"
# |" b3 e* Q7 n, v# A8 ?7 v9 k8 N#pragma resource "*.dfm") W, D" V1 Q9 I$ g0 ]; j! x
TLANForm *LANForm;
0 B, |& r5 |/ R; B, C* H  ]. I, ]4 xenum PROTO {TCP=0,UDP=1};; L9 Z5 u; i2 b$ n0 \0 h$ z; a
SOCKET m_Socket=INVALID_SOCKET;
/ O6 @- V9 X' F; NPROTO m_Protocol=TCP;
, J3 a& j; y: D% y+ m, o__fastcall TLANForm::TLANForm(TComponent* Owner)( Q. O- i9 v7 b  c& n7 j* K" o
   : TForm(Owner)+ B$ r) g6 a8 t7 r+ E( S2 b" [
{9 d2 `# ~3 L! F# B" o5 a+ ?  ~

9 J3 u- ~9 F6 r; x7 o}
! w& p+ X9 b1 n/ w1 Yvoid __fastcall TLANForm::FormCreate(TObject *Sender)! E) E. ^0 {2 _6 X: F; K+ h
{. t# u  ~( i; w" D& h4 V
   ::SendMessage(Prot->Handle,CB_SETCURSEL,0,0);: O( D* `( O3 C7 ~1 t) @
}  c8 A3 e8 r' K5 O% K# c
void __fastcall TLANForm::OnRecv(TMessage &Message)! B7 x- F7 Z) W9 j' g
{
/ ~) Z9 N9 b1 V' |   char buf[4096];% V% `6 P1 U( {& F" d5 f2 }3 R
   int nLen;" x- m$ v: c% T  Q3 k. K" C
   struct sockaddr_in from;2 j' t3 O9 N2 G
   int nLength=sizeof(struct sockaddr_in);4 l: g; |) V: ?. P' G9 D* n8 {
   switch(WSAGETSELECTEVENT(Message.LParam))
4 w  m0 @- e* |' |3 l. D   {
: {9 ^. W! E* N, C      case FD_READ:( ^* B1 b0 p* P
         switch(m_Protocol)
; n; @' I- |. l) B9 H- S8 e9 w3 g         {4 g8 V1 Q0 p+ B" e) E
            case TCP:
: U  u( z) q- I9 T               nLen=recv(m_Socket,buf,4096,0);5 e3 S3 Z! N6 V. `6 i. R) ^
               if(nLen>0){! v; }+ s2 @, Q
                  buf[nLen]='\0';" S, ~5 S+ ^& \  q
                  TxtEdit->Text="Received Length:"+String(nLen)+"\r\n"+StrPas(buf);5 \- i+ h0 u7 c$ B9 A
               }
& ]2 e7 z; Q$ h  }9 |               break;5 U# z8 y& s' u$ s' F
            case UDP:
9 A$ d  e" {+ {; g* _/ A               nLen=recvfrom(m_Socket,buf,4096,0,(struct sockaddr*)&from,&nLength);/ S7 P/ v( m' f/ U9 A* x6 C
               if(nLen>0){
$ u) ]3 k5 s  S( K                  buf[nLen]='\0';: A; @/ y) h& L. k* o
                  TxtEdit->Text="Received Length:"+String(nLen)+"\r\n"+StrPas(buf);
7 j. l# N+ {1 F. g$ e1 I5 a               }% B' u8 W" M; {. g" B+ H# A
               break;
6 P! R: }2 r. C6 x& @& S, B         }
1 u7 \# Z; G( _3 e/ K6 f         break;8 B- m" D5 V, s# o: s  U
      case FD_CLOSE:
# K* B8 B) u6 n. r. n1 p' y3 L         closesocket(m_Socket);
& k5 V- H0 R* _  ?         break;7 {: o% Q+ j: s6 g! w
   }
, C  y& e: M" P$ G4 I- U( G}. I8 }+ E4 m' Z8 A! F

- V! ^) t9 o- Z4 P$ c# y, |! fvoid __fastcall TLANForm::Button1Click(TObject *Sender)4 g9 X. |9 N% g: D1 l- J+ b
{
+ s, g7 m% Z1 d# q0 S   char szTmp[256],buf[4096];
! }# B- K3 j. v( l- h, _9 c   int nSize=0;
# b& h6 p& \4 v/ Q, M6 u   UINT m_Port;
* m. o& r( d) g. [) i4 W  e   AnsiString addr;
* [: S* P$ G/ Z6 F" T! b, v   addr=Addr->Text.Trim();- O3 @. z+ w9 Y2 J9 |
   if(addr.IsEmpty()){* e5 ~! P8 p- T6 u7 e
      ::MessageBox(0,"lease enter the server IP!","Error",MB_OK+MB_ICONERROR);4 i! h1 W: x, c8 w+ T0 ?' y( N+ y
      return;2 \0 |- ^0 H8 x
   }" o  Z5 C) Y  c, Q2 h
   unsigned long nAddr=inet_addr(addr.c_str());
* ]8 @3 Q/ `, Z% S   if(nAddr==INADDR_NONE){, u( ]$ i0 P8 Z$ [' Q, d
      ::MessageBox(0,"Bad Internet IP!","Error",MB_OK+MB_ICONERROR);
# d% @3 m0 X  r1 }" U% Q      return;}
+ A1 r9 h0 r3 w! [- {9 O" j2 R: N, l1 ~
   try/ o$ h, D  K# L/ g, M
   {8 m! |' ~$ k7 {2 M& W1 {8 q
      m_Port=Port->Text.ToInt();
2 i9 X* z% J1 @& M8 U" w3 i1 M' _   }
) A% L+ V  ^3 E3 L   catch(Exception &e)
+ O; X+ t/ l% `* M6 I; |   {" C% f- K" k$ b) J7 Y4 U
      ::MessageBox(0,e.Message.c_str(),"Error",MB_OK+MB_ICONERROR);
( d" c( h' E  D4 t      return;
5 ]2 J& [! k# {8 Q& f( B4 e   }7 I2 N: I; }7 r. @
   switch(Prot->ItemIndex)8 r: q. b; S$ d2 x" P
   {% r3 M/ v) S: _4 R' e
      case 0:1 ?+ K" R! ]" W. p) I" y
         m_Protocol=TCP;- ^+ T7 k0 y0 v. g" T, Y/ ~5 A
         break;
- I0 h( J( c, x+ A      case 1:' X$ i6 R* ]( c7 {9 m
         m_Protocol=UDP;  d( P: \% _' X  H1 B
         break;
$ \2 z/ O$ P' A8 T+ ^   }* X0 D! |! \+ A. l) z9 W; L: Z
   if(TxtEdit->Text.IsEmpty()){
) @6 p. k5 E, E" y+ {# w: ~1 ^      ::MessageBox(0,"lease enter the text you want to send!","Error",MB_OK+MB_ICONERROR);
4 r& Y% Y; p7 o/ T" ]; S0 `9 R; G      return;}
0 }* i5 ]2 f; v# x* h( u: K3 i* x: R" p2 |- |2 ?9 C
   //Initialize Winsocket  B4 `/ b, E, W% z
   WSAData wsaData;4 Q$ _7 _- D: q; l5 c
   ::ZeroMemory(&wsaData,sizeof(WSAData));; U5 y5 V7 f" N
   WORD version=MAKEWORD(2,0);( a1 n/ C- V" g0 o3 Y8 ^. w
   if(::WSAStartup(version,&wsaData)){: ^' _0 |1 i4 A7 C  r' ^
      sprintf(szTmp,"Failed to initial winsock enviroment!,error no:%d",::WSAGetLastError());# c# n2 j. M7 y/ ]1 `8 ?, X+ n
      return;}  H: ]& x- C: Z+ V+ `  y# N

8 [7 d8 j5 m( B6 E   //Obtain the active connection
1 ?) x+ _$ |2 Y* Q   char ComputerName[255];
- Z; @. D' d+ V) `5 }( z6 l- j   gethostname(ComputerName,255);
5 P+ ?" M/ R/ {5 b   struct hostent* he=gethostbyname(ComputerName);
) U6 q! H1 G; S# L$ i   if(!he){
0 M6 _- o& |. I8 l/ F/ A0 {6 D      sprintf(szTmp,"Failed to get information to host!","Error",MB_OK+MB_ICONERROR);) V& ^) z, k$ ?, w4 v
      ::WSACleanup();
# K9 s# M$ u2 ?$ Z+ f! a      return;5 a1 g* b: }: L9 j/ x: I
   }
: S8 Q% C2 m" I$ [% F1 W   //create new socket' o" l: E5 M) |4 V$ g
   m_Socket=INVALID_SOCKET;
( Z6 K8 S3 s" Y* z3 |' r$ l   switch(m_Protocol)
& t- w/ O5 L7 I7 }   {7 n/ o6 s: l# D4 E
      case TCP:
' s  `9 O* m6 i4 n' c         m_Socket=socket(AF_INET,SOCK_STREAM,0);- E- B" g( u" Q- z& y/ Q
         break;
% k  m5 W/ G$ ?* n      case UDP:$ N5 ]5 w& `. Q- w% N7 Q+ N
         m_Socket=socket(AF_INET,SOCK_DGRAM,0);
, h* m* n; d5 X$ K5 ]( t/ N. H) ]$ J         break;
9 c, l5 S1 Q% P, c   }
) H# T4 \+ m" ]: `1 Y. a   if(m_Socket==INVALID_SOCKET){
- Y9 e/ f* j6 n7 d      sprintf(szTmp,"Failed to create a new socket!,error no:%d",::WSAGetLastError());: a; D8 y) a0 L# z4 x: b0 `$ [
      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);  E3 c( f! K: E5 F9 O  ~( ^
      ::WSACleanup();8 l# v- Q- j9 G% [: F) b: Q
      return;
2 e0 w% R6 W/ G/ s! }   }" C. t; Y5 G; {, u- }
   //bind socket
* P' h. a- F1 s) f/ _3 n   struct sockaddr_in client;
) i! X6 i/ H  r- u& ~   unsigned long nClient;
. ]0 E4 w% ~+ F+ ]( Z- R   memcpy(&nClient,he->h_addr_list[0],sizeof(int));
# A9 i! I" [" [+ S! b   if(nClient==INADDR_NONE){
$ y( \, l9 q1 Z      sprintf(szTmp,"Failed to obtain the local machine's IP!","Error",MB_OK+MB_ICONERROR);
! s1 B6 f* j" r3 L0 Z  \      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);. Q+ F& s' K( I' Z' w* g: R7 P
      closesocket(m_Socket);
) ^' J2 l( C, F* k/ P1 d      ::WSACleanup();
$ K% j( g+ S6 @; X4 O7 n) C' e* K      return;0 C0 q  i3 s# P+ w; g& v
   }
2 Y- {- @! k- e0 }   client.sin_family=AF_INET;5 q8 Y$ j1 P3 T$ j0 A8 o  H
   client.sin_port=0;
$ S5 Q$ C+ Z" @2 l( ~" k0 w& A   client.sin_addr.S_un.S_addr=(int)nClient;' d4 ]& ^+ p! B% `' D8 U2 ~
   if(bind(m_Socket,(struct sockaddr*)&client,sizeof(struct sockaddr))){
* i# k/ g; `  t8 h' A' A0 \3 u      sprintf(szTmp,"Failed to bind socket!","Error",MB_OK+MB_ICONERROR);4 h5 P0 x2 i- v1 h; {) K; E
      closesocket(m_Socket);
! Z! q: V6 \, z) z) W" M3 Z      ::WSACleanup();, x5 k# @( a; [2 c% x
      return;}
1 D+ R4 C; l9 e   //connect socket! z4 D. @. |0 v# q+ i/ k
   struct sockaddr_in To;
8 r8 {" H4 o+ Q, i6 ^5 r7 N   To.sin_family=AF_INET;- R! B  s8 i, K" v) H1 C" n2 {
   To.sin_port=htons(m_Port);
4 {( G/ o: |  w. G# u   To.sin_addr.S_un.S_addr=(int)nAddr;8 n, D5 ?( Z: d+ z: s: G  G/ o$ T
   fd_set FDSET;7 l, T0 d3 X. D7 M. r# f
   FD_ZERO(&FDSET);
( L* d1 H! X/ T8 T6 w   FD_SET(m_Socket,&FDSET);; _6 U2 e& S- D( f
5 |7 T/ y* C$ |2 x

3 }# M8 \3 V$ d) a) G   if(m_Protocol==TCP){3 g0 b% q5 i' L4 ^3 b9 ?
      if(connect(m_Socket,(struct sockaddr*)&To,sizeof(struct sockaddr))){
9 C: y$ `0 e) z- z1 k( b         sprintf(szTmp,"Failed to connect the object!,error no:%d",::WSAGetLastError());  q7 O% Y0 t5 L2 f( Q
         ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);
# M( J) N1 y- J9 P& D  _         closesocket(m_Socket);
* V( y' u( O8 e* a: Z4 Z         ::WSACleanup();9 a- r4 L- N1 n- Z4 m
         return;1 ?7 |9 o! u; N5 `( k
      }
4 I+ b: y6 C# ^8 Y      int nError=select(1,0,&FDSET,0,0);
) Q( V$ L7 F8 A5 o6 G: U6 ]      if(nError<=0){7 ~( V3 ~  H7 T# R2 o" P' I
      sprintf(szTmp,"Failed to select socket!,error no:%d",::WSAGetLastError());5 P" f( M" w9 A5 x/ b  S
      closesocket(m_Socket);5 v3 P7 P: ?5 p/ G7 V. r
      ::WSACleanup();
# _, _/ V! D. n/ T( P+ C, Z      return;}
) v& M; O9 }5 [! \: Q( ?   }+ W  G. [0 u7 ?
   //Send data0 e; e9 h0 S3 R% I6 W4 J- m
   int nLen=TxtEdit->Text.Length();
$ i% \4 Q+ S1 T9 }: V3 e   if(nLen>4096){
- K) q, S( T$ H      sprintf(szTmp,"The buffer is too size to send,it shoud not be more than 4096 bytes!");
1 r8 [) h9 N6 }( M. G      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);9 a' ~$ {4 S0 D3 Q
      closesocket(m_Socket);* U* o2 S) c) `. W6 v
      ::WSACleanup();
# W2 w. Z. G, k  e      return;7 ?. V6 ~! F3 g; t! {
   }
* |: P- p$ k5 }. `, |/ l2 G% {- p   strncpy(buf,TxtEdit->Text.c_str(),nLen);
* V: P2 b$ w# t. k   switch(m_Protocol)
$ |( i) Y+ u1 Z1 L- c9 {2 Y   {) |! Q  L9 N  C# e: h+ T4 _. w
      case TCP:$ P. A' J( x3 S' o& {
         nSize=send(m_Socket,buf,nLen,0);
$ A, g+ \$ X8 R         //ShowMessage(nSize);
9 l1 M3 g* O" ?* r' ?         break;
+ q5 B# q" `7 O      case UDP:
) t5 L% f/ k. C# b         nSize=sendto(m_Socket,buf,nLen,0,(struct sockaddr*)&To,sizeof(struct sockaddr));! K# W6 A! I( l/ t8 c
         //ShowMessage(nSize);% E; r( |4 a6 a, W1 F9 V
         break;( D. r. Z0 w& j7 c4 `
: P0 r1 z% g2 L- `, f* @
   }9 e3 u' [4 ~7 Z; r7 B  e! h/ r( s" u
   if(::WSAAsyncSelect(m_Socket,Handle,WM_SOCK,FD_READ|FD_CLOSE)){
( a/ c- P3 q& C+ i* b% o) t7 N) E1 J      sprintf(szTmp,"Failed to register socket event!,error no:%d",::WSAGetLastError());
& u0 n' I1 k2 M      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);. [+ {' P& E( K! _; |
      closesocket(m_Socket);, C& i* G. M. K1 i, F
      ::WSACleanup();
$ }; q& t* _/ f8 t: e7 ]! q- J* w% Q" O      return;}) t. ~5 v5 x' B: I# E
}9 X& M( R  a+ k7 q$ T1 a0 F# S6 F+ Y
void __fastcall TLANForm::FormDestroy(TObject *Sender)
. Q) l8 ~7 g3 r: S{
  f5 [, ^8 {# ~5 Q4 X   closesocket(m_Socket);
+ V5 ~+ z6 O: c: O$ x1 W   ::WSACleanup();3 E2 M" b+ a+ X" T
}
4 F' ]% T1 `; S3 K1 j
- q0 g0 f( ?( a: |  Y* X3 P& V! _9 OSocket api Server:3 N0 d, j, v0 m' T# q
.h File
5 V$ \5 ?% A) t. d#ifndef UDPServerH" t! e) b% M5 C- E% O: V
#define UDPServerH
/ ^; h5 C2 C2 ~" n3 H" ]' U, z#include <Classes.hpp>% I' ]0 s" ~1 W- f
#include <Controls.hpp>% p1 \9 R" H2 i( |( V% h+ z
#include <StdCtrls.hpp>- ]7 `1 E4 V% C' r, v* g
#include <Forms.hpp>
0 _! g+ d5 y3 A( j1 ^6 h+ Z6 Y8 d#include <stdio.h>
4 o6 v; v$ f" F- Z% M9 d0 v#include "WinSock.h"7 K  ?) I/ v. \5 u0 T
/*#define WM_SOCKET WM_USER+1000/ }' F! h3 G, a- v9 L" x3 Y
#define INITSOCKETSUCCESS 0
+ h. X- Y6 Z% Z. p+ J5 h#define INITSOCKETFAILURE 1/ k) G% A) |, C& o7 ^  \9 X
#define CREATELISTENSOCKETSUCCESS 2
0 [! f0 |+ P% c* _' r#define CREATELISTENSOCKETFAILURE 3
/ _% o6 H6 ]; Z7 C1 d0 e) S% e0 p) S) Y#define SETLISTENSOCKETSUCCESS 4
6 X+ n& [2 V* q$ y6 b3 D#define SETLISTENSOCKETFAILURE 5
5 R( f6 y! S) O4 d#define BINDLISTENSOCKETSUCCESS 6" U' V9 E2 D; M& z9 _  x! f. n2 |
#define BINDLISTENSOCKETFAILURE 73 i4 j+ Y5 h% U) p* k; r4 A5 U8 I
#define LISTENSOCKETSUCCESS 8) A! g% k/ C: ^4 {, L
#define LISTENSOCKETFAILURE 9
- z- r( p: y. ?) ?#define ACCEPTSOCKETSUCCESS 10
+ f6 w4 [1 k6 O8 x3 E2 u#define ACCEPTSOCKETFAILURE 11
* O4 |; Y: p, B7 p9 ^  V*/( A$ y: m5 Q5 J4 p
class TPSTNForm : public TForm
! H% z, J6 k6 p- T( M, _{
# h" ?  ~7 `7 d# N6 G# O; s# e__published: // IDE-managed Components
6 h! i9 \! M3 C# h8 A( n$ F% o   TEdit *Port;
: g* p, o! b$ B( \   TLabel *Label1;& V3 Y+ U7 g5 S1 M& ?+ s$ B
   TMemo *Memo1;- A3 Z! M( S0 O# z/ `0 t
   TButton *Button1;: {/ c5 c7 {- y* u
   TButton *Button2;
  B! P8 x9 @1 P6 L) p   TLabel *Label2;! J7 v( N8 d3 U4 \/ s4 m1 N5 S
   TComboBox *Prot;* k9 h1 e; [+ s, H3 ^9 s
   void __fastcall Button1Click(TObject *Sender);( t; U6 K* q3 Z5 E& C/ y; |2 F
   void __fastcall Button2Click(TObject *Sender);
! F8 q4 a( P7 u" j" T   void __fastcall FormCreate(TObject *Sender);
& p- l7 e; J5 v0 U+ v, G- S! y   void __fastcall FormDestroy(TObject *Sender);% R& R) f/ ~- T
private: // User declarations" @3 X! b/ N+ ?: w* \! \. f2 j
public:  // User declarations
8 u7 x0 M2 I3 w   __fastcall TPSTNForm(TComponent* Owner);
: L1 A7 L3 a, d6 F& x# P2 @; S};7 d# s# k" d9 O# `" K- ?
enum PROTO {TCP,UDP};( |1 t/ ^) _9 }/ k; E
class TCommunication:public TThread    //Communication Thread2 A/ D/ r3 N4 S; x
{! V/ O# ^0 m: |1 x1 D
private:
8 P0 h) F3 @/ D2 A2 a: j5 E6 c   SOCKET m_AcceptSocket;3 U6 S0 y: h& E& B6 f
   char szTmp[256];//ERROR MESSAGE! U9 `$ {( h3 O9 A9 F  ~
public:+ V+ c2 v4 P' F) _! t9 A/ B, ?
   __fastcall TCommunication(SOCKET m_Socket,bool CreateSuspended);
0 e7 Y8 n: z" D; l   __fastcall ~TCommunication();" P: T3 _: V8 d
protected:
& E5 j8 g) g6 Y$ R  \3 I9 \- ]- W   virtual void __fastcall Execute();6 [' g: A# _1 l
};( k! X/ N0 d6 v, H
class TListenThread:public TThread //Listen Thread
6 m  u( J5 E' Z$ Z{
1 h: V1 d& }( a7 ^. D; `' J% ^4 Bprivate:
1 U) ]% t+ m' N  ]   WSAData wsaData;' ?# W: H8 d9 c4 i
   struct sockaddr_in server;
9 D% U& w7 U: s4 ^& H/ Y+ C+ @! z   fd_set FDS;/ x* m5 j1 f+ |/ G. J
   UINT m_Port;& E, J3 [& `) o( z
   PROTO m_Protocol;
' ]( ^. `) c* A& z   char szTmp[256];//Error Message! u' y+ ^* m8 W5 s; F' R; ]% B
public:
9 x2 ?! I  }% c1 G   SOCKET m_Socket;- ?$ ^- `7 _8 p) p- A
   void __fastcall DoError();
8 d" Q3 G) }3 P- p, a" B   void __fastcall InitSocket();& n: J' ^& }. j
   void __fastcall CreateListenSocket();
$ r) r: r  ^  \8 \) j# C& n   void __fastcall SetListenSocket();
% e% D# g% ]1 n! E- R+ X   void __fastcall BindListenSocket();
  J  C" e. A$ S' N   void __fastcall ListenSocket();
( I3 D4 U3 W8 s1 a
: x, M$ `# p" F* epublic:
- [, |4 ~% U+ I5 ~1 W9 `! a/ G; S; j   __fastcall TListenThread(PROTO m_ProtocolA,UINT m_PortA,bool CreateSuspended);
! J- V4 _! {% S" M7 {; T( `   virtual __fastcall ~TListenThread();$ j/ @  D9 ~! U5 x5 N
protected:9 I" B! J0 W/ T* ^
   virtual void __fastcall Execute();; ~0 _7 I: {; ]7 K9 b0 D% G% v
};
3 ]7 x/ Z9 |. _3 h/ Mextern PACKAGE TPSTNForm *PSTNForm;
& }, [* V( w- ]4 e2 d; z4 X4 Q1 D#endif
+ E! m# I$ N9 i( m& i.cpp File5 n6 o0 w7 Z1 E6 o6 m! H2 t! V
#include <vcl.h>
0 Z! I) E, n6 a4 }$ A5 h+ M#pragma hdrstop
: {' c) K- i8 k6 U% l5 U#include "UDPServer.h"' q: I5 k- o9 m2 w% \; q0 ?
#pragma package(smart_init)
0 }, l' j3 o) H8 F, w5 k#pragma resource "*.dfm". p3 `5 n3 l. x  N* F2 k, E0 \
TPSTNForm *PSTNForm;
. R6 I, T: \8 ]2 `+ [TListenThread *pThread=0;2 f+ K/ @2 Q9 n0 i+ X% d
//******************************CLASS TCommunication For TCP****************************************************
. Z, X# S  m/ U! I__fastcall TCommunication::TCommunication(SOCKET m_Socket,bool CreateSuspended):TThread(FALSE)
" k' t6 ]2 o3 L5 I5 |6 T{2 p( l! l4 N" V: R( X) d( K) j
   m_AcceptSocket=m_Socket;
" N# e( E4 F' S9 U6 R6 Z  z   szTmp[0]='\0';2 }) l5 ~% f7 U" G8 h
   FreeOnTerminate=true;- V; L/ `8 m" D& g" R8 `/ S1 ]
}; Z% B) w" p2 A. B4 T3 X
__fastcall TCommunication::~TCommunication(). o! z' @- c! ]! I, Y6 @& V
{
) Y% @) h1 u! g  // closesocket(m_AcceptSocket);
  p! r8 e& K3 J* C& W5 o}
5 Z9 v% _3 F- f  h4 _void __fastcall TCommunication::Execute()
; w, {2 H7 p$ y$ O! u8 {{
. o4 j6 ~7 Z  z4 s   char buf[4096];
% J- B5 w# @8 w+ ?* p  v7 w# |/ e   int nSize=0;- K2 D' P. H  P+ r6 @9 v! E
   nSize=recv(m_AcceptSocket,(char FAR*)buf,4096,0);  U5 S( T; H9 n, l* g! y) O6 r) B
   if(nSize>0)
4 h$ }3 L7 P7 o  k% e   {8 `  w# R. j2 r3 e. }6 a6 E, d3 _
      buf[nSize]='\0';0 b9 X+ o: L! ^- s% w, Z1 \& N5 V
      //Display
. E3 v* j( I8 e  |( g      PSTNForm->Memo1->Lines->Add("Received Length:"+String(nSize));  O" h7 s- B* y2 F" X& q
      PSTNForm->Memo1->Lines->Add("Received:"+StrPas(buf));
' y) L% p9 j0 z& h  \$ N      //Deliver
1 Z* i3 w. p/ h8 m$ }7 A      ::Sleep(100);
, F# m* i$ N( Q4 L( M$ z      send(m_AcceptSocket,buf,nSize,0);4 J1 a; D7 S% m# z5 j. Y
   }8 ~7 T5 d0 J" ?0 C0 G
0 a9 ?# B+ \9 h' a; D! _" |+ f4 F8 B
}
9 b" o  H" i1 k3 \2 R//******************************CLASS TListenThread*****************************************************& h% C0 R% _$ o$ U; G: t( ^, I
__fastcall TListenThread::TListenThread(PROTO m_ProtocolA,UINT m_PortA,bool CreateSuspended):TThread(FALSE)
0 P7 J9 b( B4 T, U9 Z7 {4 d. T{
9 F5 m% h+ o7 F3 o( u& i   m_Socket=INVALID_SOCKET;+ |  k  Z- {/ I
   m_Port=m_PortA;' |" d9 u  |$ m* h
   m_Protocol=m_ProtocolA;* i5 d) k/ G* j' I: _+ e1 n
   szTmp[0]='\0';( \' b) I  i/ p& |
   ::ZeroMemory(&wsaData,sizeof(WSAData));; Q" j* T( w# f
   ::ZeroMemory(&server,sizeof(struct sockaddr_in));
% L9 ~% k- S4 c& J* e5 |   FreeOnTerminate=TRUE;//Automatically delete while terminating.
( H3 Z7 w; q3 _* b8 s}1 G: i& s0 ^, `" c
__fastcall TListenThread::~TListenThread()% y6 v5 M# e6 y" }
{
+ k/ m8 k- C' l3 ?* ^" n   closesocket(m_Socket);- @6 D2 m& A; p5 w. w3 M( n' o6 ~
   ::WSACleanup();
* T; f/ j( r3 j   m_Socket=INVALID_SOCKET;9 L, |& ]5 y* ]6 w" _* h
   m_Port=0;* J4 x; n# q: Q/ a: Y. I8 M2 Q
   m_Protocol=TCP;+ C4 N7 C: }4 k! q* |
   szTmp[0]='\0';
4 B- k' Y/ f/ O2 W' V$ b/ x2 [   ::ZeroMemory(&wsaData,sizeof(WSAData));. k4 \# V$ I& S$ n- H! ]2 V; m+ l
   ::ZeroMemory(&server,sizeof(struct sockaddr_in));4 T' n' a, s2 U1 S
}1 o; O' [  D" N5 V* |% F$ M
void __fastcall TListenThread:oError()
( e: H2 \1 h0 h. e{
/ g* n3 X0 d8 F  E1 O5 Q8 ^4 V. q6 @. n   if(m_Socket!=INVALID_SOCKET) closesocket(m_Socket);
% W+ }6 b& a3 P* g9 N7 Y" S   WSACleanup();) L$ p" P( o7 j/ {
   return;
! e' T; |) y, |}5 }  m! d3 y5 J' S8 l8 R- _
void __fastcall TListenThread::InitSocket()
, b; x, X( P6 H1 n" z* g4 @! y$ v{0 W; j- W  B2 C3 W; F5 m: U
   WORD version=MAKEWORD(2,0);
( a, b5 D- ~" u   if(::WSAStartup(version,&wsaData)){/ [; O! g# _$ z: n9 b
      sprintf(szTmp,"Failed to intiailize socket,error no:%d",::WSAGetLastError());$ N8 ~0 l% h) r. {$ }
      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);
) V$ m: Q/ b$ a( G      DoError();8 ]- x: I( G/ G4 {+ W, n% Y* U6 |9 Z
      return;
+ l9 q% d0 Q( n( k1 K   }
, T1 S5 `3 J- l6 X2 @7 v; y}
5 z3 R" d( f, H5 X$ l* V* Tvoid __fastcall TListenThread::CreateListenSocket()
! j/ l! l7 V2 [8 o{2 O. i3 f. ]) T, D0 C. p% U
   switch(m_Protocol)
, J, ^6 h' O7 J# }& k   {2 U) f: u  I+ O. @5 j6 i0 o  g
      case UDP:
$ f: E+ L2 X# H, H         m_Socket=socket(AF_INET,SOCK_DGRAM,0);
7 A* w& E: T# ]         break;- S8 u% B+ \& ^/ g
      case TCP:; d. x% l3 N8 {" j* i% f* R; p3 S
         m_Socket=socket(AF_INET,SOCK_STREAM,0);  \+ [; y6 G- v9 [, t
         break;+ b& X. n7 h  q8 g# T+ B
      default:; O$ Y: L" h4 U, X4 c
         sprintf(szTmp,"Error protocol!");
" `* D/ z, C# o# Z, l  y         ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);
6 ^" X, W, I/ T0 y/ S0 e! [         DoError();6 h; L$ s% d) u  [  p' c
         break;
2 D* {$ M5 v( R3 y* T% ]   }
* P( K% U7 t7 ^  w, N- x. n* j$ P   if(m_Socket==INVALID_SOCKET){- k- }% ~2 D# n$ ^
      sprintf(szTmp,"Failed to create socket!");
0 A6 d" K$ F6 E9 n6 n) Y      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);, O% l; X6 L6 E2 ?7 M! r
      DoError();
8 H1 L; S, C/ p5 r& E& U      return;
6 P" r" s1 }2 O' e   }; \" M4 n* Z3 |; t' R$ L& |8 O
}8 M, ~7 k" f9 q, N0 h! @
void __fastcall TListenThread::SetListenSocket()
2 l, i0 t+ \* j3 P{
% s$ ^0 J6 B  H! L* F. ~1 J% \: R3 ^   server.sin_family=AF_INET;0 S6 h5 O; a7 l7 H) v2 V3 _
   server.sin_port=htons(m_Port);6 o) U# ]# J9 s
   server.sin_addr.S_un.S_addr=INADDR_ANY;" p8 K# K: n& r+ z0 @7 g7 n
   int NewOpenType=SO_SYNCHRONOUS_NONALERT;
0 d$ G2 n! a% o9 a   if(setsockopt(INVALID_SOCKET,SOL_SOCKET,SO_OPENTYPE,(char*)&NewOpenType,4)){1 {/ N% _3 c* Y' q1 t; Z; _& i2 A5 E
      sprintf(szTmp,"Set socket option error,error no:%d",::WSAGetLastError());1 T. L1 v# |# K5 l3 ]2 s0 Z/ s
      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);
6 r. s$ T8 V3 ^$ {/ `; g1 m      DoError();( ]9 ^8 R0 J0 d
      return;6 U# O( K2 b1 B# W* X
   }
/ Y! M" B' ^! H: q3 i}9 l& O7 E8 \! p) L2 @
void __fastcall TListenThread::BindListenSocket()
8 w# q$ ~9 T% G4 ~% x1 j0 i{
4 I  R! f, c4 A; T, ]0 }* X9 g    if(bind(m_Socket,(sockaddr*)&server,sizeof(struct sockaddr_in))){" v" [1 T: |; D( I: P# Q0 R3 ?; F5 E
      sprintf(szTmp,"Failed to bind socket,error no:%d",::WSAGetLastError());2 f5 R% K/ f1 f# Y% J
      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);
+ C0 [5 h, O0 X: e; ~      DoError();2 p+ s2 k: B; c2 Y7 P4 s( N
      return;3 J' _/ m' u5 X3 N; i
   }
: M7 F2 J0 n! W, ]( n4 ]' ?5 j
4 b0 F% D1 u9 @8 K* z% a}9 u8 ^: x( C; ?2 F' E! q1 h, ]  K
void __fastcall TListenThread:istenSocket()
8 \5 @/ W- Y' H" N" k' A{/ B( y' b- d9 T
  if(listen(m_Socket,SOMAXCONN)){
  h+ i* Q# G0 L3 d# _; b! W     sprintf(szTmp,"listen error,error no:%d",::WSAGetLastError());7 U6 L" N$ u" n3 K! q# U% T
     ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);# T2 N3 t& O, P8 ~
     DoError();  |  f7 q2 d5 N  S3 Q
     return;; \; U$ G1 x4 C6 S/ [2 \& f. i; U. r
  }
) F3 y3 i7 D5 H7 Q# j  //Determine whether there is any connection5 ~: X1 k7 M# h$ ~+ W0 |
  FD_ZERO(&FDS);
  y/ P" o1 U! Y  e8 z; S# F  FD_SET(m_Socket,&FDS);$ u6 \) u+ u  {+ s3 P
}: w! G/ C$ S  y- l2 @
void __fastcall TListenThread::Execute()& x; D6 e7 b7 O. G0 b3 T
{6 r8 z1 J- F% Z# p6 ~4 O+ N& q
   char buf[4096];
/ x6 i; r0 `4 p0 j& [   struct sockaddr_in from; //for UDP
& f6 k* g2 E9 Q9 f# e$ V8 [( U0 j* r' [   int nLen=sizeof(from),nSize=0;  //for UDP9 M" A) s$ e9 C7 q
   InitSocket();! C# R1 y/ n$ H5 H
   CreateListenSocket();
! R" V. o/ |% g0 \$ O5 `   SetListenSocket();
( V1 q# W* |  D3 v8 R   BindListenSocket();- }( P) k8 p4 n0 e2 s" T, g
   if(m_Protocol==UDP){
! `7 l' w* ]5 i$ C' L# m1 _0 J8 A      while(!Terminated){% v) [, |/ b+ |( n  h3 D( r& ~
         int nSize=recvfrom(m_Socket,buf,4096,0,(struct sockaddr*)&from,&nLen);. q9 n. [" R% r1 ^
         if(nSize>0){) q5 s. E3 g6 O6 A5 S% G% b
            buf[nSize]='\0';
5 C/ i1 p5 n# f: q, u6 T            PSTNForm->Memo1->Lines->Add("Received Length:"+String(nSize));& T9 u- Z8 t+ \
            PSTNForm->Memo1->Lines->Add("Received:"+StrPas(buf));
8 X# K* |% E& I5 T6 m8 T" L6 N            ::Sleep(100);
4 m. H- S" X3 S3 J4 i/ ~            sendto(m_Socket,buf,nSize,0,(struct sockaddr*)&from,sizeof(struct sockaddr_in));+ m5 h3 k; T! c
         }8 K( S* |! E3 S5 `9 V8 ~2 B$ ?$ k
         else return;6 ^5 d' z' d8 Q* [
- i9 p) z" e% j3 W7 F6 w1 I
      }7 A" r% B5 B9 c
   }) l# p: c; y' S5 ^# [
   ListenSocket();0 E$ e0 J+ p( a* T
   struct sockaddr_in client;
/ E; o. k! n* h1 }' N   int nLength=sizeof(struct sockaddr_in);
# C% j8 g/ c6 j  K) Z! r   while(!Terminated){0 N6 _* I% v0 \+ g7 ~* B
      int nError=select(1,&FDS,0,0,0);
3 o/ b  \5 L5 @$ |, J      if(nError<=0) Terminate();
. h. \; U) W' v; \# ?+ c8 G1 ?      SOCKET m_AcceptSocket=accept(m_Socket,(struct sockaddr*)&client,&nLength);7 _+ j: e; {; u$ u9 i5 {# g
      if(m_AcceptSocket==INVALID_SOCKET){+ Z5 I3 z& x) _; a8 v' o' z
         sprintf(szTmp,"Failed to execute accept,error no:%d",::WSAGetLastError());
+ `0 {9 F" {3 Z, d6 B& ^/ Q% u. T% v         ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);" |0 s9 _$ }- I7 H3 k+ ?/ |
         DoError();9 |+ m' h! A+ y; _' s
         Terminate();
) W* p2 T7 f6 R" d* K+ E( m         return;
: V: K% E% R$ P      }3 s& j% c: Y& |, m' ~) D3 \0 y2 [9 D
      TCommunication *pCThread=new TCommunication(m_AcceptSocket,FALSE);. R! x4 }) U$ U
      pCThread->Terminate();
: m$ f4 c; Y+ p0 ]      pCThread->WaitFor();& v* l& E% o( {9 z7 {" q& p
   }
2 b8 {& D: k, |2 W2 |0 E}
4 s: q8 D( Z3 c' I, ~( i5 n- T//************************PSTNForm*********************************************//+ Q5 t: V& P9 E$ x; H. Q% M
__fastcall TPSTNForm::TPSTNForm(TComponent* Owner)
. U- I' e- ^, M+ W8 m0 E, a   : TForm(Owner)( `$ I7 Y3 N  p
{* y6 c$ `! U. i9 y
}
# |6 v6 g" y& L( g2 u- w, E4 Lvoid __fastcall TPSTNForm::Button1Click(TObject *Sender)8 ?  B7 A, m" @: I5 V6 q, u
{
2 @+ V3 Y4 U: @' s3 f/ p0 ?   Close();
7 T1 u( X2 S1 C: z}
- Q' N/ H3 m* S8 L, V' |& P' }void __fastcall TPSTNForm::Button2Click(TObject *Sender)
6 Z2 o. g$ Y$ v! D* o) X+ V5 j{1 b- m2 w# R$ U2 Y9 X
   if(pThread){& ~7 Y1 k" v$ s! I, A
      pThread->Suspend();
+ |# O  w, A8 b4 Y+ X) {/ o      pThread->Terminate();* s2 W$ ~( A4 l3 _$ s/ V1 ^% j( t
      delete pThread;2 {$ q! F( [( ?, H) r
      pThread=0;* m7 d5 Z; O! o5 j/ v2 u
   }( H; w& n+ N& Z8 O$ V
   UINT m_Port;" X! I6 }8 I3 z( M6 S" y( L( {
   try, p: B. t* R: c. M, O
   {4 C% L" A; a( \7 n) a
      m_Port=Port->Text.ToInt();% e/ R1 P! i. o+ b9 X
   }
5 E' d$ p% j4 T+ s% H8 |9 P   catch(Exception &e), O& n; z" i# j7 t! c& {
   {
' F, B2 M5 x+ u* ^' F: u: j- n1 C      ::MessageBox(0,e.Message.c_str(),"Error",MB_OK+MB_ICONERROR);
+ s9 j. r4 _: B      return;9 z/ m  O4 B$ \0 u8 g+ ^
   }
  `* K$ Y& q4 H2 x( S+ m   PROTO m_Protocol;+ b! B% _# P( {
   switch(Prot->ItemIndex)( S9 {5 B( o  E' x
   {, B2 Q2 C, _8 E( P9 m
      case 0:. e7 @8 o9 w/ s' A* v( c" W% W/ g  s
         m_Protocol=TCP;
/ |3 H8 y! g) P7 I9 k         break;
, Y6 p! U" m& w1 R5 i      case 1:
' ^3 U5 ^5 \3 q         m_Protocol=UDP;
% H  D$ b0 ?0 @. M" \  P2 b( z- s         break;) \, v# [# w. h1 H6 J
      default:5 K3 L1 T0 J% y9 e
         break;
) }0 a/ B; u+ D0 A1 z* c9 |) b   }1 I# o, x$ T1 y
   pThread=new TListenThread(m_Protocol,m_Port,FALSE);$ M  R* I  d$ f4 ]! k
   //pThread->Terminate();
4 r7 D% f0 e) v+ S: p1 J}. s3 A3 k% ^# ?4 G; r$ Y$ Y: ~% C
void __fastcall TPSTNForm::FormCreate(TObject *Sender)
6 i, K/ @0 t6 [7 F{
  O& z, o- q* K1 k! M. y   ::SendMessage(Prot->Handle,CB_SETCURSEL,0,1);
% H) i7 d& x* K}! z% S8 z) n* `# z2 Y7 E1 l+ s
& G' f& f6 C2 F! \. S. L0 Y$ T6 P
void __fastcall TPSTNForm::FormDestroy(TObject *Sender)* v# y, E2 S) {
{- ]0 y& F& @/ }3 t( \: S; }
   if(pThread){; Y9 i+ d9 \0 x
      pThread->Suspend();" k& I8 c4 p" b, V+ C8 ]
      pThread->Terminate();}& i* D8 ^, ]' \$ N5 K6 ]) h3 W, U
}1 Z$ |& `( b& `! G
上面的代码,各位可根据自已的需要和针对自已的应用,在数据处理方面加以改进就可以了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-8-15 11:43 , Processed in 0.023503 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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