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

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

[复制链接]
发表于 2004-2-15 14:01:13 | 显示全部楼层 |阅读模式
在CB中用socket api来写网络通讯程序( y" X7 m. ]) O4 ^
作者: kingcaiyao ,如转载请保证本文档的完整性,并注明出处。" T+ H) e; `* j" H* i) I) Q
欢迎光临 C++ Builder 研究,http://www.ccrun.com/doc/go.asp?id=569  ^+ z5 L. H: X0 [: q1 Z
本文转自csdn,作者:kingcaiyao
* e0 ?( k5 Z5 @. x原标题:在C++ Builder中用socket api来写网络通讯程序(同时支持TCP和UDP协议)
& I0 m% P, t1 J8 i3 Z& v5 u) }原文:  http://www.csdn.net/develop/read_article.asp?id=19883- k! [5 K$ L0 h6 v4 ~8 R; M# W

; J' c! p. }# z+ u. h9 V* H* B* z1 t5 ?+ _& C& ~4 g
在7月4日看完sockcomp.pas后,我决定用socket api来写一个客户端和服务器并且同时支持TCP,UDP协议,于是我就去做,现将代码贴出来(已调试通过)
4 j+ j; O/ _1 A4 {: j4 f, m) Z- gSocket api Client:, z$ g8 z, }( w. `
/ K% V7 W7 c8 c) {( ^7 k+ \
#ifndef UDPClientH
( a1 [' c7 e) c& D+ l8 T9 T0 o0 P% G#define UDPClientH' z6 ~, x; W" N9 V# |) c5 J% E
#include <Classes.hpp>: d: D: r3 |7 [# q0 `5 p) O* e
#include <Controls.hpp>, X: _; |' D  v+ I1 w* O
#include <StdCtrls.hpp>
; J8 K1 x' _/ e! k. D; B& n  ]+ Z#include <Forms.hpp>: F* E5 i! h- R$ M: T0 C4 E
#include <stdio.h>
# q/ C7 ?+ T$ h! n, H#include "CCEdit.h"
' b. u- L, I" m& m: H" U#define WM_SOCK WM_USER+100
' x7 F% S  l- `, t9 w2 bclass TLANForm : public TForm
6 X0 i$ J; E) A4 R* |. H{+ F6 V  {6 s( S
__published: // IDE-managed Components
& J. ]: E8 @# p7 Y   TEdit *Port;
& C4 G# E$ K- y8 i! K   TLabel *Label1;
0 D9 _( T& p8 e$ A7 k2 V   TLabel *Label2;
. R) f+ [; L& o- e2 Q' D; V; S   TComboBox *Prot;
4 P( i1 W+ f$ ]* _   TButton *Button1;: p. q; p* N/ x9 H2 G0 {
   TLabel *Label3;! E4 @' B, O6 j- Y, j
   TEdit *Addr;0 b( }; r0 h7 O3 ^+ X4 V& j0 X# Q
   TCCEdit *TxtEdit;
: }8 ~# Q. q! S; {" J   void __fastcall FormCreate(TObject *Sender);% G6 E! g- U/ f  g8 S$ \1 c
   void __fastcall Button1Click(TObject *Sender);. z$ Y, ~, X2 Q1 u
   void __fastcall FormDestroy(TObject *Sender);  Q9 ^8 {* Y8 I7 f
private: // User declarations
2 z" q# ~% n- _- N   void __fastcall OnRecv(TMessage &Message);1 S4 N: X" R2 w" w4 k( }1 w
public:  // User declarations8 G8 Y$ \$ k* j+ n
   __fastcall TLANForm(TComponent* Owner);4 @4 z& h" E% k: `
   BEGIN_MESSAGE_MAP4 v* U- p* t+ U# }( t" M2 t0 T
      VCL_MESSAGE_HANDLER(WM_SOCK,TMessage,OnRecv);! E3 a+ X/ O% u8 W' f- J% V
   END_MESSAGE_MAP(TForm);
: f0 ~2 `5 u$ H  S9 U};1 l+ J  w* p# `% h
extern PACKAGE TLANForm *LANForm;
/ |1 y1 s( |# P& @#endif
. Y# \( r, K  ]/ V. ^* E% @9 v9 B( k/ U1 ^# _2 {: I! ]
0 J0 y2 v  n! K; _1 l0 }: f; a. F, H
.cpp File1 l- }# @/ x1 `* H* {- T
# t" I4 b  P. X9 [2 f; C" `
#include <vcl.h>
' ]9 W+ Z2 m/ }) \% J# L( P8 d  y#pragma hdrstop
7 ^4 R" r' d( x, d#include "UDPClient.h"
. d7 w& i8 @1 }% \1 Z" R2 {* Y#include "WinSock.h"$ s% e8 i# D% L* H8 y
#pragma package(smart_init)# c$ H$ l& O/ E$ ~" T) d) l- n: J
#pragma link "CCEdit"
7 D% v8 l! B# G$ j4 `#pragma resource "*.dfm"( [5 ~9 H- f/ t4 i* @
TLANForm *LANForm;
$ D& R% w- @% w0 uenum PROTO {TCP=0,UDP=1};
7 z1 S. o, w% ?. bSOCKET m_Socket=INVALID_SOCKET;9 W1 }% y* R+ b3 T
PROTO m_Protocol=TCP;
8 h6 m* H' g: D7 y2 I0 C( O__fastcall TLANForm::TLANForm(TComponent* Owner)
  w6 V, n" ?6 B: {& V1 [+ K( a   : TForm(Owner)
0 x* R1 b9 J9 \3 N* w  `; H{
+ @$ U6 T% M) l( U
9 {/ I9 y5 W& X) P4 P}
8 p* b% x+ |4 E) Q- w3 f& e$ ~void __fastcall TLANForm::FormCreate(TObject *Sender)
9 ]7 |! Y# m2 `7 T' o{. S0 M% Y* Q7 ^1 u/ ?, y
   ::SendMessage(Prot->Handle,CB_SETCURSEL,0,0);
  A% G# d. P* E$ o! X$ H}& ?; m7 C: h) `) {" ~& X4 n7 G
void __fastcall TLANForm::OnRecv(TMessage &Message)5 R1 e0 B2 B- q0 t. X4 w# ?: L: L
{6 X" H4 w/ A/ g# `2 O
   char buf[4096];5 j" E! E" g/ m9 `* I  w' M
   int nLen;3 @+ H  c0 v/ B2 W- g
   struct sockaddr_in from;+ F; ?; A* L& ?" F% t0 U# d5 @0 P8 X" @
   int nLength=sizeof(struct sockaddr_in);/ z, }2 w6 B7 e6 Y8 _2 O8 e
   switch(WSAGETSELECTEVENT(Message.LParam))
4 ^; {. o+ k5 Y8 G- o/ q   {
2 P( u0 `  W9 x; K) x      case FD_READ:- `8 g. A% B" N7 G
         switch(m_Protocol)7 q8 v4 c( B) ^# x9 q
         {
% S/ v9 y2 l& B            case TCP:
) b$ ?: l' ^1 q- K$ j4 b3 c               nLen=recv(m_Socket,buf,4096,0);5 z# I9 ~& L7 G4 p$ z( L3 [9 T( B
               if(nLen>0){8 h8 H0 n) _. q  K) o
                  buf[nLen]='\0';' ~0 ~' `) Q2 \' G7 N- L
                  TxtEdit->Text="Received Length:"+String(nLen)+"\r\n"+StrPas(buf);
  b  ?: n, d4 [4 q' z6 [9 o' ]               }
& g" A' B9 ]% N! G3 k$ T6 I  A& e               break;
& E4 P6 U5 o2 x: d. P* U6 t1 [            case UDP:' j. u5 d9 J9 ~- V/ `8 T. P9 F
               nLen=recvfrom(m_Socket,buf,4096,0,(struct sockaddr*)&from,&nLength);8 D2 v/ B8 e: G
               if(nLen>0){
! I$ s8 X$ o# p                  buf[nLen]='\0';. N  I8 [$ L9 B: L
                  TxtEdit->Text="Received Length:"+String(nLen)+"\r\n"+StrPas(buf);; _8 |) s$ [! @: U+ H! \$ G& O
               }
3 n: \1 g% Q. m+ {               break;  J4 _, k: U6 t2 \
         }- r3 {4 _& |5 W' K8 I+ S0 L0 @
         break;+ x9 j/ |- @3 z* D4 J* [7 ]
      case FD_CLOSE:3 s  l) b: s/ \+ T  m! ?* {. f
         closesocket(m_Socket);
4 X/ @2 g& s. `% I3 c9 o- e% P         break;# D# c0 l6 M% }; Q
   }$ a3 X6 G2 p/ V' N  d, V
}
# h7 N9 |4 y% g* R  }2 P% ], |+ R! G
) B& S. g$ H9 Uvoid __fastcall TLANForm::Button1Click(TObject *Sender)
: z6 p. q7 ]- s4 T  z  k{" h- Y# `3 y2 z5 P5 F0 [
   char szTmp[256],buf[4096];# n5 Y1 [7 Q! e0 v  t& B5 o
   int nSize=0;
9 f# I. [5 E4 l. t   UINT m_Port;- W& B( |  @4 V4 }. D2 K
   AnsiString addr;
5 y3 b" g% K  X9 x$ _   addr=Addr->Text.Trim();
3 f7 |7 B6 J' \6 L& e   if(addr.IsEmpty()){
. m# z9 d$ P/ b  `      ::MessageBox(0,"lease enter the server IP!","Error",MB_OK+MB_ICONERROR);' y  @( F: y# W! \0 l$ e8 D
      return;, _. E3 |1 e3 w
   }% v8 S  P" e. W4 z3 I
   unsigned long nAddr=inet_addr(addr.c_str());$ [; I" `- ?/ h( q3 G
   if(nAddr==INADDR_NONE){1 i) h# X  G. `' h8 k* n
      ::MessageBox(0,"Bad Internet IP!","Error",MB_OK+MB_ICONERROR);
* G, Q  R( [; ~5 A" \) u7 d      return;}3 s9 L( T% u1 u, W2 ?/ v
8 @/ O2 R+ J7 w: r# L8 w: o# |
   try5 Y% k  Z: [; r, n
   {
4 Y( |: u5 S5 x6 V2 G9 t      m_Port=Port->Text.ToInt();" n6 j" f- b2 N
   }* o* `% k; j2 a0 o' c( c$ }
   catch(Exception &e)
) H; t/ Y1 P5 Z2 u  q+ `   {
# {- U8 T% e1 e! T9 d      ::MessageBox(0,e.Message.c_str(),"Error",MB_OK+MB_ICONERROR);/ g% s. y1 d: t# a
      return;
! M( K- z; ~$ m/ T: B9 ]3 Q! r4 c' P   }
1 z6 f, s8 w. U  U2 `" C   switch(Prot->ItemIndex), q4 t) u4 e3 `% q$ X7 @
   {
4 e. Q9 L' n- [( E      case 0:
* d$ R. x8 f8 [' m4 Q6 E/ [2 V: z8 s         m_Protocol=TCP;; p# K& W7 h+ j% h
         break;
) Q/ C' w7 {/ b/ V5 y9 t      case 1:+ a2 x5 v8 [) |# Y3 W  V+ i6 D
         m_Protocol=UDP;
8 ~, u% h5 x9 E% }* l- {. Y         break;7 P; Q* w1 I9 T1 C2 i7 z, O
   }3 g; h% h9 C2 Q  I6 ]* b! f! q
   if(TxtEdit->Text.IsEmpty()){
" P( T' z0 @% b% H* U% L      ::MessageBox(0,"lease enter the text you want to send!","Error",MB_OK+MB_ICONERROR);1 ?. a" `- r: ]( d/ Y
      return;}
7 d9 S2 B3 s* _$ c( p4 f1 ?; O  n; x$ K7 ~; _8 ?7 K
   //Initialize Winsocket
9 c6 ~1 \# t! s   WSAData wsaData;- {& k* l9 Q4 ~9 x2 @; u3 o/ [
   ::ZeroMemory(&wsaData,sizeof(WSAData));1 K* _, w7 c5 ^+ |" _9 G) ?
   WORD version=MAKEWORD(2,0);
9 e% ~, p9 [( G+ n: q0 L   if(::WSAStartup(version,&wsaData)){. E; F& ^4 b4 E$ O; c# _
      sprintf(szTmp,"Failed to initial winsock enviroment!,error no:%d",::WSAGetLastError());
% @4 I; w0 Z# s" C# }# `      return;}
6 z: y9 ~; P2 u1 F6 @6 f  O& _0 \! g8 W3 b
   //Obtain the active connection4 F$ l" P) d! S& ?
   char ComputerName[255];7 X$ s6 {, v1 ^5 |0 D) w: t9 B
   gethostname(ComputerName,255);! _' \" i3 p' d2 |
   struct hostent* he=gethostbyname(ComputerName);
( a8 F; c9 X) |' Q; q3 P   if(!he){
  {- [# ?8 Q, m+ j. N      sprintf(szTmp,"Failed to get information to host!","Error",MB_OK+MB_ICONERROR);
3 q1 Y' D/ ^1 E  [' N: D) i      ::WSACleanup();: Z6 e7 Y# G/ R; d9 C+ T, C% R
      return;( d+ l( A( _1 g9 j' s7 `: e5 K3 J
   }
) W0 B3 a! R5 ~) H- }   //create new socket3 u) Y9 k7 m! r# e
   m_Socket=INVALID_SOCKET;3 j  c9 g4 c; w$ ~: X7 g6 O. f; _* O
   switch(m_Protocol)
8 G- H/ C' Q4 i2 s1 v# W& x1 Q   {
) I) q& N+ \+ H' Q. B      case TCP:
) r3 [2 a0 X- `( B6 }         m_Socket=socket(AF_INET,SOCK_STREAM,0);" {. A; J( T& X1 l0 T: I
         break;# M! ~; [. T# {  A/ g
      case UDP:
9 a& B6 |  m2 |. j         m_Socket=socket(AF_INET,SOCK_DGRAM,0);
0 J' N4 r8 g  H. M! e         break;
$ U( s1 Y, G3 |) G7 @  U+ c7 \3 c   }& v6 C( N2 B4 @- A7 x
   if(m_Socket==INVALID_SOCKET){
% f5 J8 ^) |# y# z# S      sprintf(szTmp,"Failed to create a new socket!,error no:%d",::WSAGetLastError());9 p3 e  _; E1 j: y0 _& }
      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);2 V3 m& u4 S- Q) E! H, f
      ::WSACleanup();
6 h2 F: b8 @  Q6 R$ Q4 u; ]0 L      return;3 r6 O2 r1 @' Z& K/ G
   }9 {0 m% I( Q8 c" l3 {2 I
   //bind socket
* n9 `3 O: f0 I& M$ w; B   struct sockaddr_in client;; e8 c% r* d# Z1 A+ l8 n1 ?
   unsigned long nClient;+ O. G* Z4 m+ l) r$ _# q. T
   memcpy(&nClient,he->h_addr_list[0],sizeof(int));  ~& p3 u9 r; H6 ~6 X2 n
   if(nClient==INADDR_NONE){
( A- L' ^: s8 y5 I* x! p0 I      sprintf(szTmp,"Failed to obtain the local machine's IP!","Error",MB_OK+MB_ICONERROR);; L8 s) ?5 P( i' _+ g" G( `  i; R
      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);3 Y7 Q6 a! o: v# c# y6 v
      closesocket(m_Socket);
3 O' u7 H$ P5 I- a  g      ::WSACleanup();9 n4 j) A+ E5 J& Q1 M- Q
      return;% S& r$ L& Z. w0 n+ Q" ^1 D
   }
; c# Z  V, z+ Q   client.sin_family=AF_INET;+ [' [" e! I& [7 u$ V! }
   client.sin_port=0;
! e/ L) F( x  _2 r. K* y2 k4 ~   client.sin_addr.S_un.S_addr=(int)nClient;5 S$ i+ n) Z: ^7 y, _1 K- j/ N
   if(bind(m_Socket,(struct sockaddr*)&client,sizeof(struct sockaddr))){
8 B! [5 ~3 O" d7 B      sprintf(szTmp,"Failed to bind socket!","Error",MB_OK+MB_ICONERROR);
) S6 R; z# ?1 F, R      closesocket(m_Socket);
( M6 x7 R* M9 ^1 Z      ::WSACleanup();1 t3 U8 x- s/ b+ G8 ^. j; z
      return;}7 n5 S  h; t0 m: D+ x7 l" j( c& g
   //connect socket9 k% @" E7 V9 t0 B, D& F5 H
   struct sockaddr_in To;. k9 k) U- L' H+ M' ?1 X
   To.sin_family=AF_INET;
, k/ i* y, h0 `   To.sin_port=htons(m_Port);1 a+ `$ g+ N* o" {9 s  j9 N
   To.sin_addr.S_un.S_addr=(int)nAddr;
; \3 K3 g% C* o3 b. Y; N, L   fd_set FDSET;
& L1 ~5 b1 a- b2 |. t   FD_ZERO(&FDSET);) T; N. z* I( z8 H5 J6 U
   FD_SET(m_Socket,&FDSET);
5 m3 U1 o( w+ d  ^% @7 A6 h4 \; [# Z1 r0 ]1 I; q0 T# S, y; t( n# I9 w
: N8 I$ i, j1 |
   if(m_Protocol==TCP){- Z* `% ]6 o  t8 d9 @9 ~: b2 x
      if(connect(m_Socket,(struct sockaddr*)&To,sizeof(struct sockaddr))){6 E5 i$ E! _1 Z$ @9 r; w
         sprintf(szTmp,"Failed to connect the object!,error no:%d",::WSAGetLastError());) y0 y6 Q, R8 u& g
         ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);' ~) @: Q: \9 G5 A) t, [
         closesocket(m_Socket);
: B# n. M4 H! T3 {3 S, D- F         ::WSACleanup();- c* c6 H2 Y! F) d1 X- V; x$ J
         return;, Y$ a7 g/ ?$ f+ C+ \
      }& D8 L! v0 d$ }. S$ O3 a0 r
      int nError=select(1,0,&FDSET,0,0);8 ~% p( d& X5 U. u% G* Z
      if(nError<=0){/ Q1 |$ P; x9 I' n
      sprintf(szTmp,"Failed to select socket!,error no:%d",::WSAGetLastError());
3 j/ H) s0 t9 C      closesocket(m_Socket);$ c# Y6 `5 o; U6 D' p% }, |: A/ a5 \& e
      ::WSACleanup();$ x# ~( V  s2 K( ~. O6 z
      return;}
# o( ~, B% {+ M# \; `. H0 A! L' d   }5 _: R. G1 ^) F1 f. x
   //Send data* v: U4 {5 z) V/ W9 `( v4 B
   int nLen=TxtEdit->Text.Length();0 f" e0 W9 l. h- K
   if(nLen>4096){: k4 K- N( Q9 h7 a6 p& `3 K: n
      sprintf(szTmp,"The buffer is too size to send,it shoud not be more than 4096 bytes!");
! y8 Q) Q$ M% ?2 X+ ]      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);* m6 P, O; X& A3 h8 p  J
      closesocket(m_Socket);
+ W2 U7 B& i/ I) `6 j      ::WSACleanup();" D5 y* |6 q( n% O
      return;
5 v: B1 _9 o6 f, c   }* \- S, |* e7 \0 ]
   strncpy(buf,TxtEdit->Text.c_str(),nLen);
0 U" Z6 r, A3 i' a6 ~( W   switch(m_Protocol)3 {2 t% J" N% A% f/ V# h- {' G
   {
  P8 }; R0 E6 R      case TCP:
$ P& w% F/ Q( \/ i+ A; O* J+ \         nSize=send(m_Socket,buf,nLen,0);6 }; }# ~3 R) P7 V; |( Q  q
         //ShowMessage(nSize);( D7 j3 Y/ N% s, ]/ E
         break;& C  ?7 ?& M: g1 n& K
      case UDP:4 f. B! K0 y3 }# |# ^1 \6 g
         nSize=sendto(m_Socket,buf,nLen,0,(struct sockaddr*)&To,sizeof(struct sockaddr));
- M% k8 r6 {) R) [7 e         //ShowMessage(nSize);
- a& {# w& E2 V2 ?% X$ c         break;4 h( E+ @9 L# `  H) M; e+ ^
- a" o1 W! v5 G3 S
   }- g: }! k$ Q7 t3 V, ^2 Z6 D
   if(::WSAAsyncSelect(m_Socket,Handle,WM_SOCK,FD_READ|FD_CLOSE)){2 V3 |2 _, f! }$ g* o0 g
      sprintf(szTmp,"Failed to register socket event!,error no:%d",::WSAGetLastError());* z, H0 w( c2 y! Z3 W8 M
      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);' V3 L: L2 m! S7 }- P, x3 C) q
      closesocket(m_Socket);
+ u. ~0 k9 D# Y# F3 {4 P      ::WSACleanup();
, V- ?1 ?1 v- I7 b7 K      return;}
# Z  N# {: C  y( X$ @: J}+ H1 }) W9 N$ h# o
void __fastcall TLANForm::FormDestroy(TObject *Sender)
  T4 R/ j/ {6 f  w{
" b! n& n! W1 M8 `7 {6 ]% x) p   closesocket(m_Socket);+ D$ ^# n* H7 h" k' I
   ::WSACleanup();
* [6 |* @! S/ o/ s" ~}# I- \5 \& K% e  @, t! ^
* [* G8 u7 g& o1 d. B' e
Socket api Server:
, {# P( {. _. N* N5 {" ].h File
' W! t) y2 b, X- w$ k/ M: n1 Y#ifndef UDPServerH
2 Q  q$ e6 y9 f7 c#define UDPServerH
; ?( O4 D+ p! u, ^" b. {- c* }#include <Classes.hpp>
; n9 _4 e7 l0 p" D! {#include <Controls.hpp>
5 Z. X- a4 e+ g0 o0 P+ V#include <StdCtrls.hpp>
) O- d6 X% a) E* N: c; |. m3 ]#include <Forms.hpp>) b! F! i0 O* n7 {3 A5 s
#include <stdio.h>
+ T4 Z# n  {5 I" i8 Z$ ~) Y#include "WinSock.h"1 s" S9 R8 u& O8 |" ?
/*#define WM_SOCKET WM_USER+1000
4 z: L) Q* T2 t1 R2 o, f* M. s#define INITSOCKETSUCCESS 0
0 C. b/ }5 X$ Y$ M4 n& Y) y5 y& z#define INITSOCKETFAILURE 10 A1 \0 |1 O, N8 Z
#define CREATELISTENSOCKETSUCCESS 28 L1 r+ p  m1 a0 U
#define CREATELISTENSOCKETFAILURE 3
$ d$ e2 z$ `! l#define SETLISTENSOCKETSUCCESS 4
4 _% H8 R5 R1 [/ v1 J' W$ n) s& K0 f#define SETLISTENSOCKETFAILURE 5- c2 X1 }: |8 p
#define BINDLISTENSOCKETSUCCESS 6
6 c" B$ n- g: d. Q* B7 X- B9 p#define BINDLISTENSOCKETFAILURE 7
' }9 g; h! A: Y5 N1 S' x# G#define LISTENSOCKETSUCCESS 8
3 q0 Q: E8 G9 C  |; `. l& S1 n5 k# w' s5 \#define LISTENSOCKETFAILURE 99 O) x8 v$ B8 {3 ]( z
#define ACCEPTSOCKETSUCCESS 10
5 H# {: s0 \% K# e2 ~! h5 _5 p#define ACCEPTSOCKETFAILURE 11
# W2 x3 }) A; n  d) m5 T7 x*/
5 k4 f5 V& |9 Q1 G5 }4 p4 B" fclass TPSTNForm : public TForm
6 S5 W. }3 {1 J, q. e{
& l! b9 E- Y+ E__published: // IDE-managed Components: B) E9 W# O1 w* H! m2 i
   TEdit *Port;/ h3 M( w0 ~/ _; O
   TLabel *Label1;
/ }& ]& I( C0 \9 m* o( L8 a) m: m7 K   TMemo *Memo1;
- E7 x# r$ S) A9 \; V   TButton *Button1;! j1 H9 }! c+ T  x5 b
   TButton *Button2;
& s! o7 L2 g1 O' |3 h   TLabel *Label2;+ d6 _: r" r+ H+ O- c! ^; G* R4 D
   TComboBox *Prot;
# R& e0 B: f. K5 T3 S. i$ |   void __fastcall Button1Click(TObject *Sender);
/ s: X" S0 t4 x  d   void __fastcall Button2Click(TObject *Sender);& ^8 @; v2 b. s+ a1 o
   void __fastcall FormCreate(TObject *Sender);
! R+ C* z, F" P! \$ F   void __fastcall FormDestroy(TObject *Sender);
$ a/ I) x/ f  x& n2 Dprivate: // User declarations4 D. d/ E, W0 l; }0 d( z9 \" p
public:  // User declarations, @2 _, q/ `0 z; v* R6 N/ J) Z: @
   __fastcall TPSTNForm(TComponent* Owner);8 y- V- o0 s; _* L6 O, b. Z( R
};8 X3 T* C! T; z2 L# J
enum PROTO {TCP,UDP};
, k5 B' [9 P4 Fclass TCommunication:public TThread    //Communication Thread& ~$ ^/ R2 s/ f" {* G) M
{+ \- `' Z0 l. l0 B+ x+ e# m
private:
5 F/ a: G( Z7 e! P   SOCKET m_AcceptSocket;% L& K( D  ~$ D9 Q, X* Z& g: b  Y
   char szTmp[256];//ERROR MESSAGE
6 s" Z- Q4 C- p9 V/ B( i' Cpublic:
! c+ D5 R& N$ R, r# y4 w4 `- \   __fastcall TCommunication(SOCKET m_Socket,bool CreateSuspended);) K1 n# b$ j. Y; j
   __fastcall ~TCommunication();( V* \3 k8 U1 u2 e5 i
protected:
& X6 D( B% _" ?8 y( W   virtual void __fastcall Execute();7 ]/ s/ D0 _: D. Q- D
};. O. \4 Z  b0 \6 B% t* ]1 l" C) {
class TListenThread:public TThread //Listen Thread
. `3 F$ d& T( q+ y{6 U6 e  J, ^8 [5 O. j. D4 d3 W
private:
* N' M. \- C" i; l   WSAData wsaData;
- l5 f" {! I2 f, S0 m   struct sockaddr_in server;! Q  n0 l1 p" ~/ o9 }4 N0 h3 f
   fd_set FDS;
, B9 [, O1 O6 B0 k/ C, n   UINT m_Port;
) z& I2 m# k- E$ v   PROTO m_Protocol;
; K1 k8 j8 @) Y5 e, Q/ g   char szTmp[256];//Error Message3 T5 A0 U' T& |: {! I
public:4 I5 q7 w2 \+ S* l
   SOCKET m_Socket;
$ M; M6 r! s( u   void __fastcall DoError();+ {3 F" B2 m. W0 S: }. i
   void __fastcall InitSocket();
4 @* F4 s) z1 d3 F3 O+ A   void __fastcall CreateListenSocket();
7 R5 j- e: `5 i( q   void __fastcall SetListenSocket();- W5 q7 Y: T* H- ?; R( x) d# {8 q
   void __fastcall BindListenSocket();
+ C* [8 _7 d. B+ U$ E   void __fastcall ListenSocket();" h1 h" ]8 H' i# C1 o$ R

# P* b& R2 m+ B! _/ O) F3 q2 Npublic:& k4 |, T! M- L0 s' q
   __fastcall TListenThread(PROTO m_ProtocolA,UINT m_PortA,bool CreateSuspended);+ P( n1 t3 H1 h' W- o
   virtual __fastcall ~TListenThread();* C+ B, d( K$ `
protected:
6 G. T1 |% B0 A% D+ P) y   virtual void __fastcall Execute();
# o4 E7 G( t$ m5 ]( r8 c};+ Y5 {, M: p& m! B2 u( U
extern PACKAGE TPSTNForm *PSTNForm;
( Y. }# q# x; z#endif
  T- ~: e' M. ~" q' H& F% W- O.cpp File- G: q& C( x, E7 P1 g. Q& p
#include <vcl.h>
& P+ {+ g* @0 ~/ f; m5 f#pragma hdrstop- W5 D- q. h7 ]; V9 D  {& x! l
#include "UDPServer.h"- E* t1 b% F0 u$ c1 @6 C% \( E/ @
#pragma package(smart_init)# U  H7 |' C$ J! w) z) l
#pragma resource "*.dfm", I# G2 {$ R- J, ]) U4 N7 ?
TPSTNForm *PSTNForm;
7 c- a3 G# _- e) X: l1 `TListenThread *pThread=0;" i( x5 n: N8 M( A
//******************************CLASS TCommunication For TCP****************************************************
/ ]3 n& d7 x1 |& n+ Q# E. @' s__fastcall TCommunication::TCommunication(SOCKET m_Socket,bool CreateSuspended):TThread(FALSE)2 n. G7 J; i3 x; W  [, g2 Q  g! A
{" W! ~3 v' w4 R4 X
   m_AcceptSocket=m_Socket;' `1 ^, t2 }6 \8 S8 Z* ]- z+ c
   szTmp[0]='\0';. s( ?/ ~) e5 [. F8 c& T
   FreeOnTerminate=true;1 w) i' z2 j8 D: @$ d, P
}9 z" U9 S: {  g) u& ^0 H; M: a# N" V
__fastcall TCommunication::~TCommunication()
/ ~: e  u2 q) B. D; C6 n* x6 {1 z4 j# Q{
$ o* D1 x/ k+ U' }$ ^% ?! z  // closesocket(m_AcceptSocket);
1 d+ ]# H# ?+ q7 }. B. k}' [5 C6 o; y- p1 r
void __fastcall TCommunication::Execute()
1 o) @& V# h' @" S5 S4 j{$ J) `: S1 y6 j6 q# L
   char buf[4096];
) E3 g7 O+ B% p0 I% L7 F   int nSize=0;* X! n+ _% w& d. T
   nSize=recv(m_AcceptSocket,(char FAR*)buf,4096,0);
$ m% [% R1 o9 \   if(nSize>0)
* D3 m) W( |1 E$ v/ m" h8 n   {) q' ?# _4 v$ q4 q7 X: }+ ]; M3 g+ z
      buf[nSize]='\0';/ D# O/ I* h: ~/ Q7 G8 L
      //Display
1 n5 U6 X8 i) U( Y& N& K9 Q7 G      PSTNForm->Memo1->Lines->Add("Received Length:"+String(nSize));
( g/ ^0 k- T5 F      PSTNForm->Memo1->Lines->Add("Received:"+StrPas(buf));
  E$ f% E4 q& U3 ~' ]      //Deliver$ ^) p  e2 p% \- P" G' N
      ::Sleep(100);" K+ S3 W: v/ j+ F& t, ~& s# s4 [
      send(m_AcceptSocket,buf,nSize,0);
/ ]  K( w8 N& h& P5 I5 O   }5 i, w: {* T2 |: d! V) U  z
4 @8 y! \; ~' k, ?3 F/ \( j* Q
}
. I9 E# w2 j' J//******************************CLASS TListenThread*****************************************************" k+ Z" ^2 A& m0 y& X  I0 w
__fastcall TListenThread::TListenThread(PROTO m_ProtocolA,UINT m_PortA,bool CreateSuspended):TThread(FALSE)
, |. r/ c8 c0 n1 |/ Y( W{4 i  @1 ]: @2 O; O& t! \1 X  k
   m_Socket=INVALID_SOCKET;9 j; E% `' I: B8 r0 d6 z/ Q
   m_Port=m_PortA;
! \1 ^4 P/ T! h" k& I2 M7 Z   m_Protocol=m_ProtocolA;
# b$ R( S  V; I) }/ P! S  P/ ^' ~# {   szTmp[0]='\0';1 S8 B9 W, r% m! ]( g9 |. N
   ::ZeroMemory(&wsaData,sizeof(WSAData));
& x' N% t, f( \. D' A  U! l! \( Q  f   ::ZeroMemory(&server,sizeof(struct sockaddr_in));, s' s2 D- ^* X$ w2 ]. ]
   FreeOnTerminate=TRUE;//Automatically delete while terminating.1 B! H. ]5 W' G# ]0 R2 G
}
8 e) E: N( E* s$ e5 I& r__fastcall TListenThread::~TListenThread()
$ `* s! ^9 i* A; Y4 ~" X. F% C# V{
+ o4 L5 Y0 A& U, O4 _! ?# j( X   closesocket(m_Socket);' |! H, R* x1 k0 E8 p* p% k
   ::WSACleanup();
( F& b  L6 d0 \/ l+ D! R   m_Socket=INVALID_SOCKET;# _+ W) u. Q0 H4 d. \
   m_Port=0;% v* i% Y: O9 f5 _$ `; M  T
   m_Protocol=TCP;8 r& ]' @% i1 I1 O: I1 U" Q3 |- G
   szTmp[0]='\0';$ U2 r5 _2 W/ L  q
   ::ZeroMemory(&wsaData,sizeof(WSAData));- ]) Q. M0 W* H7 S; L
   ::ZeroMemory(&server,sizeof(struct sockaddr_in));
" [) P/ d9 V$ P! e6 B7 y}6 W( Z/ [; J" [+ F- |) d  V
void __fastcall TListenThread:oError()
* L2 `# r+ ^4 p& J{
- e8 \: v/ w, c; [   if(m_Socket!=INVALID_SOCKET) closesocket(m_Socket);5 A3 V. @, A0 m" F$ ~
   WSACleanup();4 S; g5 }& L0 ^% d  |/ u
   return;
9 i7 T0 h( K4 m2 D6 s( [}
) x4 |& j8 E8 vvoid __fastcall TListenThread::InitSocket()1 t  U1 l7 R( Q: ]% h+ G  b9 `
{
0 T& f* w9 z: C" g3 B& o$ y   WORD version=MAKEWORD(2,0);4 o+ G' A  E, V# m9 J7 b
   if(::WSAStartup(version,&wsaData)){+ p$ L. k. e* V0 a" m
      sprintf(szTmp,"Failed to intiailize socket,error no:%d",::WSAGetLastError());
7 w- n& E' |8 \3 P0 t      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);: I8 R* P, f* H* [
      DoError();
' e2 m, S* k. c0 g      return;4 e' V- \* N: `% v" R/ k
   }
3 m/ a- z& G+ H, x}
; Q( T' Z9 ~' G% r4 p; pvoid __fastcall TListenThread::CreateListenSocket()% g" b/ e! j' `& z9 }/ m, _( F& _
{
! ]% V, Z0 y: x& U0 A8 y- U   switch(m_Protocol)
) h! V! u% {' `0 Q$ m' R, a   {1 u; A- T4 k5 g2 a
      case UDP:
- B/ ^! l3 {/ c6 H9 J/ W& |         m_Socket=socket(AF_INET,SOCK_DGRAM,0);) R2 S) l, H" c* ~2 g. a" K6 A
         break;
* K7 y3 V- W! W8 D3 P  L      case TCP:3 Z% G' V" L0 Y, n" \. E
         m_Socket=socket(AF_INET,SOCK_STREAM,0);: o+ l; g0 R' V9 u$ z; F& B
         break;
: m/ O. J2 [. |; M2 T  J      default:# i( Z/ S* U) D8 N: s
         sprintf(szTmp,"Error protocol!");9 O9 o" I  U5 i
         ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);% |  x, j  V  N9 D& V$ i1 W; ~
         DoError();
4 [! Y; n9 M8 ~+ [# `+ ]! H         break;
" q% [3 _7 _+ U. ?/ Y   }  [* g+ I7 @0 Q3 Z% s+ Y
   if(m_Socket==INVALID_SOCKET){( o7 z: P8 ]  q
      sprintf(szTmp,"Failed to create socket!");7 T( Y& o3 O; S8 Y
      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);
( T5 x( m) R$ A1 {( [+ a0 J! O! S      DoError();
0 r# [+ z5 J$ S$ p6 X8 V5 D      return;
1 E2 n7 e6 {- K$ J6 j  p/ X5 F. v   }' M/ Y, m& a7 C  t" C0 Q. n
}
7 d* w. L2 X1 m' O- t. Uvoid __fastcall TListenThread::SetListenSocket()2 i, e) B  A- a0 I+ ~3 l
{' j1 L* I& Z' f: m! U; {% x
   server.sin_family=AF_INET;" m  k9 {4 I" E3 b& l( u: t
   server.sin_port=htons(m_Port);* P" x+ S5 ]4 ]
   server.sin_addr.S_un.S_addr=INADDR_ANY;$ {8 E0 M( z, D! U2 l$ g5 y6 j
   int NewOpenType=SO_SYNCHRONOUS_NONALERT;: D( k- @& V# {: ]- \, s4 v
   if(setsockopt(INVALID_SOCKET,SOL_SOCKET,SO_OPENTYPE,(char*)&NewOpenType,4)){
& L8 C  L' U0 Q0 H" Z; S' ]      sprintf(szTmp,"Set socket option error,error no:%d",::WSAGetLastError());
4 c/ l4 b7 D( x, b/ \; u: `2 ~0 j      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);+ W! q" H! \  m1 J/ ?8 S8 r
      DoError();8 P- q& j; r) J5 ~# r. _# X
      return;
; e  z# n, v, I( D   }' k7 |& X" S, q9 Q2 E2 ~& D
}
& ^0 `# ^' H# `! |% R2 lvoid __fastcall TListenThread::BindListenSocket()8 _' D5 u3 [# H8 [& d
{- {, f8 T/ x4 L9 y+ @! q
    if(bind(m_Socket,(sockaddr*)&server,sizeof(struct sockaddr_in))){
. T6 C* D2 Y/ a2 c8 M      sprintf(szTmp,"Failed to bind socket,error no:%d",::WSAGetLastError());
+ ~, z8 _9 E' i* i      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);$ z' x9 o3 {# Z- y* a6 f
      DoError();
! E/ [2 w9 v' M  J3 S- b      return;
4 K6 i: F, f9 w* V6 R   }  ^! }2 c6 r5 D. d" {  z  R7 y. b  b$ w

% t  D1 l) l) L' v2 @. g0 a}
+ l9 r  u6 s+ i! `& d/ Yvoid __fastcall TListenThread:istenSocket()
9 b0 y5 U: O9 p1 w2 i; l5 h' e{
! N2 d* U2 D7 ]2 x5 j. r- j1 _  if(listen(m_Socket,SOMAXCONN)){! n- X" }) r. L/ L  r
     sprintf(szTmp,"listen error,error no:%d",::WSAGetLastError());
8 E0 D+ L' M6 d; H% ?     ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);
  J$ P" C6 D3 v! M' x* L( a     DoError();
5 i" b* H$ ^' `     return;
+ b1 P  Q& D4 d, J3 p7 D  }
6 H6 G+ I- {4 U% W( v  //Determine whether there is any connection
+ N& ?/ P2 U& I, E  FD_ZERO(&FDS);
2 Q7 O5 N5 p+ E! g; b  FD_SET(m_Socket,&FDS);/ ]+ l* r5 o4 J/ H! |" {5 a
}
$ f4 ?7 w2 W9 z$ e' b2 L' l* R& ^void __fastcall TListenThread::Execute(), A% A4 R* V) M0 f1 \' a6 H7 y
{5 o& U& M* U) M4 }$ P& L1 s/ i
   char buf[4096];4 U2 L- N- v+ y/ ~! M# U- g
   struct sockaddr_in from; //for UDP
( g6 e* z: L1 T, K8 n- T) K   int nLen=sizeof(from),nSize=0;  //for UDP
2 E; |# n. ^, _, h   InitSocket();
! U7 v. H! s$ S7 f4 Z' q   CreateListenSocket();2 a+ ?5 W4 I0 v! z  b
   SetListenSocket();
# ^' ?! ^( _, {0 n   BindListenSocket();% l$ L5 h- z# d. z/ G, v/ B- n
   if(m_Protocol==UDP){
. ^4 F* s" |- L6 a' j9 p) {7 x      while(!Terminated){
8 T) y5 {% ^% Z3 M         int nSize=recvfrom(m_Socket,buf,4096,0,(struct sockaddr*)&from,&nLen);5 b4 Z; c# e* A  o
         if(nSize>0){
/ A  d* v3 f4 c4 s% q            buf[nSize]='\0';* B  R& N8 U! O9 T3 C& T
            PSTNForm->Memo1->Lines->Add("Received Length:"+String(nSize));
- C( }" ^+ M) _            PSTNForm->Memo1->Lines->Add("Received:"+StrPas(buf));
4 ^8 @/ a' X0 [$ L3 @            ::Sleep(100);
: y7 \& A  _& G, V* J            sendto(m_Socket,buf,nSize,0,(struct sockaddr*)&from,sizeof(struct sockaddr_in));, R* p5 A  R1 f; M
         }
: n4 G$ j+ G! }6 }" s% u% Q         else return;
6 m9 Y" w7 w9 ~" P; x- R9 S, n9 n/ }+ B4 U
% c2 D8 i1 T( c' M( x9 v      }2 @8 R  W* k' ~! ~3 b- k4 u3 z; F
   }
5 r) w( U5 N( d4 f   ListenSocket();
) `) b: x2 _2 u) }2 ?+ O+ C   struct sockaddr_in client;
2 w5 r& J) x- ]. ]8 e   int nLength=sizeof(struct sockaddr_in);
% ?4 B# k( K, ~, }' q6 C0 j   while(!Terminated){$ K  p% c/ z- ?$ q+ q1 R5 `
      int nError=select(1,&FDS,0,0,0);8 S1 d3 ?4 B# {" k1 s. |3 Q
      if(nError<=0) Terminate();
; Q$ u5 t  f- V8 w      SOCKET m_AcceptSocket=accept(m_Socket,(struct sockaddr*)&client,&nLength);  v* h( N) O  O, g1 z3 _! d% Z% g
      if(m_AcceptSocket==INVALID_SOCKET){
) B% j/ c2 g2 G- H         sprintf(szTmp,"Failed to execute accept,error no:%d",::WSAGetLastError());6 D* E) @7 a" R3 c' k4 h
         ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);# G1 g9 _2 H. ?9 Z6 Q0 b
         DoError();
6 o& w) q, T- x+ T5 T0 U2 X/ Y) F) k         Terminate();
' O! @  V: ?+ l; V( q+ ]! B         return;
# g- {5 l8 r2 t      }' W: P0 G0 K& {" p
      TCommunication *pCThread=new TCommunication(m_AcceptSocket,FALSE);
2 h1 n  W8 N  [. |* r      pCThread->Terminate();
- E- y% i+ ~3 r- _( y      pCThread->WaitFor();
0 p% n: w3 r/ n( }! z6 \% e   }
1 ~7 u+ X) d# f6 N}3 ?% R: b9 s$ U7 u
//************************PSTNForm*********************************************//
' P, l% v6 c3 g8 l! A__fastcall TPSTNForm::TPSTNForm(TComponent* Owner)/ t" {, {# [% H8 \$ S
   : TForm(Owner)
7 ?! p  R( Y: D( S! @{4 N5 d  S7 \0 V
}
7 `1 t9 [  P! q3 H) v& Fvoid __fastcall TPSTNForm::Button1Click(TObject *Sender)
8 j& U* u' F% b+ p% Q+ q$ x6 l{2 t7 J8 \( N0 Z$ _9 [6 M
   Close();: a7 G7 f$ X' _2 a1 y' W) ~
}2 Q2 ^6 J8 u. `% w2 ?
void __fastcall TPSTNForm::Button2Click(TObject *Sender)& c9 E( `* r5 E" F% s
{* G7 t, G6 Q1 C; x( a. e
   if(pThread){
7 \( e# t' ~% T9 b( x( w      pThread->Suspend();. ^9 u' ~* D* x- I
      pThread->Terminate();
) q: A: A, ?% j- R- V( l% Y      delete pThread;9 Y0 R( T, u# |6 z
      pThread=0;
; H. l3 |0 R- A2 t3 d2 p) a   }
, D3 _% [: n" z$ d! W   UINT m_Port;
6 [. ]  d! K+ |/ _* G& ^2 t   try
" o4 p# u0 l8 V* b   {
6 g3 ~0 o3 v# f/ F/ b- n      m_Port=Port->Text.ToInt();
3 P3 q5 t/ E+ I   }- d% i  `% a+ K5 O: T0 D! j- m* Y
   catch(Exception &e)! D; o9 M$ z- |% L& f- ]: u
   {
: G/ P: t; `+ L" B- e      ::MessageBox(0,e.Message.c_str(),"Error",MB_OK+MB_ICONERROR);
/ ]* Z+ Z* }) L2 B4 r& f      return;8 V1 B- q8 K2 d! t0 p  D
   }, p# ]+ c3 i# Z, a
   PROTO m_Protocol;
8 Q7 M/ R$ s! e/ \   switch(Prot->ItemIndex)$ w9 p- O4 A! c" ~
   {
2 M+ |( [4 C/ @/ B) G  S7 }( i5 Y      case 0:
3 n! q2 p; ^& y" e         m_Protocol=TCP;
2 H' y6 v2 V1 e) z. ?0 ^1 Z         break;
& f9 W3 F  P" g/ y  h  T      case 1:; G5 s9 t% n5 ^) ^" e: I# L1 W, U# Z
         m_Protocol=UDP;
; V0 \' n2 Q# s$ e4 _0 z         break;
7 n% M/ H) x4 y& p' t* e9 _9 e' {      default:  ?  _' q- K6 ~0 q; R) {
         break;
0 e- N, [' _0 x  g) A, F; |' e   }
  ~* K6 X5 x& }9 N# d- `8 a   pThread=new TListenThread(m_Protocol,m_Port,FALSE);- A9 `, e# E( b; z: P2 P' @
   //pThread->Terminate();: B( v, A) ^1 H9 J5 k% ?
}4 q# K0 p8 m+ A% E3 i  R
void __fastcall TPSTNForm::FormCreate(TObject *Sender)
9 x! b" d0 |; y{' o# Z9 T1 l7 }8 `) t2 X; w
   ::SendMessage(Prot->Handle,CB_SETCURSEL,0,1);+ s+ _  }# g$ g" u* Y+ s! @
}
' w% ?- o, t+ V) f0 h: y" a
! r) H7 p- k3 z9 c  i* wvoid __fastcall TPSTNForm::FormDestroy(TObject *Sender)% _1 O9 q0 @. B9 R, Y+ B* \
{) ?9 D  w+ d' B( \" h" v2 i
   if(pThread){
7 X$ y1 N' O% y! A      pThread->Suspend();* \* w  i. g4 w1 B5 Y
      pThread->Terminate();}7 l% [( ?% B9 N7 G0 U4 C
}* ~4 n8 ]# I: m4 Z) ~( O! m
上面的代码,各位可根据自已的需要和针对自已的应用,在数据处理方面加以改进就可以了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-5-2 10:35 , Processed in 0.019610 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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