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

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

[复制链接]
发表于 2004-2-15 14:01:13 | 显示全部楼层 |阅读模式
在CB中用socket api来写网络通讯程序
$ q/ f1 T4 M* C5 x作者: kingcaiyao ,如转载请保证本文档的完整性,并注明出处。& A4 t/ t/ C2 y5 ^4 @
欢迎光临 C++ Builder 研究,http://www.ccrun.com/doc/go.asp?id=5699 f* n2 b) f$ p+ B. @
本文转自csdn,作者:kingcaiyao
1 k  W, V8 T" d4 c5 g原标题:在C++ Builder中用socket api来写网络通讯程序(同时支持TCP和UDP协议), N( ~$ J% {; H8 ^  N7 R
原文:  http://www.csdn.net/develop/read_article.asp?id=198836 M% ?7 f7 a0 p- m& ~" R

9 m: c! }8 {* o, f
0 \$ |, M  z6 j, _在7月4日看完sockcomp.pas后,我决定用socket api来写一个客户端和服务器并且同时支持TCP,UDP协议,于是我就去做,现将代码贴出来(已调试通过)4 y0 H. W: ]8 l# Q) ~% [1 t
Socket api Client:3 s6 e* |) Z3 Q2 Z7 c* O1 I

. D& {5 X) L! k' }: e% J0 n" s. S#ifndef UDPClientH
$ p, s# b9 C9 P5 |, W" |4 S3 l9 \#define UDPClientH
. P' m8 x6 C6 T1 q6 e# B6 M) O3 a#include <Classes.hpp>
, k) _- q- `& c& Q) P6 x- L  Z#include <Controls.hpp>2 }# O' V2 T$ K" I  e: s
#include <StdCtrls.hpp>
+ z6 v5 H4 \& e) @1 q#include <Forms.hpp>
5 Q9 {) \5 B! ?9 O2 ~* g$ y#include <stdio.h>% P) j+ c. V$ g: \- |. n. i9 R2 x2 W
#include "CCEdit.h", I5 Z  }8 U. M7 t" \9 E2 S: y
#define WM_SOCK WM_USER+100% C! r& ^  }. O% A
class TLANForm : public TForm' F/ k' G* f1 D( U! R$ D
{
6 A; s1 d" Y" u! G; c  N) G__published: // IDE-managed Components' |+ O3 d- J) O( k$ T
   TEdit *Port;
0 i% s% A- I: i   TLabel *Label1;
4 u. T  b( H& k) k' t" R' ~7 [   TLabel *Label2;& n. F. Z: v* B* o/ P0 e) i
   TComboBox *Prot;
4 {. v: @% L3 {& h   TButton *Button1;. U! S" b: _6 K+ l1 ]
   TLabel *Label3;0 |! B4 j& j# Z; {, \
   TEdit *Addr;
5 L- }* O1 ?$ a; W4 R8 W% j1 v   TCCEdit *TxtEdit;$ }1 V/ `; C# |' {5 w5 ]4 A
   void __fastcall FormCreate(TObject *Sender);/ O/ P+ ~* V  G+ B# I2 F
   void __fastcall Button1Click(TObject *Sender);
* M5 `/ t  R2 q8 R# `   void __fastcall FormDestroy(TObject *Sender);
5 R" D$ N5 f1 i. {, L' g- Pprivate: // User declarations
( K7 E; \% P8 P6 W   void __fastcall OnRecv(TMessage &Message);3 i- O" ?2 b+ @( H; g: u9 `7 n; |
public:  // User declarations
5 g% X: f5 Z* V* I4 @9 |( {   __fastcall TLANForm(TComponent* Owner);
9 D2 L& V# J% P5 S) N1 e+ Y   BEGIN_MESSAGE_MAP6 A$ e2 D! \! S" l4 ^
      VCL_MESSAGE_HANDLER(WM_SOCK,TMessage,OnRecv);
. d& w, W" b' L   END_MESSAGE_MAP(TForm);
7 \4 U$ q6 y6 s( T};& t! m5 M$ l1 A" s& p* B
extern PACKAGE TLANForm *LANForm;% J# s9 R6 V$ {+ W& ]1 |; x
#endif
" f* J! i7 t2 j7 U
1 A; ~( N( M8 o: P/ t* G1 k4 d( f4 S0 p
.cpp File7 B/ D8 i3 x" o/ Y6 D& H
$ ~& C- y& k: u
#include <vcl.h>
1 x# J" p+ W% u% _( E#pragma hdrstop
  X. s! a3 S) r& r) e#include "UDPClient.h"
' |. D- a, I7 J: c9 P" ^/ ]#include "WinSock.h"+ i8 |& K  H5 x/ r. d% V6 v- \
#pragma package(smart_init)8 i1 y- P1 Y0 V# d& T5 m
#pragma link "CCEdit"
- U8 J2 o% b( o7 k; s#pragma resource "*.dfm"9 z$ o7 Z: ^" `6 j( o
TLANForm *LANForm;
3 N. z' I: `& \2 }: r/ f; P( zenum PROTO {TCP=0,UDP=1};/ u! B! y+ e' Y7 P
SOCKET m_Socket=INVALID_SOCKET;  k4 S& m8 s! _% g
PROTO m_Protocol=TCP;) B# W' D2 y( _+ f8 @
__fastcall TLANForm::TLANForm(TComponent* Owner): z2 M* V( A5 v5 f  f
   : TForm(Owner)
: B0 \4 g8 |3 L3 u{
* j) j! z9 {  |2 N, {  a8 `" l2 i' n0 }7 x) k5 f/ B6 `
}0 a1 H; O5 M  Q1 z+ ]' f
void __fastcall TLANForm::FormCreate(TObject *Sender)" n8 y6 y# T+ k" K, Q
{
: k: ?# ]4 b7 @% o) d3 U   ::SendMessage(Prot->Handle,CB_SETCURSEL,0,0);
+ {5 X0 B- ?' ~1 l  ]/ v* G}
& `. Z1 `. y1 Zvoid __fastcall TLANForm::OnRecv(TMessage &Message). m; o1 u4 {7 W
{
, F$ v. @; y  {* `, N% J2 W   char buf[4096];* {- O* \! ~- U- [( |# m
   int nLen;
. [- b% A& ^6 Q   struct sockaddr_in from;
1 j. O: r. j$ H/ n' N   int nLength=sizeof(struct sockaddr_in);
" Y: s: Q* Y' y# }/ c6 M+ _   switch(WSAGETSELECTEVENT(Message.LParam)); L  j' x6 L! y5 X  h  m
   {8 o& U) D' _3 T' y6 w& h$ x
      case FD_READ:" G& `+ G* _) h$ W0 P1 i
         switch(m_Protocol)
& Q* ?9 _) K1 @( f2 n' Z$ P         {& M. f) V! ]9 Y! D
            case TCP:
6 k. s3 A/ I9 t* @8 N" i& E/ b               nLen=recv(m_Socket,buf,4096,0);% ]/ I4 S" Y- z" j, q& Q
               if(nLen>0){6 ]! f: `* n( ]$ n2 \: X- s+ S
                  buf[nLen]='\0';
* l( x/ D' E2 n7 o                  TxtEdit->Text="Received Length:"+String(nLen)+"\r\n"+StrPas(buf);
' d8 K9 `/ G$ S) }  f4 @" i) H               }
# ^9 v$ ]8 [) _  K( C" ^               break;
8 p5 n2 {/ g/ k            case UDP:  l. Q& s2 [  c
               nLen=recvfrom(m_Socket,buf,4096,0,(struct sockaddr*)&from,&nLength);
8 J$ @+ D; F  `9 X! `& b               if(nLen>0){
1 @1 m) |- c- W! V6 b5 t( \2 R  }                  buf[nLen]='\0';* P& B) K5 j# ?0 y
                  TxtEdit->Text="Received Length:"+String(nLen)+"\r\n"+StrPas(buf);
6 g. @! {* H/ a- B8 e               }
4 s( r, h. R1 t$ {1 e" Z               break;
7 o- Z) I9 x* _         }
! `1 \& T- \# p- c- g         break;" S! O$ ?6 R: T' G
      case FD_CLOSE:- g; P; N' f0 y- [) D; p, [( `
         closesocket(m_Socket);2 f  V2 r* ?( I, t
         break;3 m# g- U2 F, {3 a" `
   }
8 Y3 O7 |6 L0 {0 Q  v# h. {}
" R/ M- Y' @3 \' U7 d) u+ e9 p! J1 N: }/ X$ X- J; u
void __fastcall TLANForm::Button1Click(TObject *Sender)" C5 a$ t, _# z/ \) A  w
{% [7 L7 m. W+ L$ P, w
   char szTmp[256],buf[4096];& p0 E' u- K" |# _
   int nSize=0;4 j) c3 S) S, s3 j% v
   UINT m_Port;4 Q1 m. E& s: [* v
   AnsiString addr;
8 t1 f- e5 `' H+ `   addr=Addr->Text.Trim();
' w  ?6 d3 \3 R" J/ g   if(addr.IsEmpty()){7 D* M) o! ?( n( y) B1 W. X
      ::MessageBox(0,"lease enter the server IP!","Error",MB_OK+MB_ICONERROR);7 K) r3 ]& Y9 B' t" q7 R
      return;
1 _& L% G( Y8 A  }   }) n9 X: B- `( A3 S2 o* h4 ]& b, o& G
   unsigned long nAddr=inet_addr(addr.c_str());
2 d& }) c: m& E  |% l! c   if(nAddr==INADDR_NONE){
- I5 F6 A, s/ Z; j4 I      ::MessageBox(0,"Bad Internet IP!","Error",MB_OK+MB_ICONERROR);
6 C1 J4 P  @- D) K# b6 @      return;}
5 @1 t, j+ `/ q, y) j6 f3 P" r8 @. ?$ j' u8 O& S! ~6 F
   try
7 a" h9 N/ r1 L! v3 l! P/ O   {
2 {- r$ |6 x: n; Q, t. R. b      m_Port=Port->Text.ToInt();7 g/ o5 `' R$ ^/ I
   }
( k: W$ z1 U' o) {  a8 I8 a   catch(Exception &e), k$ J  o1 Q" W' S# N
   {
$ X0 ]0 t4 N4 R( G) f      ::MessageBox(0,e.Message.c_str(),"Error",MB_OK+MB_ICONERROR);
2 ~* }1 G3 s5 S" Z      return;+ k3 b- L! F1 S' e( p2 i2 j  x
   }
6 i( p( `, x7 D2 E& D   switch(Prot->ItemIndex)( z, B5 e" h" i
   {
, E4 G; [0 G+ s4 [% \0 x+ @. a" `      case 0:/ Y# d* l( x6 n7 Y
         m_Protocol=TCP;. g5 r! v( v" O/ \, O, s" B3 V
         break;4 t; s& C9 `1 `; J+ q- o
      case 1:/ D, O& N/ y- P5 s# ^6 u. i  w
         m_Protocol=UDP;
' n! ~; W. X8 L5 H         break;
5 j4 L0 z6 A7 U5 t: Q, O+ G9 [   }
$ O( E9 Y# }6 x' [   if(TxtEdit->Text.IsEmpty()){
* ^) {& p- L1 L      ::MessageBox(0,"lease enter the text you want to send!","Error",MB_OK+MB_ICONERROR);
! _% \$ f* y6 c) }      return;}5 q8 N- y# ~* c+ V+ r$ ?8 B8 q

3 w" X4 `+ U" f+ z4 K  O# J   //Initialize Winsocket# T- ]% H- U: n  g6 D1 Q
   WSAData wsaData;
1 u, O! k6 Z5 Y$ r. R# \7 Z   ::ZeroMemory(&wsaData,sizeof(WSAData));
7 {) n7 V3 e: ], Z" u  v   WORD version=MAKEWORD(2,0);
' K4 P( \8 J- n6 F3 W   if(::WSAStartup(version,&wsaData)){
3 j: f0 y( h" W% O      sprintf(szTmp,"Failed to initial winsock enviroment!,error no:%d",::WSAGetLastError());6 ]. z0 j  j" c$ F! _
      return;}
$ l" @  F4 E- `4 d5 F# ]4 H0 x+ B. w: q1 P! p, k; V9 V
   //Obtain the active connection
* a. B. n3 e+ U   char ComputerName[255];( ~& A: t1 z/ F- a4 @5 \
   gethostname(ComputerName,255);' W% o9 g, E6 [# I& M8 s% r+ r2 g/ Q
   struct hostent* he=gethostbyname(ComputerName);
5 }" {4 Q3 [: ]) I   if(!he){, W3 w) G5 {# F4 ?# ?
      sprintf(szTmp,"Failed to get information to host!","Error",MB_OK+MB_ICONERROR);
$ {- ~( q9 z: h6 i9 n4 {! L      ::WSACleanup();
" ]6 K. {% W  V  b- F: U8 Q8 q      return;
$ \" Q* J; {9 {* D   }
! E5 Z- e! s  ?: h   //create new socket, I+ J- d# [/ n5 K# L
   m_Socket=INVALID_SOCKET;
3 j5 K, ]; j/ C   switch(m_Protocol); A5 z- v3 u% j
   {
8 [! `0 v  E$ b( `* |# U      case TCP:4 I8 O8 f8 z8 J" G- b! P
         m_Socket=socket(AF_INET,SOCK_STREAM,0);8 @% ^: l: L/ d- Q( a
         break;
: z; i/ J8 W4 e' S+ ]      case UDP:# K! L  h# n4 J% f$ ^
         m_Socket=socket(AF_INET,SOCK_DGRAM,0);
3 P% }" {* I3 V- ?, s7 O         break;
6 N. S6 V' @7 w7 j  U   }
* {  X8 A0 ]+ ~1 g) |+ ^" M0 s" @   if(m_Socket==INVALID_SOCKET){3 Q6 V. V$ l2 X9 r+ z) A6 J
      sprintf(szTmp,"Failed to create a new socket!,error no:%d",::WSAGetLastError());
# A0 I" y" w+ z      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);# {" ]' |! Z* r. [" E# L2 [) T) ?/ p
      ::WSACleanup();
; Z' Z1 j" S  Y5 x. V# }" X      return;
% W1 q) t& I: |" c8 r3 m9 _& ]( ^   }
7 C- P3 j% u4 i# B- M) m9 W   //bind socket1 t5 W; v/ E) _3 z4 o' N
   struct sockaddr_in client;
2 X+ `4 q/ M2 V8 d3 q; q" ~/ q   unsigned long nClient;0 T, M7 @$ k% I, Q. z9 |4 ?
   memcpy(&nClient,he->h_addr_list[0],sizeof(int));# x$ n; g" N' N8 X& H) T0 M; ]
   if(nClient==INADDR_NONE){+ w2 A( G1 X# ~
      sprintf(szTmp,"Failed to obtain the local machine's IP!","Error",MB_OK+MB_ICONERROR);
, l0 O( i7 T. M      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);7 H% K7 I8 e+ l: s9 o
      closesocket(m_Socket);
9 o" T, o" B- S2 L      ::WSACleanup();
2 e: V- b, p. e$ I& x      return;
3 z- I. v0 \2 w* ?   }! I& ]& a# @' b9 n- d
   client.sin_family=AF_INET;. D) {! t9 l% ~2 `: f
   client.sin_port=0;9 s* V2 ?' S1 ^: N, W7 w
   client.sin_addr.S_un.S_addr=(int)nClient;) h* i5 h( L3 e; y1 c
   if(bind(m_Socket,(struct sockaddr*)&client,sizeof(struct sockaddr))){
! G* B* r5 B( `0 M  l, t+ y8 P5 ~      sprintf(szTmp,"Failed to bind socket!","Error",MB_OK+MB_ICONERROR);
& _; n2 o, ]) B% i( K/ W      closesocket(m_Socket);0 l( e6 }9 Y& K7 [, X- L0 ^/ ]; X
      ::WSACleanup();
" N& q" t. z& e# `      return;}4 A$ d" F7 n' [9 _
   //connect socket: e/ d) _  U: c8 ^  V; o7 D* G! ~
   struct sockaddr_in To;  z& d+ D2 t0 _1 O* L
   To.sin_family=AF_INET;
' Z* G& x* T0 R( a   To.sin_port=htons(m_Port);  o+ _1 y3 m2 j" i) E, `
   To.sin_addr.S_un.S_addr=(int)nAddr;
5 ^6 Z" p, w& H& S   fd_set FDSET;' k# I. K1 E3 o
   FD_ZERO(&FDSET);% ?# x  Y4 G2 R1 l  v+ G+ `7 C( Z
   FD_SET(m_Socket,&FDSET);
$ t, K! z, s/ P" o" z/ o4 g0 c5 D* H4 d9 w4 r. t' D- D. c
8 U3 D0 s" q, V0 Y5 j
   if(m_Protocol==TCP){$ F, R) a7 l% u# Z5 }& t) R0 A
      if(connect(m_Socket,(struct sockaddr*)&To,sizeof(struct sockaddr))){
- n% N( \5 ?. m5 p         sprintf(szTmp,"Failed to connect the object!,error no:%d",::WSAGetLastError());
% Z. f$ M  Z; ?+ c# S) p5 J         ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);: S' o* v2 y3 i& S4 H5 v# Q+ D
         closesocket(m_Socket);
+ A" h: `1 M- j         ::WSACleanup();) k' U- N8 A: r+ l" x0 a
         return;
! N9 Q% l" u( y5 |' S, S, [1 x4 N# a2 u, [      }& O4 R$ S7 k. c: M* k) q
      int nError=select(1,0,&FDSET,0,0);
; E' g- P; y* J: O1 I      if(nError<=0){. G4 n. m; K# ?2 P; c
      sprintf(szTmp,"Failed to select socket!,error no:%d",::WSAGetLastError());" H2 ]; T+ d" C! \0 P$ h# f
      closesocket(m_Socket);4 H4 F( ^8 {' k( n( E( W
      ::WSACleanup();' a4 P. c6 U( a* g. W/ b' u- u
      return;}
( ^* K$ V( m$ _! V2 A3 C$ i. j2 _   }  h) s! k; H) J  q/ _- J* l; E
   //Send data
- y! j( e7 S$ d   int nLen=TxtEdit->Text.Length();
1 g# I2 c9 q6 i7 B   if(nLen>4096){( `7 j/ P; P1 E' j2 `# r4 I
      sprintf(szTmp,"The buffer is too size to send,it shoud not be more than 4096 bytes!");* \4 L; X2 B9 D8 Z- I& z
      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);
6 `+ j. A2 P$ U( a$ |7 ^      closesocket(m_Socket);
4 f5 d/ k  Q) p8 }# |      ::WSACleanup();
' y% B" C  o& l: ~1 a      return;
4 H+ w' N& |4 Q# h! y/ @   }1 w& P1 ?6 C' ~3 v9 |1 S+ r% ^
   strncpy(buf,TxtEdit->Text.c_str(),nLen);
/ d' P& {5 [; ^- ^9 R5 M   switch(m_Protocol)2 K% W& ?3 i2 S( X( F2 f1 O# q
   {, i& M3 r  T1 @) b: \! Z! }
      case TCP:
  [$ h, [  C* w& ~2 e4 S+ X' ]         nSize=send(m_Socket,buf,nLen,0);; H2 q% S( F5 j9 G, i5 N
         //ShowMessage(nSize);5 x' p8 W/ p, U/ b+ b3 o
         break;( Y. g8 |# a( I! n! }7 S# v
      case UDP:
0 T" s: E( E+ e6 R         nSize=sendto(m_Socket,buf,nLen,0,(struct sockaddr*)&To,sizeof(struct sockaddr));  m! P/ `) G, J1 y! f
         //ShowMessage(nSize);, l9 r0 ~  o& C3 o5 O+ L
         break;! \. M( M& ^! _$ \2 Y+ C( S9 ]  z! k
6 L0 d5 P) E5 C( v+ D! ~
   }. Q5 _% H$ i6 n8 ?
   if(::WSAAsyncSelect(m_Socket,Handle,WM_SOCK,FD_READ|FD_CLOSE)){
# Z  C4 r( B2 H* v; x- F8 \( R  h* N      sprintf(szTmp,"Failed to register socket event!,error no:%d",::WSAGetLastError());# X3 P2 {3 S) L; g" Q# ?6 h% R( b
      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);
: j9 ~& k" c# E* ?) v; a      closesocket(m_Socket);; s) b9 S1 E$ N" k6 O7 n5 K+ z( {
      ::WSACleanup();0 Y% ^1 R; `/ _# i( q
      return;}
/ b) ?' M! l& S4 B}
$ f0 b+ `: u3 w9 cvoid __fastcall TLANForm::FormDestroy(TObject *Sender)% W* i3 u7 T3 U; p% C. k
{( E8 @, ?; ]9 F% I
   closesocket(m_Socket);. k& {+ o$ l& v- W
   ::WSACleanup();( X* l$ T+ u5 g; g
}
( I" i( X! ^5 U8 g: i; ~, d4 m: }& b; s: `2 V
Socket api Server:; K+ _; T( p0 `9 M# D& a# L* e9 a
.h File
2 ]; }' A6 ~5 `' T" V#ifndef UDPServerH4 }/ d: r7 h8 T$ n! I2 u
#define UDPServerH9 r9 Z( I) O, M8 A) C. M
#include <Classes.hpp>
( s" v2 t7 c) `7 Q' x#include <Controls.hpp>
" `# }$ t- R" W#include <StdCtrls.hpp>. j( A6 m# Y8 x+ C# r
#include <Forms.hpp>3 f& m  @( X3 T2 e9 [" j
#include <stdio.h>
, b% o$ `: ~" p+ L: ^' o#include "WinSock.h"2 N' \& d. T9 ~2 x# i
/*#define WM_SOCKET WM_USER+1000
( ]3 F( p- y3 k6 C! F' `" H' e#define INITSOCKETSUCCESS 0
% G1 q  C% Q" c( N5 v#define INITSOCKETFAILURE 1+ O, `9 a- R9 c. P  i) n
#define CREATELISTENSOCKETSUCCESS 2
; V- @0 p8 w4 F9 j#define CREATELISTENSOCKETFAILURE 3
2 q( h5 ~/ m* T- e* a8 S0 {4 w- p#define SETLISTENSOCKETSUCCESS 4
. o# u3 L: ~% R#define SETLISTENSOCKETFAILURE 5
3 h4 i4 q4 B! b# k- u#define BINDLISTENSOCKETSUCCESS 6; z$ X, E9 g% |, }7 Q
#define BINDLISTENSOCKETFAILURE 7: W2 z* R' q% f0 f0 U) |
#define LISTENSOCKETSUCCESS 8- ?! y: x" ^2 J* T6 U
#define LISTENSOCKETFAILURE 9" Y* @- c7 a5 f9 R
#define ACCEPTSOCKETSUCCESS 10
0 d" a6 a; c' v3 T" v0 I1 t. ~" d#define ACCEPTSOCKETFAILURE 11
! z' [% R# C. o  S* ^*/' c* d& T% N" R: [
class TPSTNForm : public TForm
6 U6 v! B% O7 F' m0 ?3 U$ K3 w{
# g7 N7 N8 o7 ]3 q* l; [__published: // IDE-managed Components8 V0 U- w) F4 L0 f6 |! ^. V  @
   TEdit *Port;4 S$ Z- ]) k5 ]- T
   TLabel *Label1;
6 k1 u8 r; Q9 |   TMemo *Memo1;- ]" U* U- t8 [. W7 g
   TButton *Button1;" m. i5 u5 L' ^
   TButton *Button2;
" a2 b9 g0 O* S) B/ m   TLabel *Label2;$ C) f( I  j/ U0 ^
   TComboBox *Prot;
+ T  U5 Z0 z  @) z   void __fastcall Button1Click(TObject *Sender);
: R# j- X7 g9 t  `- S9 u$ B   void __fastcall Button2Click(TObject *Sender);# i1 E8 Q2 q- G$ n  a
   void __fastcall FormCreate(TObject *Sender);' R" T* j' [' ]
   void __fastcall FormDestroy(TObject *Sender);7 c8 _7 S5 R1 J# V$ G
private: // User declarations
, J9 _* c5 v8 k/ a5 T! Ppublic:  // User declarations5 ]! {. w( p  {/ |* T' P9 c
   __fastcall TPSTNForm(TComponent* Owner);1 s$ `& B$ J& `& z; y/ j4 {
};
5 ~' ^# U% |) g# }# p% cenum PROTO {TCP,UDP};  o7 t: U4 w4 o$ Q! i
class TCommunication:public TThread    //Communication Thread, k) k  r0 W; d' M8 ~: n4 P7 P3 B  S
{
, s8 K; X! k' R) N% a$ B; o8 r) Sprivate:
& o" ]' y  ^# c) F   SOCKET m_AcceptSocket;
4 q* P5 k( x' t" t   char szTmp[256];//ERROR MESSAGE
/ p4 A; M) o5 f* m  g2 M( y. upublic:! s, C4 x! y( h; f& a. v4 |' n0 T
   __fastcall TCommunication(SOCKET m_Socket,bool CreateSuspended);3 l/ `7 b& q) ]
   __fastcall ~TCommunication();
( m6 y% V. n! Fprotected:
8 E% {1 X# \1 J1 ?   virtual void __fastcall Execute();
# h% Y$ N% L( [4 u1 Q" t};; O* {1 u9 m% k' z
class TListenThread:public TThread //Listen Thread
/ X; ~, h, U- E% r8 u6 ]" V{
( @; q5 Q) Q3 Y5 R" I2 pprivate:- q4 z5 o3 Q; N: Z: I( U
   WSAData wsaData;
7 ]3 W  b* ^4 ~/ t& B   struct sockaddr_in server;
" }! C- M0 w# ^   fd_set FDS;
5 m+ Q: y% Z! G8 W1 a7 R, |   UINT m_Port;
' X. Y/ B7 |3 _* f  ?   PROTO m_Protocol;8 i$ h  j* H* V0 R3 ~
   char szTmp[256];//Error Message' e$ L( _% K  U+ z0 v
public:
4 I, a2 f7 g" A& V4 n1 B, h2 ~   SOCKET m_Socket;8 N& y: F* }8 w/ ?0 F
   void __fastcall DoError();4 U& r, A. v) n+ }  B
   void __fastcall InitSocket();
7 u, b+ o; I4 M: _   void __fastcall CreateListenSocket();0 j2 U; R7 m$ i$ l) l: ?: ], @
   void __fastcall SetListenSocket();* m$ S5 U7 t: ~6 Y  t% _" T/ h$ D
   void __fastcall BindListenSocket();
' w( z& d0 K4 [8 k   void __fastcall ListenSocket();
% h0 Y) A) b: K! g9 d! Q) j; |  o' t. w; Q5 `
public:' g/ ]/ ~9 q1 u1 j2 ^
   __fastcall TListenThread(PROTO m_ProtocolA,UINT m_PortA,bool CreateSuspended);4 Y, l7 j* R4 d$ _
   virtual __fastcall ~TListenThread();8 m3 p' Z. f( i
protected:2 T- C4 J* N! O
   virtual void __fastcall Execute();' K7 T* t# b' c* w
};) F* s2 K# x2 @2 M( l; _# G
extern PACKAGE TPSTNForm *PSTNForm;8 S: [6 I9 l, i" S3 y) P- P6 s3 F3 j
#endif  E2 @7 {) V0 d* q
.cpp File2 A( Y- ^$ F# X1 A4 H
#include <vcl.h>
6 I9 `1 M3 G; e2 @2 @#pragma hdrstop& r& C9 w, E3 L0 H+ t+ i
#include "UDPServer.h"
2 m' t/ n5 B+ a9 x#pragma package(smart_init)0 h! O% y% S; K# [
#pragma resource "*.dfm"' F3 Y2 J1 Q1 W5 V3 S
TPSTNForm *PSTNForm;% B" a. h' e6 j" }/ Y' X
TListenThread *pThread=0;
7 t0 v5 R/ v+ r6 s  o: ~//******************************CLASS TCommunication For TCP****************************************************
+ j. W- y9 \1 }6 h, E- t__fastcall TCommunication::TCommunication(SOCKET m_Socket,bool CreateSuspended):TThread(FALSE)4 q: L1 G" O5 w5 ~: \. z# f& [
{+ k& i6 M( Y0 u4 u/ Z0 V# a( P
   m_AcceptSocket=m_Socket;
4 l- b0 E$ `, n0 [% c1 J$ z% N) h   szTmp[0]='\0';' {9 F0 [% u" e4 t9 m/ u/ w' b
   FreeOnTerminate=true;/ D5 |0 }: I# M+ d; Y% F3 Z& I8 s  Z
}- f$ g) r3 m) y1 V$ Z8 Z! i
__fastcall TCommunication::~TCommunication()
9 @+ t& u  H, j/ Z* |% ^{1 w% g6 n% D3 `) [1 n2 p
  // closesocket(m_AcceptSocket);8 g8 c1 B* ?/ C9 D
}! p3 c# J6 |7 {! |9 R0 g; \; w
void __fastcall TCommunication::Execute()7 d2 g! {/ ]: D# U) A7 L
{
8 i, Y; i& ~5 B, R# }   char buf[4096];! i! l5 {6 p# k4 a- f+ d. n
   int nSize=0;
- V# ]% u9 [3 e& K% [0 N$ a   nSize=recv(m_AcceptSocket,(char FAR*)buf,4096,0);& b* Q4 b- {$ @  S  b" P5 L$ e. M9 U
   if(nSize>0)
! l5 s' p& O6 @' U3 z* b  p' H( f- z% z   {( d; ]; ~% `- Y: r* i6 X7 B7 B
      buf[nSize]='\0';
; l, I3 S$ i7 O* n& v+ w      //Display5 z9 e  ?  C1 |  L% F
      PSTNForm->Memo1->Lines->Add("Received Length:"+String(nSize));9 a+ }/ u8 C1 A0 {5 O/ i
      PSTNForm->Memo1->Lines->Add("Received:"+StrPas(buf));4 E' q( A) w8 T$ t% |7 O
      //Deliver- V8 z: x' @6 ~: |$ H
      ::Sleep(100);
. ]2 T. l9 j, a1 z- l      send(m_AcceptSocket,buf,nSize,0);
5 k/ X+ D. d* V3 e" H   }! s% W5 I$ T0 U" z

  w6 F8 k. e% ]5 q8 d* [/ i}
  u  l7 f0 l  e, g//******************************CLASS TListenThread*****************************************************& Q) B: ]. q9 P; n4 W
__fastcall TListenThread::TListenThread(PROTO m_ProtocolA,UINT m_PortA,bool CreateSuspended):TThread(FALSE)
' B$ C( y; R" ~7 q0 p# P* I# j1 U" G{6 {: H* Y; k: J6 h: }9 M& ]$ {% R
   m_Socket=INVALID_SOCKET;
8 N5 Z5 W2 H3 F# t: R" T8 @0 J. w   m_Port=m_PortA;
5 K; B2 ]6 }8 F) f5 K   m_Protocol=m_ProtocolA;
4 {7 K- ?6 h. D   szTmp[0]='\0';
* c, ]& l: M% N2 ^4 v1 h   ::ZeroMemory(&wsaData,sizeof(WSAData));6 W4 |/ |% r1 C8 D
   ::ZeroMemory(&server,sizeof(struct sockaddr_in));, j/ [$ `* ?; m5 F
   FreeOnTerminate=TRUE;//Automatically delete while terminating.
0 @' j6 U/ u. Q2 t0 i}2 ^2 q0 v& r; N4 T/ Z  S3 `
__fastcall TListenThread::~TListenThread()- m9 i& m# z) j0 y: J$ V
{
! z- X) M8 Y5 d+ |   closesocket(m_Socket);
$ R! g9 d2 C* Y1 b8 o' w. x   ::WSACleanup();
! Z6 k% f2 u4 H   m_Socket=INVALID_SOCKET;
5 K4 K8 r9 ]- Z   m_Port=0;% Y9 l8 o( l* u0 f4 _: J! e
   m_Protocol=TCP;# N$ ]$ e; R- j$ \) u) Z' s' _+ C
   szTmp[0]='\0';
8 C7 y( Q( t* W* z# S& E6 B   ::ZeroMemory(&wsaData,sizeof(WSAData));3 u2 M7 k( t) L! ^! M
   ::ZeroMemory(&server,sizeof(struct sockaddr_in));
2 \' C( ?7 f& p" d5 X+ S}' `4 ^' w; m! V
void __fastcall TListenThread:oError()7 m7 P2 V& k! |% A. |# Z
{
- C6 N% \  r2 p, Z8 B) T1 F   if(m_Socket!=INVALID_SOCKET) closesocket(m_Socket);9 e" I/ f0 M% x% A9 \
   WSACleanup();
- m3 a4 w% J6 \9 V2 L   return;
  e  S0 w# K& |+ q- o}5 o9 F2 B/ `6 j- g/ a
void __fastcall TListenThread::InitSocket()$ s2 m8 _* @6 f$ y! L8 T
{
; c. |- L; Z0 L   WORD version=MAKEWORD(2,0);
5 c( L/ B; q) W5 i4 R$ I$ N   if(::WSAStartup(version,&wsaData)){, I8 ^$ a- f# R; V0 Q
      sprintf(szTmp,"Failed to intiailize socket,error no:%d",::WSAGetLastError());
  I3 V  L8 M" t- ]- s% B  `3 y      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);
% Y6 D# _( J; O& a      DoError();9 |  d$ ~/ t- O; b( A/ M) B2 q, s9 X
      return;
$ G, L5 ]& X. m   }( W$ `. M" w5 t/ P' K- Z
}
* e/ K( o& }* c/ T; K9 M' }void __fastcall TListenThread::CreateListenSocket()8 v. ~2 L; i4 g
{
# g" Y4 M  l1 F. j- }   switch(m_Protocol)
  g' y1 [% W* b5 m: @   {
9 S# ~- j0 r9 s2 v; ?      case UDP:
6 X2 ?, N9 C5 \6 _         m_Socket=socket(AF_INET,SOCK_DGRAM,0);
" J* ~" \4 f1 V3 D8 T         break;6 x4 N5 r( [& G6 E& F
      case TCP:8 A' C- R3 |. T9 i- h- A# w
         m_Socket=socket(AF_INET,SOCK_STREAM,0);
% o: H5 Z$ j& I& y# X! s7 w/ `) [         break;
( D8 T" E0 P) ]% k# D5 {; K      default:0 E% l6 k$ ^0 j+ H5 N
         sprintf(szTmp,"Error protocol!");
9 k  ?6 V1 v$ Z" e# L3 q         ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);
1 q+ u6 x2 G! C         DoError();
' |2 r% n- f6 [% @2 [8 F         break;6 N1 x% y1 Y* I
   }
: T9 D/ L0 o7 v% Q7 B6 m/ J8 X   if(m_Socket==INVALID_SOCKET){
( i1 s" H: @* J/ h- c# ~- q0 @      sprintf(szTmp,"Failed to create socket!");( S- Q# p) y( n' c& O
      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);
& V  A4 _6 L+ f. n+ V3 }      DoError();" n3 F. @& i8 F$ h4 I6 e
      return;. k3 S! ?4 x3 l
   }, T, P& |: L( c6 Z7 `
}% Y: O/ ^+ w7 }) e  G9 p+ M
void __fastcall TListenThread::SetListenSocket()1 e3 B$ p% X- }
{( P( Y+ O3 H, ]/ C- W2 X4 ]; x( c
   server.sin_family=AF_INET;+ T  U2 t8 m0 v  w" C
   server.sin_port=htons(m_Port);
8 {8 B" ^* J: `, G7 ^. ~  i8 a4 ?+ f   server.sin_addr.S_un.S_addr=INADDR_ANY;  s" H+ g/ k  O. `1 V( o
   int NewOpenType=SO_SYNCHRONOUS_NONALERT;
/ k0 J& Y- u$ M# A. Z5 j   if(setsockopt(INVALID_SOCKET,SOL_SOCKET,SO_OPENTYPE,(char*)&NewOpenType,4)){, `' x! j  P$ E  S: X
      sprintf(szTmp,"Set socket option error,error no:%d",::WSAGetLastError());
9 p+ X( C- v" m& X) }# J) L' e' Q      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);" f9 x" M5 q& Z' ^$ f
      DoError();
5 \5 x" \* h* x( m      return;
* E1 Q7 U& r; J; R4 X5 d   }
) }' E  C7 B8 N5 Z2 b5 C+ G}2 J3 e  j9 i( b2 F) M0 Y) c6 u
void __fastcall TListenThread::BindListenSocket()
+ O0 n* p! i, Y  z8 g{
7 V  W. A# G" K2 k    if(bind(m_Socket,(sockaddr*)&server,sizeof(struct sockaddr_in))){! L) V! l; `5 \& Q
      sprintf(szTmp,"Failed to bind socket,error no:%d",::WSAGetLastError());
" A0 L" p" f) M* e& k; T      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);
) j- m3 F5 C$ M      DoError();7 U/ u, V8 f9 _# M$ D6 v
      return;
# E3 _1 K2 a2 m3 c$ ^& ?% a* v) r2 B   }  J, |7 ^# }: M2 X
# f0 e" `6 f/ g: {( h
}
: g, |) k$ x/ K- N# Bvoid __fastcall TListenThread:istenSocket()
& _6 f# |- K; {* N& G1 j& a& {0 f5 x{
, t7 o' y" Z8 e% \% I* Z3 F  if(listen(m_Socket,SOMAXCONN)){( |! G' e. d8 J6 C' z
     sprintf(szTmp,"listen error,error no:%d",::WSAGetLastError());. x- l  O. q& ^* _7 Z+ @% T
     ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);
6 `5 h0 f3 k: v4 K% j- ?3 A' o     DoError();. X! i$ a- m4 d) M: x$ H
     return;
) B4 ~6 f( c! Q3 D0 d  a  }+ W. C, T/ @1 \# k: H
  //Determine whether there is any connection5 Y+ E- M/ m; M! S% I0 H
  FD_ZERO(&FDS);: e9 N, B  i/ K' [* l* {
  FD_SET(m_Socket,&FDS);
- T- D* n5 I# r# o  W4 r- _5 C}
# E: J6 s/ Q) zvoid __fastcall TListenThread::Execute()
4 w) Z. k5 F8 e7 ?{
5 _& W* F) q( G) Q' _7 B3 X   char buf[4096];- _  B9 B5 O) j6 @; U, {1 [1 Z
   struct sockaddr_in from; //for UDP! \* \7 R4 J1 l4 Y: s, X
   int nLen=sizeof(from),nSize=0;  //for UDP" C6 \9 a8 t3 J; N4 H
   InitSocket();; L; U7 q& e+ I% z0 }* L
   CreateListenSocket();
: M+ f/ a4 h$ [- Z# Y8 K   SetListenSocket();! r( Q  F3 `, ~2 x$ z) Y
   BindListenSocket();0 S% i" B( T3 t6 W$ l
   if(m_Protocol==UDP){
/ c: u3 S# x3 {  o3 T" x, U& |      while(!Terminated){
' O  l0 k( x7 Z* ]& w- I         int nSize=recvfrom(m_Socket,buf,4096,0,(struct sockaddr*)&from,&nLen);
+ s3 J6 p( p8 X/ L         if(nSize>0){. K9 Q* D4 l+ w3 R: T
            buf[nSize]='\0';
4 G- D! s  D4 L. o0 x. U- N. _            PSTNForm->Memo1->Lines->Add("Received Length:"+String(nSize));
+ m  J8 u/ Q; F1 ^; T; Z) a; Y* W            PSTNForm->Memo1->Lines->Add("Received:"+StrPas(buf));, ]5 t/ q) W5 v6 p
            ::Sleep(100);
, i; b$ [# e: M7 i            sendto(m_Socket,buf,nSize,0,(struct sockaddr*)&from,sizeof(struct sockaddr_in));
1 V5 ?4 I6 ?& t* o6 E* m) D2 A         }
* [/ L& A& q+ k8 p) b         else return;& i2 ]0 [4 i: O9 e; H+ A' D

: ?, T# A  ^7 e, X9 L$ F0 S      }
( p  [) ~0 y5 a8 m* u7 n& X   }
/ N9 G8 u; |" ]) c( W/ ?6 E   ListenSocket();* G- c5 A3 V! J. r
   struct sockaddr_in client;
6 g- j, Q4 n1 @2 [) Q# v   int nLength=sizeof(struct sockaddr_in);$ e1 h' K2 {7 |" h' W9 j
   while(!Terminated){) s* X5 A# {, |( c
      int nError=select(1,&FDS,0,0,0);
' u% Y" V/ E. p* V  l/ p      if(nError<=0) Terminate();
* h& D: B/ R& x8 |% L( b! c5 i2 i$ p      SOCKET m_AcceptSocket=accept(m_Socket,(struct sockaddr*)&client,&nLength);! T$ M  E& B5 E$ [0 ]' D+ ^& s
      if(m_AcceptSocket==INVALID_SOCKET){
: [' G  N( `  V3 ]: D& o0 H         sprintf(szTmp,"Failed to execute accept,error no:%d",::WSAGetLastError());, I2 O6 i2 f8 O+ m8 d6 l8 f# \
         ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);
  ]! E% f: D  d2 z' n& r: Y         DoError();" C  x/ j; ?. D$ E; Y
         Terminate();+ d5 `: b1 M7 G7 ]
         return;
* t4 w  ?6 w. u      }. s1 q: a* C! W, ?* n9 U
      TCommunication *pCThread=new TCommunication(m_AcceptSocket,FALSE);1 p& q' ]! G$ v" K" k$ H
      pCThread->Terminate();0 L' ^" G3 B5 p
      pCThread->WaitFor();7 |, c; r& \% b4 l
   }
7 r- _2 T/ X1 K* n: {9 l}
: Z6 b  K( j" I) s2 J/ d//************************PSTNForm*********************************************//
& V* ?3 C& w4 R& K__fastcall TPSTNForm::TPSTNForm(TComponent* Owner)
" {" P, Z4 O9 [8 P5 D; j* D) I, O* `   : TForm(Owner)
, H+ E6 r" @# O: f7 W6 X/ B{- N, H& A, R- ~: U: |
}
. S  u' b# c: S5 P0 s* O+ Gvoid __fastcall TPSTNForm::Button1Click(TObject *Sender)) U& C. z0 W% _# r& {
{6 ^6 l% A9 X, s5 F( p* T$ }: Z3 s6 }
   Close();
7 O+ p2 t4 {! N/ O7 i) j) B# V& c}
& B5 S- ~4 G4 ?0 m, k2 ~void __fastcall TPSTNForm::Button2Click(TObject *Sender)
7 S$ B8 R# L$ p6 J" A{
7 L) |6 [, x2 [5 c5 R: \, ]" @2 o   if(pThread){
8 D  }7 P6 X, O% ~# D      pThread->Suspend();! C+ u' Z& d3 E
      pThread->Terminate();; p! w8 d/ o5 D" i5 Z6 C
      delete pThread;
  u7 {% ^  u4 G; y      pThread=0;8 h* }% t8 ]# N$ a$ V$ j' v
   }1 ~" Z% [( Z0 S- Q/ j  k% a
   UINT m_Port;/ x  H& K  z6 A
   try
" o& L( r2 a. F" j' C: h   {
' F. z$ F+ n8 S  l4 l$ j2 q      m_Port=Port->Text.ToInt();
* @- P9 }( V& K/ [( `1 N6 o+ d9 y$ z   }. f7 |& a: G7 Q1 h( `
   catch(Exception &e)% _( n- f+ _4 T8 l5 S
   {- s0 N' g0 g% G) y' J, L& [
      ::MessageBox(0,e.Message.c_str(),"Error",MB_OK+MB_ICONERROR);' H  n- ]9 v* O9 `/ s0 Z
      return;
% }" ?" b; G1 a  O0 R' [   }
( Q# H% E" P4 i( k8 t. e4 o( O   PROTO m_Protocol;
5 q" f; E) h4 H% B: W   switch(Prot->ItemIndex)
/ X7 t' a; B7 B( Q$ Y* g# c5 T& I! c   {
4 B( e0 G; ?% [* Y; g4 g% B5 N, ?      case 0:, B& b: k% \7 K, c; E
         m_Protocol=TCP;/ O; Q1 c; ^- I& M8 Z! d# K
         break;1 D/ H1 G8 z& w3 G
      case 1:/ S3 q1 |# j  J8 V2 d
         m_Protocol=UDP;& |6 C+ @4 {, M, l8 \0 o
         break;
3 E4 x; {% n8 B: K( P      default:& S# ^6 s$ O' R0 L, \1 o& e
         break;3 ^1 A7 ^. q- u
   }8 V1 O3 o( j: d, X
   pThread=new TListenThread(m_Protocol,m_Port,FALSE);- N  x( F- G' Q# F! c6 P
   //pThread->Terminate();8 I3 Z& V: l8 R, ?5 O+ q
}( G3 T9 x! P" ]
void __fastcall TPSTNForm::FormCreate(TObject *Sender)
5 N$ s; F3 L: O" u8 n0 J2 v{
0 ?! d+ P9 K% `   ::SendMessage(Prot->Handle,CB_SETCURSEL,0,1);
1 k- M6 ^' n9 w  d2 }}
1 H5 ~. e: C- j, C$ I% p
: ?4 E2 N9 r2 v) x, }void __fastcall TPSTNForm::FormDestroy(TObject *Sender)
8 I! U: d/ t) q+ A$ o0 \{
+ V2 y4 f+ [% i! R% k+ J   if(pThread){; s) T; p  J% h# @& f$ z5 l
      pThread->Suspend();
$ ?, W/ `; w: W% T& }      pThread->Terminate();}
" V. l; K& ?# F! S) y3 j: y}( m7 c  ]. |  y
上面的代码,各位可根据自已的需要和针对自已的应用,在数据处理方面加以改进就可以了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-6-19 14:35 , Processed in 0.016990 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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