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

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

[复制链接]
发表于 2004-2-15 14:01:13 | 显示全部楼层 |阅读模式
在CB中用socket api来写网络通讯程序
0 D1 |: F' ?) M作者: kingcaiyao ,如转载请保证本文档的完整性,并注明出处。
! ^5 ~, N2 ]1 Q- {2 b, B) i: A欢迎光临 C++ Builder 研究,http://www.ccrun.com/doc/go.asp?id=5690 D- o- [0 D7 w8 j) z
本文转自csdn,作者:kingcaiyao+ A) y' }1 \# C' P5 l
原标题:在C++ Builder中用socket api来写网络通讯程序(同时支持TCP和UDP协议)
9 T0 m) K$ u8 h. Z原文:  http://www.csdn.net/develop/read_article.asp?id=19883# U# H  q: z: h+ }3 u7 h

+ E) `7 f6 f' I7 e" w
) i0 y  p8 \9 F1 s% h) F在7月4日看完sockcomp.pas后,我决定用socket api来写一个客户端和服务器并且同时支持TCP,UDP协议,于是我就去做,现将代码贴出来(已调试通过)% l0 T; G2 R+ l: [
Socket api Client:
' A% b1 J6 r; a& z. y" M. W0 P. ~7 x5 P) x
#ifndef UDPClientH
/ p3 p  w+ v2 m! z. l; \#define UDPClientH
* W! N: W  _' R#include <Classes.hpp>
& m% c, D, L5 J#include <Controls.hpp>
! P  l* ~# h! x. W8 L" e#include <StdCtrls.hpp>- t" H9 P  [' {) q7 J  ~
#include <Forms.hpp>+ |7 A+ o4 y5 J: ]& R7 b, u
#include <stdio.h>
9 o. M- q8 O% l' ~7 A#include "CCEdit.h"
1 E7 q$ i. g( n$ C( z#define WM_SOCK WM_USER+100
0 _1 a4 R& g' o2 N: hclass TLANForm : public TForm
9 @' C& N* ~6 a{
0 i" f) h$ w: I2 F. }- f__published: // IDE-managed Components: C* N- B% J& ~, d
   TEdit *Port;7 J, q, b% [: W- u
   TLabel *Label1;
4 t% V0 [$ F/ W% J/ D   TLabel *Label2;( d2 n3 L0 d$ R
   TComboBox *Prot;
! W1 e& b2 k) N5 k2 Y8 t( O* s+ s3 r   TButton *Button1;
: S+ R6 ]6 {- E# `- O4 G   TLabel *Label3;1 ^- g; d$ L/ Z1 S/ z$ @8 e
   TEdit *Addr;- S. m/ p6 M2 X# W, l
   TCCEdit *TxtEdit;" [$ C) I7 R8 ^# @5 r5 z0 }
   void __fastcall FormCreate(TObject *Sender);+ L& d4 s9 }5 f8 M) G& Y
   void __fastcall Button1Click(TObject *Sender);
  ?: g/ m3 Q; N  S/ l% N   void __fastcall FormDestroy(TObject *Sender);5 H1 ]* H- W8 `9 Z% Q' W; q
private: // User declarations  {6 ]# o( }7 Z1 a: K# ?
   void __fastcall OnRecv(TMessage &Message);: D& ]# t( d! ~* N
public:  // User declarations
3 x0 R4 v! `) K7 K- O3 W   __fastcall TLANForm(TComponent* Owner);
- F' M9 V& _# F& C/ ^( p4 F" s   BEGIN_MESSAGE_MAP
0 `) h) B1 M/ ~/ x9 \7 ~( B      VCL_MESSAGE_HANDLER(WM_SOCK,TMessage,OnRecv);
* V% R5 c0 e8 T5 Z0 \4 j2 h3 \   END_MESSAGE_MAP(TForm);
8 B9 t( P8 w  ^) o$ n};
4 f. W. @' }1 nextern PACKAGE TLANForm *LANForm;
7 X( F) ~$ ^: w7 g#endif
6 l4 P3 i" T/ d) Q) U* M6 Z4 a7 ~7 D9 G6 O' X. o
, N  z- X0 l2 W( l
.cpp File
, Z% m" W. p, k$ x( H" f( V* N3 f( I. b" V; l
#include <vcl.h>
& B) d4 l( `3 n3 i, T#pragma hdrstop! y0 v+ C/ _2 e7 S
#include "UDPClient.h"
  g7 w9 v; k& @  |) I#include "WinSock.h": U* _  [  [. h7 M+ g! g: u
#pragma package(smart_init)
+ b, l* f$ ]9 f! d# x/ G/ g#pragma link "CCEdit"
" Z+ [- a7 {0 ?3 Q/ x#pragma resource "*.dfm"2 D: {1 }( P$ E& O( j
TLANForm *LANForm;8 l1 `) U% O; p
enum PROTO {TCP=0,UDP=1};
3 Y. L% I4 {) Q7 Z- X9 TSOCKET m_Socket=INVALID_SOCKET;
/ C) W# ~. `; N+ ^. M/ rPROTO m_Protocol=TCP;4 G) j9 g& c. j8 n' C
__fastcall TLANForm::TLANForm(TComponent* Owner)
8 d/ W- Q7 v8 T& G+ `7 ~/ u. e; t   : TForm(Owner)( r4 R  ^0 N- w5 N+ m7 v# @
{6 J5 c$ N  o# j; c3 {

5 {  k* t" V3 j$ ^  W. c2 G$ |}. V5 z' o+ b# {
void __fastcall TLANForm::FormCreate(TObject *Sender)9 D" H3 ?! H9 I, L
{4 \/ c  |4 n  F6 i+ b0 b2 |7 N+ T
   ::SendMessage(Prot->Handle,CB_SETCURSEL,0,0);
3 ?& `! Z+ H  D0 V! x2 t}
3 Y! ]$ {2 S. A# C. @% Mvoid __fastcall TLANForm::OnRecv(TMessage &Message)# @1 A" ]% {, t$ n2 @! J, n& a
{* g, t1 S: F6 Q& h) s  D
   char buf[4096];
8 V! Z8 X6 J. _   int nLen;/ e6 Q7 t! S; |% \$ v" I, c
   struct sockaddr_in from;
. ?, V, o- n3 F4 e   int nLength=sizeof(struct sockaddr_in);
6 U* o% Z6 [" j$ B! k4 P   switch(WSAGETSELECTEVENT(Message.LParam))
8 R- B* q7 }7 B( |6 _& s4 Z% S  b/ ]   {
5 E/ z, O) `, V( n% F0 w! j      case FD_READ:( p5 R8 \, W& E  g
         switch(m_Protocol)
- N) g/ n3 V$ K2 l6 B         {# @+ e- Z+ A0 t! Y- t
            case TCP:
. k8 L4 _' ^/ R               nLen=recv(m_Socket,buf,4096,0);* d' V. D- o! m' {8 @
               if(nLen>0){4 C/ T) o& [0 o/ }
                  buf[nLen]='\0';" c8 S5 @! N4 l
                  TxtEdit->Text="Received Length:"+String(nLen)+"\r\n"+StrPas(buf);, ~3 d/ y' A8 m  V: u( J
               }! ^! p) M& e/ k9 e6 f! Z6 r
               break;
6 \0 E0 G' H8 ~            case UDP:; ^! ?( Y. b. b
               nLen=recvfrom(m_Socket,buf,4096,0,(struct sockaddr*)&from,&nLength);
9 F9 ~1 t5 ~1 M$ f' D               if(nLen>0){
- e5 _4 I. I2 W$ P                  buf[nLen]='\0';
+ N" W8 I* g, C0 n0 Q5 I                  TxtEdit->Text="Received Length:"+String(nLen)+"\r\n"+StrPas(buf);
8 V0 u. w4 \9 ?$ t* h1 S               }
2 v4 q% _* ~* m               break;
6 k; X4 h' ]) J& ?/ c+ m8 L# F         }
2 D& o) u8 r; @2 m1 d8 Q         break;  Y+ b! p' h1 S7 p9 J! Q$ a
      case FD_CLOSE:
4 |, Y1 |) x. {& v         closesocket(m_Socket);
1 H/ G4 p1 ?$ q$ h7 K         break;
; h! I! y4 l: A* H$ P: T   }
" r) u  N# c( w7 M: Y# B& H, s}4 m3 |( Q: y0 r5 `& Q
/ @9 ?2 {) W" ?! @0 w, `" p
void __fastcall TLANForm::Button1Click(TObject *Sender)
' L! C2 P8 ?+ G; ~' g{
/ D4 A$ l# L5 s: L: S# O; U7 G   char szTmp[256],buf[4096];2 V& A- ^5 f- N' ^, H
   int nSize=0;
3 z3 I" Q. w2 z- Z. C- |( D   UINT m_Port;! k1 Q. Z* F; \9 f; g' ]: x  G
   AnsiString addr;9 w1 Z7 ]" Z+ r; U! C8 j4 l
   addr=Addr->Text.Trim();
) o, D: q6 z1 F0 N1 P   if(addr.IsEmpty()){, m9 D, `  H' t" ~" p' J/ k
      ::MessageBox(0,"lease enter the server IP!","Error",MB_OK+MB_ICONERROR);
: q4 I: Y1 h/ E8 i5 L) E      return;
3 S' O% C; }: S8 b2 C. ?3 Q   }
9 M, E) _& Z9 @; j1 U- j' D   unsigned long nAddr=inet_addr(addr.c_str());. s# ]- g9 I3 T! B4 s
   if(nAddr==INADDR_NONE){6 X& F' d9 e8 }1 k
      ::MessageBox(0,"Bad Internet IP!","Error",MB_OK+MB_ICONERROR);5 b6 A6 m) l. W2 K$ ]
      return;}
; S- d+ I  K& J  z0 ]% i, F) m7 W5 A" n
   try
- f8 ]4 ]2 K+ V3 F+ Q' M8 R, ^   {; E( y- Y5 Z5 L+ f4 a2 u1 \
      m_Port=Port->Text.ToInt();
1 A) N2 w+ k2 j+ r6 B, [   }+ [6 W/ H5 A/ m1 u
   catch(Exception &e): y& m! e& l) d5 ~3 d) _
   {6 o  o1 ?' i) {* B% }$ `) b
      ::MessageBox(0,e.Message.c_str(),"Error",MB_OK+MB_ICONERROR);
; ], L2 ^! D8 b. S6 |      return;
( K; j3 S8 J7 V" ]+ Y( q. r   }
, F2 ?+ A$ \& {3 s  k  m7 s4 w   switch(Prot->ItemIndex)
  ^: \- u% {/ f! c. V; {   {$ p, H2 V4 U, n- I  Z
      case 0:3 d( I4 |' b& o4 X
         m_Protocol=TCP;7 `; X' ]' F" A) Q
         break;
9 ~; J" O3 L# a9 A  n* T      case 1:0 e3 C0 j6 f9 r: s
         m_Protocol=UDP;
: t6 C# w$ Q: G, X( c+ r3 b% b         break;
, X$ e/ K: R5 V6 ~1 m   }" h. v" v& z5 I  B3 I, z
   if(TxtEdit->Text.IsEmpty()){
7 _1 g/ K$ v3 ]      ::MessageBox(0,"lease enter the text you want to send!","Error",MB_OK+MB_ICONERROR);* E0 l' g4 w' R3 E6 y! a
      return;}# {/ O- P5 R; a! b

$ l( f4 \- [% W3 b+ m   //Initialize Winsocket# T) y. a: \4 f' U' j' o2 A4 n
   WSAData wsaData;
: H+ U# j) O% h- b  E8 D, O   ::ZeroMemory(&wsaData,sizeof(WSAData));
1 s" H. {1 b2 H* ]) [$ W  U( _% V4 @   WORD version=MAKEWORD(2,0);
4 r  p, `! F! Q% I   if(::WSAStartup(version,&wsaData)){! M( }, i4 N- A5 o  [
      sprintf(szTmp,"Failed to initial winsock enviroment!,error no:%d",::WSAGetLastError());7 w. H: j# E- Y& G- o7 k  L! L7 j  J9 D
      return;}
4 F% j. ^, y+ Q4 i
3 g. j& \8 L" i. X' }. L   //Obtain the active connection9 `  `5 H( ?* k: g0 W5 b
   char ComputerName[255];
  m% g' Z" T6 m4 P% z5 {' Y! {   gethostname(ComputerName,255);2 a" u! h0 g' l3 D
   struct hostent* he=gethostbyname(ComputerName);4 h6 t0 c2 N4 h, e) p( G
   if(!he){8 E+ ~. B/ z1 G& k, c$ y& q  c
      sprintf(szTmp,"Failed to get information to host!","Error",MB_OK+MB_ICONERROR);
3 I$ [6 q# r* B& h: @) C      ::WSACleanup();$ P% Y3 B; X: a
      return;5 C7 j- R) x4 v' V2 k
   }
3 e, E7 s0 p6 C* u. E+ y   //create new socket4 _- W$ t1 X1 C- `/ I  w
   m_Socket=INVALID_SOCKET;: K0 v+ ]* z7 ]- x
   switch(m_Protocol)8 X8 j* G& o9 {" r! g3 N
   {6 m. {2 F6 V" Q0 b$ z- X
      case TCP:
3 ^8 [$ `% N7 n0 A. X# C+ B         m_Socket=socket(AF_INET,SOCK_STREAM,0);) j0 m$ k& e$ Y0 ?" L% {
         break;5 o" {# b7 _; r( W
      case UDP:1 N1 e! [5 |0 z# D, ?
         m_Socket=socket(AF_INET,SOCK_DGRAM,0);9 w9 I3 D* |# c+ f+ H, F5 F, W
         break;: u- @- E0 c" v3 W0 W8 i- J* F
   }( Q, L1 n$ F: |4 _7 E  }
   if(m_Socket==INVALID_SOCKET){* t) N; D0 ^+ b8 p  v
      sprintf(szTmp,"Failed to create a new socket!,error no:%d",::WSAGetLastError());. D' d% \; z' m* z7 L+ Z
      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);* ^4 Z1 @' O  {1 P
      ::WSACleanup();
+ U% T2 ]" v$ x7 Q  V      return;
. @6 w9 ~7 n4 S6 e$ q; M   }$ A: a6 e% N. j2 D8 `2 d5 D& r
   //bind socket
- J. ^7 x$ f  j$ Q- A* S# s: Z- c, z   struct sockaddr_in client;/ @& ^% E5 p% R5 a" [4 {# `4 N
   unsigned long nClient;+ r& H; G1 F6 M0 s2 I0 T  D
   memcpy(&nClient,he->h_addr_list[0],sizeof(int));
6 [7 U& m* K; P   if(nClient==INADDR_NONE){
( I# a4 e- K4 v$ {, T1 {      sprintf(szTmp,"Failed to obtain the local machine's IP!","Error",MB_OK+MB_ICONERROR);( _! @6 ?& f+ e. @9 Q/ Y
      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);
2 |6 W1 ?% y% s" Q: ]; q      closesocket(m_Socket);( `$ d9 q$ e6 e  m
      ::WSACleanup();5 Y/ G8 V! L" z" G
      return;
* I0 ]: o5 n; O5 H8 |0 h' ?! j   }
( ^  [- P5 z. h( c. o  X' b# @   client.sin_family=AF_INET;% N- Z' \# j7 Q# i) l5 w
   client.sin_port=0;
5 W. c0 O' ~# ~7 U$ n   client.sin_addr.S_un.S_addr=(int)nClient;
  \& B3 I* ~: Q( H# M1 N8 P: A   if(bind(m_Socket,(struct sockaddr*)&client,sizeof(struct sockaddr))){
& {. W' K# M. `  G      sprintf(szTmp,"Failed to bind socket!","Error",MB_OK+MB_ICONERROR);. X3 j9 ?- n: `/ O* w; ~2 |/ @
      closesocket(m_Socket);
9 c# l+ v: t" \3 }) x8 k1 r      ::WSACleanup();
( F: O/ C, _* g7 l3 V  Z      return;}
% C1 b! B5 e- M( y% T0 W1 f. N. M! F   //connect socket& N0 p1 ]8 R4 j! P, `' a3 }
   struct sockaddr_in To;
8 b$ f- e/ y2 V7 O6 a3 |   To.sin_family=AF_INET;
: |5 B; C7 _) I9 m6 l) p& c) E" N   To.sin_port=htons(m_Port);
2 _' v" C& K; w& r5 R! E; _   To.sin_addr.S_un.S_addr=(int)nAddr;) x1 w; n+ `! d5 M9 H1 ~
   fd_set FDSET;1 ]& _" T/ g9 y
   FD_ZERO(&FDSET);
/ a, W$ R! y+ d% Y; a: m   FD_SET(m_Socket,&FDSET);
/ t5 ^; {7 N, v. d* i) }9 z
/ F  o/ V; f4 u) C8 ]
0 c( `. S& a: o0 @' V/ z   if(m_Protocol==TCP){
8 y# q6 @5 V$ S# P3 N1 R      if(connect(m_Socket,(struct sockaddr*)&To,sizeof(struct sockaddr))){
0 K* o" ]' J3 p* w: `         sprintf(szTmp,"Failed to connect the object!,error no:%d",::WSAGetLastError());: L$ K# E0 w( }
         ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);$ Y9 D0 @( z8 O  {! S$ c" r& W
         closesocket(m_Socket);
2 e' {3 o0 k( w$ ]- o  f/ w         ::WSACleanup();
% x- E: }) E. {( B         return;
- ^7 p; ?! @2 [4 }5 L6 `      }+ E7 R3 h) R- A7 f5 z
      int nError=select(1,0,&FDSET,0,0);5 ]  u. X6 d0 h& a; ^$ B- A8 b
      if(nError<=0){& ~. O0 k2 |6 P
      sprintf(szTmp,"Failed to select socket!,error no:%d",::WSAGetLastError());. d3 A0 P0 i7 {  ?
      closesocket(m_Socket);9 q& o- i; O7 u; @9 W
      ::WSACleanup();
# Q- s! _. U' ]- L4 _      return;}
$ P3 g& w) A/ R# O% w0 H, J! b   }" W) @2 U7 w  ^6 h- G/ Y- t
   //Send data9 m6 E+ {# B* f3 U* W" o/ R
   int nLen=TxtEdit->Text.Length();3 [% o, x$ R5 x
   if(nLen>4096){/ p( t# w2 h) _8 b# L1 g5 H
      sprintf(szTmp,"The buffer is too size to send,it shoud not be more than 4096 bytes!");
' {0 c7 a. Z- D! }3 T' @      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);7 I3 z% x1 y5 a! I: [
      closesocket(m_Socket);
" E6 ?" A7 h- c" e3 L) S      ::WSACleanup();* [7 e* l4 J( F
      return;
) g. r8 F( ^6 a" _  [. e9 w   }3 ^. `$ X9 G! h
   strncpy(buf,TxtEdit->Text.c_str(),nLen);1 m( u4 g1 R# {+ T
   switch(m_Protocol)
4 X& x6 X- l7 P5 }/ h; Q   {
3 u, W: @  ^, ^! L      case TCP:9 u0 B! l2 S* l# s" m
         nSize=send(m_Socket,buf,nLen,0);/ x3 {% e! p7 p. J6 J! B
         //ShowMessage(nSize);2 g. O# H4 o! P2 p8 w
         break;
* L# J$ T) i% q* g      case UDP:
2 G5 x+ r% Y7 i5 R& y1 u0 U         nSize=sendto(m_Socket,buf,nLen,0,(struct sockaddr*)&To,sizeof(struct sockaddr));
, ?8 u) n1 u, l& H  i" w: M. g6 F1 r         //ShowMessage(nSize);6 E% j8 G4 W, z; {
         break;% {2 x9 P- u+ h  P) Z. x! l
) r1 P8 P1 q2 P# G1 C7 T
   }
( x/ C: D' Q' f' M# c   if(::WSAAsyncSelect(m_Socket,Handle,WM_SOCK,FD_READ|FD_CLOSE)){
+ E9 i/ D% l- o1 `( I5 a' y      sprintf(szTmp,"Failed to register socket event!,error no:%d",::WSAGetLastError());
- k9 p# w/ P. q9 N2 G" z      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);' p! g/ g7 G) _
      closesocket(m_Socket);! j+ {) Z: w. o
      ::WSACleanup();8 `1 {- I7 a8 i6 q' z
      return;}
/ M- q7 f, j" h0 e}
  `( ]7 o1 |. V  v7 Z3 F& {% [4 l+ mvoid __fastcall TLANForm::FormDestroy(TObject *Sender)
6 J1 L7 W. U5 |8 c& n! l/ @$ j{
* D9 m( {  {2 o+ u, l( J# X) J6 P   closesocket(m_Socket);
# m! n" |0 a( ~) m& l" _" e   ::WSACleanup();$ Z3 [: a5 ~: r8 M9 U
}
; Q  e; h* I6 I; x' b4 F
! o: @+ ^6 [8 K" B! M  kSocket api Server:
+ ^7 Q7 @6 X% ?/ x9 o.h File+ v4 M3 N7 A+ z1 s
#ifndef UDPServerH) q) ^: }0 h' H8 T- K
#define UDPServerH/ {& p( y& f" ?3 ?
#include <Classes.hpp>
: g& w. V) A3 ?3 ]1 ?6 b#include <Controls.hpp>
' j0 X% t+ |7 H( ~4 n1 @0 K#include <StdCtrls.hpp>
% B9 X9 m( U; h  `. \# o#include <Forms.hpp>
( D( L# `6 |# L% `, G/ {3 T#include <stdio.h>+ A5 p6 f1 g, ]( Z2 K3 {* N
#include "WinSock.h": B- z1 K' S* \
/*#define WM_SOCKET WM_USER+1000
% N2 m  ^6 [# Y6 Q#define INITSOCKETSUCCESS 0
% F' h0 [+ {2 v' Y2 a$ N#define INITSOCKETFAILURE 1
) C+ C! I! Q0 w9 w, \8 }% s8 H#define CREATELISTENSOCKETSUCCESS 2
7 ~6 B# k" Z$ O0 o# I: j#define CREATELISTENSOCKETFAILURE 3$ v+ y4 U& D0 d2 ]
#define SETLISTENSOCKETSUCCESS 4
% N  D! ]9 p3 f#define SETLISTENSOCKETFAILURE 5
$ j( B+ B* Q7 ]0 V3 P. r#define BINDLISTENSOCKETSUCCESS 6
8 R' z9 _. X. B, w#define BINDLISTENSOCKETFAILURE 7" g& v7 M1 D: v! z  @; C
#define LISTENSOCKETSUCCESS 8
) M. o8 K2 T" ]/ ~( s8 c" R. }#define LISTENSOCKETFAILURE 9+ g; W, |5 p0 {2 i# l, o
#define ACCEPTSOCKETSUCCESS 10
" K1 \. q$ G% s3 e1 X  \- ?#define ACCEPTSOCKETFAILURE 112 P" n2 C1 _, `! b. n5 s
*/5 K# Y! z) B* \# Z9 Y% {4 z
class TPSTNForm : public TForm% s8 c- c3 n% }3 N+ p) Y
{
% `) n8 b8 B- o: j__published: // IDE-managed Components
' K' x; U& h: O   TEdit *Port;
! _- a: y+ L$ H% l" |6 u  l& ~* V   TLabel *Label1;
, ]# q) j' W6 R4 _! ~2 }: D   TMemo *Memo1;% W8 W9 E3 o) x4 U$ g
   TButton *Button1;% t+ Z2 q  s: v/ J6 I
   TButton *Button2;
) M1 \4 B: {+ k# Z6 I7 ^# W   TLabel *Label2;. x7 f6 `3 Q: ?4 W$ Q9 U2 I
   TComboBox *Prot;9 F9 V# k9 ~" I% \
   void __fastcall Button1Click(TObject *Sender);/ ~8 U  {2 L$ W
   void __fastcall Button2Click(TObject *Sender);
" o+ H) v6 O) A  D$ p2 h" f   void __fastcall FormCreate(TObject *Sender);
. }3 p5 R* N( H# q7 k) y- T   void __fastcall FormDestroy(TObject *Sender);
1 K  S) d9 S3 r# e1 x' C5 yprivate: // User declarations1 n, K  j/ |1 [+ o& w$ `
public:  // User declarations8 h8 L# e4 c8 {
   __fastcall TPSTNForm(TComponent* Owner);
( z" U- P. f/ a) l: X};
# K! R% T  e, x. W& H$ genum PROTO {TCP,UDP};
8 P9 ~& |" g$ J: \* |; ~, Zclass TCommunication:public TThread    //Communication Thread  O! E* R4 U! Z( z' S) k6 o
{1 A2 [: A0 o  R( w6 }) M
private:
, N3 f& B, m6 u' H; z& h1 B" [( J% J3 U3 b   SOCKET m_AcceptSocket;
1 e" n9 k8 l1 b   char szTmp[256];//ERROR MESSAGE
1 r' J8 Y$ C+ y  Ipublic:
  g( ], F! `6 g& N+ t3 b   __fastcall TCommunication(SOCKET m_Socket,bool CreateSuspended);% c" ]8 n3 h* K8 z
   __fastcall ~TCommunication();
8 i; `& Y$ ]0 _protected:" ~1 f" {8 X6 m! v
   virtual void __fastcall Execute();4 \3 v/ N7 t% D  E" R2 V
};3 x) i2 x# X1 T+ @
class TListenThread:public TThread //Listen Thread: t8 I, U! D( I$ i! c2 q. ]: ~! V
{
$ x% u5 h3 Q2 `' F! Mprivate:
& s: W. H& ]2 O, d3 @2 t/ _   WSAData wsaData;
7 R" ^2 P3 V, }' t   struct sockaddr_in server;4 w4 u; X1 H( x' Q
   fd_set FDS;2 y/ Y1 f, L. F( S) o) i/ K
   UINT m_Port;3 z4 {& z) l6 v7 L+ {0 Z# ]
   PROTO m_Protocol;: |* _2 B( j1 X" L
   char szTmp[256];//Error Message* m! j5 Z8 g8 P! f* U
public:
( z4 O# @7 v2 G  T3 I* q2 T   SOCKET m_Socket;
5 c3 l$ C3 N0 i. p5 C; g1 P5 @0 D   void __fastcall DoError();) w9 ^. Q! J7 [, T
   void __fastcall InitSocket();, p$ p& v8 _6 p( N
   void __fastcall CreateListenSocket();/ A) \1 S4 |6 {: l/ g
   void __fastcall SetListenSocket();
+ x. t" l. V0 R. T' N   void __fastcall BindListenSocket();, j! s- I" Z+ n" T" f+ Z  F
   void __fastcall ListenSocket();1 e/ H3 l# F. \, L8 p* S3 B

' d! \& L' m. C% I! n% @public:$ e. j% C/ n& W" z2 {( h9 \$ ?
   __fastcall TListenThread(PROTO m_ProtocolA,UINT m_PortA,bool CreateSuspended);* K7 ~$ J2 y; y
   virtual __fastcall ~TListenThread();
: X" c  d. T5 K) v6 x& T9 aprotected:
4 x! h0 ?2 W! t+ O  H   virtual void __fastcall Execute();$ q- P8 F' w+ L* \( L: ?
};
% D& B3 a2 ~( c% y) Aextern PACKAGE TPSTNForm *PSTNForm;
7 k  L2 C6 O5 z/ {3 ]2 k#endif4 [1 @0 W& I% }  t
.cpp File
2 K9 `, P- j: R' }( r$ V/ w; f#include <vcl.h>
! j# |6 X8 ~, C4 K9 p4 t* Z* y, r#pragma hdrstop
2 L( J/ ~- O) k#include "UDPServer.h"1 m+ e) s) p4 x5 D" y; a/ [4 R3 @
#pragma package(smart_init)
! e* F" R+ h4 Q3 l- b- B# o& j+ U#pragma resource "*.dfm"
- B/ x( P: e0 V; s* K- R9 _TPSTNForm *PSTNForm;
( T# O: w+ c$ |TListenThread *pThread=0;
+ t' }0 [7 C  N7 F) E- }//******************************CLASS TCommunication For TCP****************************************************
8 I7 O, o" x' @+ F/ ?__fastcall TCommunication::TCommunication(SOCKET m_Socket,bool CreateSuspended):TThread(FALSE)
/ L# n: i: C8 ]& O6 W{: T4 s+ Q7 b# _( p6 n8 Q4 b3 `: a0 O
   m_AcceptSocket=m_Socket;7 ]; E+ x( o$ U, d4 R& d) J! w
   szTmp[0]='\0';3 G3 M( s. O, S
   FreeOnTerminate=true;0 O- L4 V  C! D- A# n
}
- W+ F, O2 {/ j6 }% N6 V__fastcall TCommunication::~TCommunication()
8 G- {2 W5 ]4 g& D1 ?{; F7 a) n/ i/ ~% p4 w4 T6 U3 O9 p
  // closesocket(m_AcceptSocket);
7 u! ?8 d6 }0 d, a% \" ]3 ?}, I+ W7 g! T$ \, T: q& U' N* _
void __fastcall TCommunication::Execute()
: P7 G2 I2 w- w6 R( f{
; y  q" p! ~- ?6 K$ ^   char buf[4096];
" g6 g5 q8 A1 P0 |6 }   int nSize=0;+ H! m8 {( X% [/ U$ E2 O& v
   nSize=recv(m_AcceptSocket,(char FAR*)buf,4096,0);
2 y! i& j. }4 V# @1 Q+ e5 ~' f6 c. a" w   if(nSize>0)
6 J2 W  ?. |9 d: c   {
0 m  I3 \3 V( A2 Q      buf[nSize]='\0';4 q% J: I+ Q4 z& v6 d
      //Display
: i3 h' W2 `  a6 B      PSTNForm->Memo1->Lines->Add("Received Length:"+String(nSize));
0 `. U. J& a% n) t2 z( B8 h      PSTNForm->Memo1->Lines->Add("Received:"+StrPas(buf));: j( G) m1 n& l
      //Deliver
8 N+ e- l8 _$ w      ::Sleep(100);
" P5 Q& h  W5 n! }      send(m_AcceptSocket,buf,nSize,0);
6 I/ c3 I! Q0 @. D: I5 w1 c   }
' _$ ~# A2 L1 x) u7 G. ^7 B# q' T* G
}
: U% g1 o0 ]) R, J' \; O. S" E//******************************CLASS TListenThread*****************************************************: I, j9 u2 L; k, |5 Q
__fastcall TListenThread::TListenThread(PROTO m_ProtocolA,UINT m_PortA,bool CreateSuspended):TThread(FALSE)
8 \1 t1 I( y- T0 W2 E% }& X+ O{
- z; e3 }. J; ^0 L7 @   m_Socket=INVALID_SOCKET;
8 u% }& C% d' K4 [, i   m_Port=m_PortA;
# [1 z: e7 ?4 I& o; J6 E1 p   m_Protocol=m_ProtocolA;
( q2 j2 [9 [# A7 ?6 h   szTmp[0]='\0';
4 P# c. |* u: _' {) r; w   ::ZeroMemory(&wsaData,sizeof(WSAData));7 U3 y! {. J( t$ U
   ::ZeroMemory(&server,sizeof(struct sockaddr_in));5 E* m: q- r! Y2 t7 n5 y
   FreeOnTerminate=TRUE;//Automatically delete while terminating.
" p/ d5 f$ `2 H* M. |* l+ e2 ?}9 ?" I# N8 N) |2 x6 E) E
__fastcall TListenThread::~TListenThread()* G+ i$ D4 {# v# K! |
{1 N6 F8 u. T1 g1 Z4 `# X& H8 G1 L+ ~
   closesocket(m_Socket);# s( y3 b7 B- c( E. |( y
   ::WSACleanup();
/ M4 k$ d/ {) M* e7 b  O8 G   m_Socket=INVALID_SOCKET;
; s' @  O2 b8 s1 g   m_Port=0;7 y, W# s  g; B+ {
   m_Protocol=TCP;! K3 [- b4 k1 z% d0 O; B
   szTmp[0]='\0';6 G+ L: h( b! [4 n1 x; l4 x0 I0 f
   ::ZeroMemory(&wsaData,sizeof(WSAData));& M; f$ i0 H# l! a: E, V! g
   ::ZeroMemory(&server,sizeof(struct sockaddr_in));
- b0 ]) E4 n6 Q}
- O1 ^# d3 y& ?# O8 c# d2 avoid __fastcall TListenThread:oError()+ B  |, Z: n; v3 p0 V
{
, x4 x% h# |+ c2 c& F- y; ?; d# z5 J   if(m_Socket!=INVALID_SOCKET) closesocket(m_Socket);5 K: [  J8 Z2 N8 T( n" j% b$ n3 U& r
   WSACleanup();
# u3 I& D7 V2 a' N$ i$ Q   return;
0 m* D- k0 z; A3 a}
+ B, T2 i9 e' ]# j; U, `1 bvoid __fastcall TListenThread::InitSocket()
  u2 y( a7 M7 e& C. Q# z! G{
$ ~9 V& i3 Q$ f& [   WORD version=MAKEWORD(2,0);
% Y4 H; ]8 y$ ~0 h2 D; B8 `   if(::WSAStartup(version,&wsaData)){# T( q5 O# ?. j' |/ s
      sprintf(szTmp,"Failed to intiailize socket,error no:%d",::WSAGetLastError());
7 R& ^5 B2 T' l( L; H  W      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);
, d( E1 H: R: l9 a" S      DoError();
) h. P& d7 Y' t2 l; G/ J& p      return;
+ ?; s$ L- J+ q! ~& m+ M   }+ i1 l* \9 l3 S' G* E. i
}8 V9 l( j3 ]) j! m) d2 H( q
void __fastcall TListenThread::CreateListenSocket()
5 Q7 m: o; F4 l# D3 f; b{
- U+ B; D# g7 w) B3 s0 _   switch(m_Protocol)
' b) r% v* i7 Q   {
" u) u0 C7 p8 E) X+ N4 f      case UDP:5 c! s6 m( J; [( v: ^, R
         m_Socket=socket(AF_INET,SOCK_DGRAM,0);
) O. |6 I  R3 Q& g% e3 x3 g         break;
0 y5 D9 N4 _% G$ c% K      case TCP:7 G5 M; {; s' U# Q/ T1 v
         m_Socket=socket(AF_INET,SOCK_STREAM,0);
- Q! u/ O' t7 N6 `) n  S9 i         break;7 ]  @( o) }3 e& f& C; j8 ~: y
      default:
- U8 `, h& Z) c1 d3 U! Z         sprintf(szTmp,"Error protocol!");
. S$ D3 d# I+ R( d         ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);
7 S2 i$ q6 G" X3 Z         DoError();
' T* B/ f  U  I8 r$ E* E. H         break;
3 g! z8 E6 Z6 {; X# m  i# E   }2 \0 J5 b7 {' V% v; B; A) Q
   if(m_Socket==INVALID_SOCKET){
3 k' W2 }& l2 W8 Y, `* e4 t0 q1 [      sprintf(szTmp,"Failed to create socket!");8 R+ T# v& }8 ?
      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);* ]" w5 O/ r4 X
      DoError();7 S( q* K5 x$ W4 K! V
      return;
  B+ l. n) D6 B   }
# c/ H8 O8 s' j- b, q- m}
) @/ w# v; W( x; j: Wvoid __fastcall TListenThread::SetListenSocket()
9 Q& Z6 V& u, W2 e{
5 n, W) a  W. z   server.sin_family=AF_INET;
& R) x9 j) m6 }$ a. G   server.sin_port=htons(m_Port);
' {7 Y  V, Y5 n$ ~+ u. V   server.sin_addr.S_un.S_addr=INADDR_ANY;: F$ C6 Z0 U, E! Y( r! o) T$ j# `2 B
   int NewOpenType=SO_SYNCHRONOUS_NONALERT;. k4 s; D! X8 H) w( b0 V
   if(setsockopt(INVALID_SOCKET,SOL_SOCKET,SO_OPENTYPE,(char*)&NewOpenType,4)){
, _2 q/ e- B' c) p( r7 T      sprintf(szTmp,"Set socket option error,error no:%d",::WSAGetLastError());
6 ~( X1 g9 u% b6 _( l" ]      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);
$ F1 k' |' \5 z: f( ^% M) M      DoError();
( f! c. V+ S( b; z. `      return;6 v* [% X+ a5 F  |9 s; M0 g
   }& H/ v8 x9 x' `$ j1 y* ^
}
! z6 s* m3 L- i$ Q0 _. |' q! ]1 jvoid __fastcall TListenThread::BindListenSocket()' Z: M# t2 l1 k' v" S7 C
{- M! A* B: J' v3 q2 |; H
    if(bind(m_Socket,(sockaddr*)&server,sizeof(struct sockaddr_in))){
) P" j( a* g/ k* o  k4 P7 }      sprintf(szTmp,"Failed to bind socket,error no:%d",::WSAGetLastError());9 v3 Q3 ]. L7 k2 m+ w. L# ~
      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);) W% M( [3 L7 |: e% V( o. O
      DoError();
* u8 n5 i5 u6 U% v      return;
  w/ O5 y0 t! t' e/ g   }: K3 ]$ G4 d4 _+ ^
2 l; B: W! y0 W
}
; J7 C; E) N) L5 C, `% [7 k# Ovoid __fastcall TListenThread:istenSocket()6 k' X& S3 B9 N$ J" A6 B2 I
{2 G, }$ j8 {, n. y  x# _
  if(listen(m_Socket,SOMAXCONN)){
' T7 N% A- |) X# ~     sprintf(szTmp,"listen error,error no:%d",::WSAGetLastError());
5 v% i, E1 Q8 \2 j     ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);/ ^0 g# H* c1 D- |+ w' H
     DoError();
4 y/ n! i$ O/ v, t/ c     return;
4 Y) h" x; `! k$ e  }
4 w  \' v' a$ q2 J  //Determine whether there is any connection/ G" T: V" Q4 g, T9 H
  FD_ZERO(&FDS);+ h- i2 @' `6 i, d- t0 d
  FD_SET(m_Socket,&FDS);- \' g  ]- g' R+ T! k
}
9 D, L% m6 u) j  n' P1 N1 jvoid __fastcall TListenThread::Execute(), X3 ]$ d! y+ e  j
{& t" B! l! y6 R1 v4 k+ i/ C
   char buf[4096];
) \$ O6 ]$ X" ?8 @+ F1 S# a4 b   struct sockaddr_in from; //for UDP& L1 M& d7 v3 x' E" ]
   int nLen=sizeof(from),nSize=0;  //for UDP
, `' t9 h7 X- K- V0 {: i! x   InitSocket();
! L! L! U2 w$ i   CreateListenSocket();) j/ I/ a3 J, ]! e
   SetListenSocket();
4 ]; s4 ?' l' O) J* u5 D   BindListenSocket();
5 P6 r& Z7 Q  k! \0 b   if(m_Protocol==UDP){; H; W7 g! s# Y0 p+ s
      while(!Terminated){' H; w* N0 K" C/ a
         int nSize=recvfrom(m_Socket,buf,4096,0,(struct sockaddr*)&from,&nLen);
# G$ \" F+ L5 c+ H4 h. [6 Q         if(nSize>0){8 m0 t5 L9 t8 n  _  J
            buf[nSize]='\0';
0 {) a) j2 E5 q* X# @2 ]            PSTNForm->Memo1->Lines->Add("Received Length:"+String(nSize));
: |+ A+ E* @/ q! S            PSTNForm->Memo1->Lines->Add("Received:"+StrPas(buf));
3 M6 O5 v: p# }  F* U& W            ::Sleep(100);8 }* m! }. s4 ^
            sendto(m_Socket,buf,nSize,0,(struct sockaddr*)&from,sizeof(struct sockaddr_in));# H: }5 P3 S; k( f$ P+ R# d
         }
& F7 @6 w4 Z) T3 y3 x         else return;
  d0 D/ M  o2 x! C/ x( \7 Y
% g9 _$ H5 ~, |  P$ p; l& u      }
/ m9 Q4 ~8 e. p, H8 Q0 l8 a2 i% [   }
  N8 D2 x. k) D/ x6 V* |' [   ListenSocket();. r4 n9 ]6 d$ x8 D% r
   struct sockaddr_in client;
9 U# F6 \4 o0 `% o   int nLength=sizeof(struct sockaddr_in);
( D# Z0 A& ]) l6 y. F3 p! g   while(!Terminated){
  D2 T" Q4 M4 M, T0 q      int nError=select(1,&FDS,0,0,0);* j( e& g' ]) _" ]/ N1 j' J$ ?
      if(nError<=0) Terminate();
, @+ C+ V, f/ i      SOCKET m_AcceptSocket=accept(m_Socket,(struct sockaddr*)&client,&nLength);
, `/ H! i& v7 M  g" g( c. z      if(m_AcceptSocket==INVALID_SOCKET){1 v: a+ @" G6 ~3 D
         sprintf(szTmp,"Failed to execute accept,error no:%d",::WSAGetLastError());* _2 w- [& J, t9 G4 W
         ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);
' q) }. G! Z% ^, y3 p         DoError();) i- k/ |6 T. m( u- ~
         Terminate();0 r. K, x4 f5 u7 W) m  ^
         return;
+ R1 k" m0 Z/ x      }; Z2 m, Y: B6 N7 f( m
      TCommunication *pCThread=new TCommunication(m_AcceptSocket,FALSE);
9 M& @7 q1 }( s3 j      pCThread->Terminate();: T! q4 l: V$ P0 r" t$ m
      pCThread->WaitFor();
: `" s  b& p, R, B+ a   }
; w5 @* h: C3 s! U}( B4 R9 `1 N* e
//************************PSTNForm*********************************************//" ^' F4 \0 f3 @; h5 [* S/ _
__fastcall TPSTNForm::TPSTNForm(TComponent* Owner)
) P$ V2 D# X. i   : TForm(Owner)' t& ~0 H' N% k: a$ r4 b
{# V4 D8 I+ C  j
}3 ~/ G0 f7 L% l" Z5 _
void __fastcall TPSTNForm::Button1Click(TObject *Sender)6 _2 h; j( @% C1 K
{. ?; u- `$ _, n4 G9 x# H* u
   Close();; h3 c5 W$ U! ^8 Q7 e- q
}
& d, E! i! L+ mvoid __fastcall TPSTNForm::Button2Click(TObject *Sender); b2 y/ `' B6 T; @) y1 q  e
{
- n& M2 G9 T. I   if(pThread){
( N' D8 B9 o" S& f- V' h5 B! E% H      pThread->Suspend();
7 W$ O6 u: J+ T8 \1 ^$ z9 j0 c! y      pThread->Terminate();
( Z! E( H3 Q  t# e" ]" i" ?0 c' C      delete pThread;
: S/ \. }# x( d$ [8 ]      pThread=0;% s  d- \) X8 G4 |, H
   }
% A% D  N' v4 Q   UINT m_Port;4 k: C% o1 V" o* o. X( m. U
   try
8 k$ E+ `' h% L   {
2 [2 K7 _4 Q" m6 W6 p      m_Port=Port->Text.ToInt();
+ `" A; ?& d  f; u* q   }5 a4 e  C+ M0 C6 W* B) G& u, b
   catch(Exception &e)
; r7 L: R/ T) l! _6 b  Z   {+ N9 B& k) n) ]0 t
      ::MessageBox(0,e.Message.c_str(),"Error",MB_OK+MB_ICONERROR);
) p) n& _7 v( r7 C  |. s      return;5 g' S, K: k' R: f
   }
: C$ a* G2 g4 P) |! p   PROTO m_Protocol;% m9 ^7 Y& a9 \: t
   switch(Prot->ItemIndex)' {7 i) l/ e4 @
   {7 f# E+ [5 i+ x( g' c2 L, T
      case 0:# \0 v6 _' G& {' w" b8 W
         m_Protocol=TCP;
: z7 ]4 i" N0 M1 N         break;% Z1 L0 I) t2 l2 ]' m* k8 p2 W% q# V
      case 1:
$ _! R2 @$ p( C7 h4 {( J  y! g         m_Protocol=UDP;7 ~: D; X9 R" A! R: b' S
         break;2 C) s7 w1 ~& ?4 y
      default:
) U6 j1 Q( M4 f) Y0 ?) a& A% l         break;
  `7 |/ b1 j) v4 d2 k* W   }
5 F6 F4 m: O8 q' e0 s; Z9 O   pThread=new TListenThread(m_Protocol,m_Port,FALSE);+ u  S& i. a. n% u1 O- i/ I" L2 F
   //pThread->Terminate();) `% v* N/ S; t& _% ], T
}/ d* j% L# l$ L
void __fastcall TPSTNForm::FormCreate(TObject *Sender)
5 ^! R+ Z! L& B  ?{. E% K3 U; U- ]9 r  d
   ::SendMessage(Prot->Handle,CB_SETCURSEL,0,1);4 n1 x3 X) X# r: w. [7 B4 _! {) J
}
4 p8 N* h4 I; _5 d/ z/ n) ]5 o# x  E6 l  m  H3 K: M# J
void __fastcall TPSTNForm::FormDestroy(TObject *Sender)
2 w# B$ ^3 ~% y5 C" u3 A! V{5 w* F1 l5 l! _# K1 N! t4 L
   if(pThread){: h5 r5 m7 ^/ T) {
      pThread->Suspend();. l' d/ W' L1 |* @! X/ z6 M4 L4 R
      pThread->Terminate();}* d$ X" M  }/ L* h
}
; t5 H1 {# W# P' K6 U+ B1 A上面的代码,各位可根据自已的需要和针对自已的应用,在数据处理方面加以改进就可以了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-11-14 18:12 , Processed in 0.020732 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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