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

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

[复制链接]
发表于 2004-2-15 14:01:13 | 显示全部楼层 |阅读模式
在CB中用socket api来写网络通讯程序
' E3 o3 c, P; }4 x作者: kingcaiyao ,如转载请保证本文档的完整性,并注明出处。& Q5 [6 u# }# @% b6 ]( `
欢迎光临 C++ Builder 研究,http://www.ccrun.com/doc/go.asp?id=569
6 }1 w' w3 _: N% k4 |5 V本文转自csdn,作者:kingcaiyao
& I3 ~( d$ z7 Z0 O: r原标题:在C++ Builder中用socket api来写网络通讯程序(同时支持TCP和UDP协议)* b  o: r* z# O( n  C+ s  g8 Z' Y1 l$ |
原文:  http://www.csdn.net/develop/read_article.asp?id=19883
0 j8 Y5 Q- C# i# W5 A" F9 |3 A0 u6 W) v3 }

  Q4 |/ Y, G$ p: a在7月4日看完sockcomp.pas后,我决定用socket api来写一个客户端和服务器并且同时支持TCP,UDP协议,于是我就去做,现将代码贴出来(已调试通过)
0 i4 r& g: k" r# G6 i/ JSocket api Client:
: e  \! H% B" e$ U1 f
$ Y) j0 b3 f. d) u; d- f2 F3 t#ifndef UDPClientH% C2 X' a! R" R. B
#define UDPClientH* u+ d/ l  X2 I9 W. k9 I
#include <Classes.hpp>
  q1 r/ f& U- I5 H#include <Controls.hpp>% e. x5 {6 I! A0 S' h; L1 Q! \; B
#include <StdCtrls.hpp>: {0 A& |0 z) `4 M" u
#include <Forms.hpp>+ b4 J: ]5 R( N
#include <stdio.h>! A7 g5 |! q" T3 ]! H( P7 a, y
#include "CCEdit.h"
$ {. U7 W8 u; E5 v  d6 \#define WM_SOCK WM_USER+1006 ^2 q  k% m& ~# X) |: D4 }! Z8 T
class TLANForm : public TForm# {5 y' M  s- n  h  ^4 z( I$ x9 O& V" R
{  s5 ~, |  Q: y. P0 a4 l
__published: // IDE-managed Components
* Z# a0 f# X+ G/ K! I, V5 t. @   TEdit *Port;4 t; j2 k& r( [6 Y0 Y
   TLabel *Label1;% B# \* H, v, g2 V: l! [, B) I/ }
   TLabel *Label2;
7 A! C) |$ M9 d) u9 |   TComboBox *Prot;
) o' a- k# S2 X. U   TButton *Button1;
, b; m/ j  C6 O   TLabel *Label3;/ Z7 y, ~2 M& {; n+ V
   TEdit *Addr;
8 `1 s: |& R, g" K6 @3 ?  n% |   TCCEdit *TxtEdit;* Z& c7 z, e" p$ F) s- y7 X
   void __fastcall FormCreate(TObject *Sender);
. Y+ O9 S* i; v' P8 l   void __fastcall Button1Click(TObject *Sender);! t# v/ |5 R4 O( u
   void __fastcall FormDestroy(TObject *Sender);+ F, |- {2 c( @+ D/ _$ p' x
private: // User declarations
( ^+ ^3 v0 a, S8 j! o   void __fastcall OnRecv(TMessage &Message);2 [" Y2 E' i% a* ~7 V" m7 @/ S
public:  // User declarations6 a6 X+ w6 j3 ^! x
   __fastcall TLANForm(TComponent* Owner);
0 O; T2 N4 U3 N5 ^/ P4 E# O# T3 `   BEGIN_MESSAGE_MAP
4 U$ u( |# ]9 {9 |. W# O: K      VCL_MESSAGE_HANDLER(WM_SOCK,TMessage,OnRecv);5 C/ G6 {! d& _
   END_MESSAGE_MAP(TForm);
; ?) U, Q2 J' L/ ^2 t1 o/ u; d) e};; y0 d- T* m0 G+ U  F
extern PACKAGE TLANForm *LANForm;
. s. L( b! w8 ?6 X& P0 r2 l3 g#endif( a# J! b! E* Q* T1 V
2 I( f! a. V% [/ N; r
# @( }& h6 w" {  O; a$ a
.cpp File
0 @" m9 I) k8 t# Q
' \7 W* e4 H3 v9 b#include <vcl.h>
( h- a! F4 L, L" D" d# _3 |#pragma hdrstop
* q; i! L3 t. C3 ^* W#include "UDPClient.h": l/ q# T2 y% ]' v' t
#include "WinSock.h"% L6 V, p4 ?$ y; N
#pragma package(smart_init)
8 m) L/ C' p+ Y. W3 k, x#pragma link "CCEdit"
  v+ g  K2 E8 C5 H  _#pragma resource "*.dfm"
1 ?% d  z% A* Z8 P. g; WTLANForm *LANForm;
+ z) p+ j8 k% X( n3 ^# ^; senum PROTO {TCP=0,UDP=1};
* t3 m, C* [5 tSOCKET m_Socket=INVALID_SOCKET;
' }% t% }$ X6 a3 y4 `, EPROTO m_Protocol=TCP;+ T' K" i1 ^5 R4 D
__fastcall TLANForm::TLANForm(TComponent* Owner)
% d! B% Z5 I" p   : TForm(Owner)
# {4 e* c. D" G  m  o0 ?3 y0 \{5 h% C3 a# B/ u# w# u) @1 y

  Q6 Q( o4 {$ e2 f4 J8 N* Q}, N9 l6 S, z! G: F
void __fastcall TLANForm::FormCreate(TObject *Sender), @5 k+ d! G# H4 D6 b8 C9 C+ H
{
$ T' Y6 Z/ n/ z0 ^( t: N   ::SendMessage(Prot->Handle,CB_SETCURSEL,0,0);
$ X9 v* j4 D( y9 C5 ~* U2 W}: {( E5 C- }- E  ?3 R: W$ R
void __fastcall TLANForm::OnRecv(TMessage &Message)+ v0 B$ W! w2 I) ^2 \; f
{
/ P2 [4 ?6 v# l8 u" {: O   char buf[4096];
  K( T9 I, C2 a; h# ]* z6 b  h* P   int nLen;
- r# c5 B, M5 I* T% w9 z/ ~) i   struct sockaddr_in from;: p$ g; I) H) K8 m; G0 _9 H0 i
   int nLength=sizeof(struct sockaddr_in);
: Y) I1 j0 }( }( G! A2 K  }   switch(WSAGETSELECTEVENT(Message.LParam))
& @$ ]9 }( D, ^7 F9 j4 T7 ~   {  W0 T' G+ E3 |' L
      case FD_READ:
5 B, s  M  E& f1 {& n, P$ t         switch(m_Protocol)4 U9 B+ n( z  V8 q& @
         {/ a0 w5 g- m+ m
            case TCP:
. W+ m+ ~2 K. H               nLen=recv(m_Socket,buf,4096,0);! o; R  p- j6 |. |% ?4 q, }, g/ k
               if(nLen>0){: ~' _, E/ F( G  x+ F
                  buf[nLen]='\0';) U4 \( b- d/ \! [
                  TxtEdit->Text="Received Length:"+String(nLen)+"\r\n"+StrPas(buf);
  k# _$ R: K( S( P" B! J' y  N! z3 u               }+ V' i* _% I; Q: Y4 Z* Y
               break;4 S# E) t) \& O3 |8 N  I: n; Q
            case UDP:
  h& s3 s7 ~, Y3 v) d, M3 o% _               nLen=recvfrom(m_Socket,buf,4096,0,(struct sockaddr*)&from,&nLength);
+ w3 T' G7 R9 l& q               if(nLen>0){
6 L; Q5 g, v# I+ ]5 V# }                  buf[nLen]='\0';
& ~; q. D9 w+ |- R" y$ T                  TxtEdit->Text="Received Length:"+String(nLen)+"\r\n"+StrPas(buf);
% \  _+ ~+ [! j& F, |$ G$ @) q8 z               }
" O/ n* N8 J& ]7 g6 U/ t               break;/ u% [. l; P5 b, h3 R
         }
4 ?2 |9 R$ ]& y/ C         break;% F1 p) \; z) F6 p8 }6 {& }& s7 {
      case FD_CLOSE:% o. o4 o& }& ]4 ~
         closesocket(m_Socket);
, W  X8 w5 e% e$ Z$ j         break;
+ W/ E+ j, G7 H6 D6 u5 r) o   }
5 p+ q( F- d4 m& I) c& `}
/ u4 E$ n0 D6 k: P) \0 ^2 c  Y/ D
void __fastcall TLANForm::Button1Click(TObject *Sender)+ d+ A; g; ~. W! V
{
, K4 O& t- e% ~" [( k6 F   char szTmp[256],buf[4096];5 s) a) C0 g7 g' u4 X" w1 T& D
   int nSize=0;: N6 C1 f( X: h
   UINT m_Port;. |. {1 @* `! x* a% `
   AnsiString addr;
+ ?  |" P* ^' ]7 _/ H( D1 z! Q  x# V   addr=Addr->Text.Trim();6 q) p6 R  L% S2 b" ~
   if(addr.IsEmpty()){4 V7 i2 n$ n" A' L& t% s
      ::MessageBox(0,"lease enter the server IP!","Error",MB_OK+MB_ICONERROR);
* L) B7 H& s, [      return;
: W. ]9 U" R$ o. f- i6 e   }8 C& O) F  o0 W& }  K9 m
   unsigned long nAddr=inet_addr(addr.c_str());" F% y" N. m- l1 s: R6 ]+ `
   if(nAddr==INADDR_NONE){
* a9 c! ?; Q; O      ::MessageBox(0,"Bad Internet IP!","Error",MB_OK+MB_ICONERROR);
3 s/ Q& ]8 }* ^      return;}
5 f3 O  {  I: w6 l
" w8 E) p2 e* k' c   try
( l6 f* R3 p% \7 Q# r% v   {4 c7 e2 p/ h. R) {
      m_Port=Port->Text.ToInt();9 [9 r  n* ^) k9 l- p8 \. M; J
   }
7 [7 ^$ Z! V7 z   catch(Exception &e). G2 R) Z; O& A; G" e( s6 C# o
   {
) m0 R& }$ \7 O0 o! e      ::MessageBox(0,e.Message.c_str(),"Error",MB_OK+MB_ICONERROR);
4 F" E6 ?# V9 O; c  l+ N$ B% w      return;
8 Q8 L; m7 n" f- s$ [4 Q   }
# }: u4 t4 a+ i- B   switch(Prot->ItemIndex)3 Z0 i+ q! {# r0 M3 H
   {
2 W" j/ \4 n* W& e      case 0:  z, Q( y' r; i2 A: ?# F/ {
         m_Protocol=TCP;
8 d( p8 x7 M+ d1 l. t5 G3 c! K+ q         break;8 a5 }7 P& v+ u! e+ r# c- B
      case 1:7 w# G/ l, M6 m+ V4 h" w/ ^
         m_Protocol=UDP;( N. @  u; K. W. H& p
         break;" z- R" W; K0 F
   }! Q/ D# F( \2 T3 \7 T# I
   if(TxtEdit->Text.IsEmpty()){6 G# j* g( \4 v; o! M8 H
      ::MessageBox(0,"lease enter the text you want to send!","Error",MB_OK+MB_ICONERROR);
5 w: J+ N; i$ K/ B3 n      return;}
" h1 N' l/ @7 f, `
/ R& D5 Y1 g$ \( v+ {- P0 o   //Initialize Winsocket3 ?* n/ n* K5 s2 Q) m
   WSAData wsaData;
  u6 K1 O  I; s( G% F   ::ZeroMemory(&wsaData,sizeof(WSAData));
0 x) w6 s  [- x3 J4 T7 e   WORD version=MAKEWORD(2,0);
3 b- f  t( H0 `   if(::WSAStartup(version,&wsaData)){
& _- M- v: P9 r+ Z' Z1 D6 ~" N      sprintf(szTmp,"Failed to initial winsock enviroment!,error no:%d",::WSAGetLastError());6 X: y0 q# p! I# h1 }, x
      return;}
4 l- L7 u1 w) K  L0 b" p- ]
1 h( ]; w7 r1 z5 k   //Obtain the active connection
7 |% `% a8 L5 M* b   char ComputerName[255];% [0 ?1 a& c& O8 D  A
   gethostname(ComputerName,255);2 s( m8 b/ n/ o; v/ r" W
   struct hostent* he=gethostbyname(ComputerName);1 ]4 @) c: [0 i8 {. o) E
   if(!he){
+ @# b6 R1 B0 x! p+ t0 X) y/ X      sprintf(szTmp,"Failed to get information to host!","Error",MB_OK+MB_ICONERROR);
$ P& e6 s# I% B! b      ::WSACleanup();
/ H. Z/ E/ I% m( ^: N1 s3 ]8 _2 z      return;2 e/ H; P% ^9 r* H
   }- ~2 j1 N% h- I" Q4 w$ F
   //create new socket9 P! v- s! M4 U
   m_Socket=INVALID_SOCKET;  C0 s; f8 B4 [1 D9 c# i* p' C
   switch(m_Protocol)
( X- I; K% d) M4 V   {
( |- I" k& O, T9 ^4 W1 z  t, }      case TCP:+ P( o; u/ C' h4 Q' d
         m_Socket=socket(AF_INET,SOCK_STREAM,0);
( U/ p9 V1 G2 ^; T1 B         break;
' L% D( Q/ N. N/ B7 `4 f$ r3 W1 T2 y$ s      case UDP:
# n% y7 H% V7 J         m_Socket=socket(AF_INET,SOCK_DGRAM,0);. O5 U: k- h" Y9 `9 @7 I
         break;9 e8 [! F+ f8 F3 \+ J$ y
   }/ V# i6 Z, u& {5 j/ I
   if(m_Socket==INVALID_SOCKET){. O! G: o0 r1 t$ H" F
      sprintf(szTmp,"Failed to create a new socket!,error no:%d",::WSAGetLastError());
4 l2 H4 M8 @4 D      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);. l& e1 }* S0 q2 V) v5 o) O
      ::WSACleanup();
% l6 [3 E, u3 B; M7 a# Y# d) V      return;
1 \3 R9 \& \  n6 }0 Z9 Y   }* k3 z! y' Y% T4 \8 @. o
   //bind socket2 C/ z; Z  b4 D
   struct sockaddr_in client;, ]6 {; m2 v, |
   unsigned long nClient;
4 O0 J+ r# A* r6 F' E+ S   memcpy(&nClient,he->h_addr_list[0],sizeof(int));7 \; \, m1 K6 O0 S
   if(nClient==INADDR_NONE){
4 n$ K* _$ h: e* y- V2 {4 e      sprintf(szTmp,"Failed to obtain the local machine's IP!","Error",MB_OK+MB_ICONERROR);
6 A7 I( o, k9 r4 R" @      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);' @, }6 k( m7 W* u+ L; _
      closesocket(m_Socket);3 F$ O- K, g1 e5 r
      ::WSACleanup();
- S5 W. e+ v. A- ~/ ^9 b      return;
5 e# Q/ ^) P/ V7 K# x+ z# o6 d: O   }
) Z; p' E0 u' m   client.sin_family=AF_INET;( ]7 q. ?+ Q* H& Z1 ~1 c3 ?1 L
   client.sin_port=0;
' d, y! c3 \. ^8 N   client.sin_addr.S_un.S_addr=(int)nClient;5 ^+ p1 i5 u; u. Y* L  R
   if(bind(m_Socket,(struct sockaddr*)&client,sizeof(struct sockaddr))){
1 H3 e9 D4 @8 ?' {. ~      sprintf(szTmp,"Failed to bind socket!","Error",MB_OK+MB_ICONERROR);
% C. r8 T, i& a# T      closesocket(m_Socket);3 H4 W1 N2 M% R1 `- v6 v. P
      ::WSACleanup();) D; ~- ~7 y( _  i# d5 D# m+ ~
      return;}
9 h# [* q4 Y! [; u7 ~   //connect socket
. g3 {( h  \) e   struct sockaddr_in To;
9 r; Q1 z& g; |  _! R$ l   To.sin_family=AF_INET;3 U, \' f) X- b- v- m2 {: M$ ^5 r
   To.sin_port=htons(m_Port);; A4 [! ], c; d, Q
   To.sin_addr.S_un.S_addr=(int)nAddr;! `3 ~7 i$ M9 v- a0 f* S' H, m
   fd_set FDSET;
' S" c: T8 n/ a/ n' u' A0 f   FD_ZERO(&FDSET);& f- t0 X: F% x, w! t
   FD_SET(m_Socket,&FDSET);6 D5 g5 i. i$ r5 d

* m4 ]0 Y$ K4 d& X- U$ K) V1 f' {
   if(m_Protocol==TCP){
/ T- E# U2 E: C      if(connect(m_Socket,(struct sockaddr*)&To,sizeof(struct sockaddr))){
, Q% L1 \! a3 {% Q; a         sprintf(szTmp,"Failed to connect the object!,error no:%d",::WSAGetLastError());
% D/ }1 q2 O1 ^( z- a7 f         ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);
% |. S% f$ x- ~3 v         closesocket(m_Socket);
- H! @! |! Y5 ^% b; g0 ]         ::WSACleanup();
' Y2 l" _. b1 t1 v5 w" L         return;/ a) T& ]- ^2 V8 R+ I7 l
      }
7 \4 J/ a# q# c8 r, E" @$ t3 W8 d      int nError=select(1,0,&FDSET,0,0);
+ w0 y9 v/ W) b4 ^$ F) `' q      if(nError<=0){7 V" b8 _8 o- u* ]# }  u
      sprintf(szTmp,"Failed to select socket!,error no:%d",::WSAGetLastError());7 N0 Q! W. r" T: I
      closesocket(m_Socket);
! n5 [7 G) [8 ?! u6 P. b7 `      ::WSACleanup();
( j1 _3 l) x& j4 Q; q7 \      return;}
7 _. y1 T6 o. @% l; f9 N/ q7 q/ [4 j   }
2 L( \6 p5 g0 V   //Send data
' _  Z3 _; f' I4 ?, w- f3 \( e   int nLen=TxtEdit->Text.Length();3 a# b4 y. |- m" _2 j
   if(nLen>4096){: D9 c- i* W  U/ c3 K
      sprintf(szTmp,"The buffer is too size to send,it shoud not be more than 4096 bytes!");$ F. O2 N7 v5 v: w8 t
      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);$ @* Z  W0 g: w
      closesocket(m_Socket);
2 f" q8 c" G/ c8 c) @      ::WSACleanup();8 |5 n# C6 m+ _, ?) [5 F- D
      return;
2 a; u) v/ j3 _: \$ K- X   }7 ]7 X8 D1 t# \7 t. O' F9 E
   strncpy(buf,TxtEdit->Text.c_str(),nLen);
2 K/ g$ M. a3 S   switch(m_Protocol)5 R) @% L/ Q2 d. [- W
   {) U! b0 t9 n4 k/ ^2 l% y3 t* o4 B
      case TCP:& K  n2 f5 U0 ]/ M
         nSize=send(m_Socket,buf,nLen,0);
6 o& ]% f# j& t% E7 D         //ShowMessage(nSize);, ~$ Z! F$ ?9 Q5 L! E" {
         break;
1 B& b, X2 S8 a2 v/ \: A* O      case UDP:2 y. z; l7 T2 S1 i, n& e. b
         nSize=sendto(m_Socket,buf,nLen,0,(struct sockaddr*)&To,sizeof(struct sockaddr));
+ p4 m* y2 j0 D  p         //ShowMessage(nSize);4 S$ I* l' H  c8 _; |* k8 C
         break;
' J% V4 v" ]) P$ h. Z4 m7 Q5 ~  R/ E6 ?0 d* v
   }
$ S2 y" i" n7 D! Z: e9 E. U   if(::WSAAsyncSelect(m_Socket,Handle,WM_SOCK,FD_READ|FD_CLOSE)){
7 {+ \4 E# \# @( m4 [% N      sprintf(szTmp,"Failed to register socket event!,error no:%d",::WSAGetLastError());
/ N# N( a9 E' v      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);
* d1 L1 K; Z1 Z" U) }) e5 k      closesocket(m_Socket);
5 z& S0 u/ F. Q8 y7 d2 z! q      ::WSACleanup();% H( R3 C$ u; R$ t6 G, i" F
      return;}
4 ~6 j) s! Q* ^! t4 N7 }& w}
) b8 d5 G) O( b( c! I/ z3 Bvoid __fastcall TLANForm::FormDestroy(TObject *Sender)5 e4 e, S/ X: R' Q; [% [
{
2 M) e. l- k9 C6 |' L   closesocket(m_Socket);- ^7 y: g( S  q4 T5 _$ K0 w- h; A
   ::WSACleanup();
7 I$ p6 I: i2 I2 {/ M}& H- N+ v3 T6 e( b0 w! ]& k- V5 z

) U( m) f1 \$ S& e7 _- u& w# mSocket api Server:" n% M$ e, N% w) \. u( j
.h File
% X6 B" \# B5 ~3 J4 K- q#ifndef UDPServerH. o9 w! d9 `8 N3 W) Z( E
#define UDPServerH. P$ b) X9 L( K* }4 c6 G
#include <Classes.hpp>
% V' |6 G0 G1 i' p#include <Controls.hpp>1 f  ?6 m8 o7 n1 K4 Z2 ]/ T1 }, I" v
#include <StdCtrls.hpp>
4 m: P1 v: R# Z5 Z/ }3 t; }  @#include <Forms.hpp>
6 w  I/ k" N: D: w7 F  r! p* ?#include <stdio.h>
+ v& c# n! i/ P) {0 ?. j4 z8 M5 t#include "WinSock.h"1 R' S3 E6 v8 u2 U, \
/*#define WM_SOCKET WM_USER+10007 T6 I$ X* ]) ^0 _) b2 g) O
#define INITSOCKETSUCCESS 0
& o/ }0 q- z/ o; A6 A. |" w#define INITSOCKETFAILURE 1( f: O* _7 p3 p7 A' z: Y, q+ n3 v
#define CREATELISTENSOCKETSUCCESS 2
; N; N* J8 P. P9 _2 F% |* }#define CREATELISTENSOCKETFAILURE 3
0 q# ^/ J5 e1 q" z: {! u#define SETLISTENSOCKETSUCCESS 4  `6 u& i7 C" _- C* w5 n. q% [
#define SETLISTENSOCKETFAILURE 5/ Y& j- j, C. S: l. {/ O
#define BINDLISTENSOCKETSUCCESS 64 A/ o+ A1 F( U) Q% m8 L6 ]
#define BINDLISTENSOCKETFAILURE 7" H. r# z" p& G  w/ H5 Y& o% Q
#define LISTENSOCKETSUCCESS 8
, t  G& {, [3 q3 s; r9 Q#define LISTENSOCKETFAILURE 9
% |1 K# D& t5 `5 |+ i0 M1 v% l7 x  _#define ACCEPTSOCKETSUCCESS 10
; f- _1 l9 v1 Y9 }! d#define ACCEPTSOCKETFAILURE 11
: M( _* X1 w% S/ r! C*/
9 B- ~% W, E4 n* v2 V; dclass TPSTNForm : public TForm
! q  q* [: q9 v$ ?% ^# D# g{6 L4 h( x& y; M3 N% b9 t. D
__published: // IDE-managed Components
2 {- O9 p6 p3 t! |   TEdit *Port;& a) G, h5 _2 T5 N0 O3 @* M
   TLabel *Label1;
7 L7 r1 j) _$ u8 E   TMemo *Memo1;0 z1 n1 Z7 o8 ?6 b+ }/ V4 k+ R9 ]
   TButton *Button1;7 d- ~' P7 @3 |
   TButton *Button2;! Z; P( g) o! ~7 S
   TLabel *Label2;
1 y0 [$ J* u% I   TComboBox *Prot;  F  z& |7 f8 E" w4 j/ J
   void __fastcall Button1Click(TObject *Sender);
: n. S  D! J4 g. |& X9 ]; q' s   void __fastcall Button2Click(TObject *Sender);1 f, A4 L7 q" g7 H' b
   void __fastcall FormCreate(TObject *Sender);1 Y5 T! V; w1 a! B% J" |
   void __fastcall FormDestroy(TObject *Sender);" e& s8 t+ c! g- T" P! J. J
private: // User declarations6 Y. [- {  i7 H) P+ n5 g
public:  // User declarations
1 o6 X7 m, J! s! C! f9 x   __fastcall TPSTNForm(TComponent* Owner);
, ]% v, [# k5 Y};
+ I: T. Y7 W' ]- V! T) w! \enum PROTO {TCP,UDP};
8 S( ?- G# L0 \  z% ^% bclass TCommunication:public TThread    //Communication Thread
% X6 S1 {, f4 }{
, L* A, M" h& W% F; ?/ }# e1 yprivate:$ w+ ?( _+ J! R6 L& ?4 V. L
   SOCKET m_AcceptSocket;/ f6 n; C: G  {3 v5 X1 l
   char szTmp[256];//ERROR MESSAGE
" M: d& ~$ [* w- Spublic:
3 b9 d. e5 H9 l* @. Q( [   __fastcall TCommunication(SOCKET m_Socket,bool CreateSuspended);# h! Q2 X. D, v* K* z6 v
   __fastcall ~TCommunication();4 V; z7 j/ a8 o% D* a# T+ ~0 [' J
protected:
/ g$ [& |- r. G/ _1 g, Z   virtual void __fastcall Execute();' g; y! l& n6 F* i* M$ s& B, M
};  d' f2 X/ T7 y% V4 d
class TListenThread:public TThread //Listen Thread5 }( p7 i# O+ V' k
{! B, h/ f6 e% N) c% C
private:7 w& T& ~% h- i  q4 U
   WSAData wsaData;
+ D" z$ T% o) A/ H3 f' X   struct sockaddr_in server;
, ^6 Q6 N% N- `7 m8 d$ {. [; s   fd_set FDS;/ w! S, @: w, f; G/ _) h
   UINT m_Port;% }6 N' C9 b! q8 t
   PROTO m_Protocol;
. _  U3 F0 H" P! ]9 n# Z& S   char szTmp[256];//Error Message
0 Q4 B. V+ D9 fpublic:, c; K$ U8 S8 m8 g
   SOCKET m_Socket;
5 T' a5 v- T  J- r0 A; y   void __fastcall DoError();* b2 \& e! E$ b
   void __fastcall InitSocket();* D, ?+ g4 d5 \9 {
   void __fastcall CreateListenSocket();
1 W3 t7 R2 A: e" L2 I2 ^; N   void __fastcall SetListenSocket();
4 Y' @( t2 `- w* W! L   void __fastcall BindListenSocket();8 ~4 e: f/ i2 s$ c7 U' V" W& E* z
   void __fastcall ListenSocket();
* X& F: X6 M  R( \* u3 @3 J0 E
, I* a) H. k$ I" S* l: p5 j5 Xpublic:8 R+ j: k: J: }; \3 {, Z; n3 Z/ z
   __fastcall TListenThread(PROTO m_ProtocolA,UINT m_PortA,bool CreateSuspended);
8 S5 V. U, D) u1 u; v9 J; ^) b   virtual __fastcall ~TListenThread();
. D+ |) u% Q% Y( e$ I% Hprotected:
# ?1 v- O1 J  s   virtual void __fastcall Execute();
! t+ C9 j" y$ x" {2 M( Q2 y};: M! A. {/ b$ \! F- U
extern PACKAGE TPSTNForm *PSTNForm;( c2 a- h  c. [0 {( E
#endif: W; b- Z+ ~$ ^% \- N3 D  X# ]
.cpp File2 @% R. T" Y1 d( ~6 ^
#include <vcl.h>2 S6 @+ j, K5 _$ S
#pragma hdrstop5 A/ |" ?8 Z4 T3 {: q
#include "UDPServer.h"
. X; a5 {! N5 T! q, H: N5 b#pragma package(smart_init)6 j: K5 \' P; F+ d. k
#pragma resource "*.dfm"
! o. q( `7 D, H" Z% wTPSTNForm *PSTNForm;3 |. c7 u" y4 @  o
TListenThread *pThread=0;
$ ]/ a# u- b7 d: O& |//******************************CLASS TCommunication For TCP****************************************************! y0 C3 X4 T1 m
__fastcall TCommunication::TCommunication(SOCKET m_Socket,bool CreateSuspended):TThread(FALSE)- h) Z; ]4 u0 B3 P# h
{
& A8 R# ^0 k8 c' U7 n1 s7 [% @( A  q   m_AcceptSocket=m_Socket;4 [' M- ?( t& r- r: C3 C) }4 I8 L* z
   szTmp[0]='\0';1 ~# h! C2 X$ ?4 ?1 U0 O+ P1 z
   FreeOnTerminate=true;
$ Q5 L9 A7 i. A! E}
) @. b& }4 S, m__fastcall TCommunication::~TCommunication()6 j; r! n9 P  v0 t
{
4 b' D5 q7 \8 q  // closesocket(m_AcceptSocket);
7 d4 o' W' a6 i1 g1 `}
# N! q* k8 V! f, ?0 gvoid __fastcall TCommunication::Execute()
& v3 ]$ K: ]9 {6 ]( |{
- \0 A3 F0 B  B0 J3 W- S   char buf[4096];( q. i6 {7 W; G! ]+ {, D! x7 Z
   int nSize=0;
2 S+ _: y* _5 [   nSize=recv(m_AcceptSocket,(char FAR*)buf,4096,0);5 ^* I) D1 f- A# S
   if(nSize>0)
' r5 I5 w! j2 D# O3 O' S   {/ {5 S( B0 O9 o+ C$ \
      buf[nSize]='\0';8 j3 t3 R% K* ?8 k
      //Display, r6 }: {5 j" J6 H! x
      PSTNForm->Memo1->Lines->Add("Received Length:"+String(nSize));! A, u; U+ u) G
      PSTNForm->Memo1->Lines->Add("Received:"+StrPas(buf));" q# H( P3 F- y7 f7 i9 o& s  a
      //Deliver1 O& z% }% i/ s' p2 g
      ::Sleep(100);% P- d. w# F& M) C* p
      send(m_AcceptSocket,buf,nSize,0);8 ~& m6 g* p8 \( l
   }) ], L* y! a' @- `1 I! D6 H$ D9 h5 b

; |4 |4 Q! y) I/ Q, W}
/ t  `9 ^3 t& g* M9 n- n0 e//******************************CLASS TListenThread*****************************************************
6 ]9 c* }4 u# V% r% |. V, N5 Y__fastcall TListenThread::TListenThread(PROTO m_ProtocolA,UINT m_PortA,bool CreateSuspended):TThread(FALSE)
- t7 T: S; ~, O{( Z9 Q, O; _! c* N9 j
   m_Socket=INVALID_SOCKET;
' M" X: ~: t. ?   m_Port=m_PortA;- [8 I2 m) |* r# X, ]
   m_Protocol=m_ProtocolA;, I" D" E9 T+ |1 a
   szTmp[0]='\0';- I8 d( b0 A! v5 E; Z8 _6 l- @$ F5 L
   ::ZeroMemory(&wsaData,sizeof(WSAData));
- P% a0 ^0 e: y. t0 @   ::ZeroMemory(&server,sizeof(struct sockaddr_in));
0 O' A4 w) l) o$ {   FreeOnTerminate=TRUE;//Automatically delete while terminating.& `/ y9 f6 p7 M/ Y5 G6 }
}# h6 g! F2 b6 E0 K5 R& u% ]
__fastcall TListenThread::~TListenThread()0 t7 J& C$ n; I: m
{# i8 n/ g9 P& J* c% Z5 L2 r$ ]$ e9 p
   closesocket(m_Socket);; s2 a7 u' g! b! P! O
   ::WSACleanup();! ^8 j$ r7 H( i. `3 W
   m_Socket=INVALID_SOCKET;6 k4 z1 S5 f" [7 Z
   m_Port=0;
, d- V* L- j4 w: C$ U' {   m_Protocol=TCP;7 Y' ]' w: ]# Z
   szTmp[0]='\0';
" R0 s/ ?& \' P9 Y1 ?4 `$ ^   ::ZeroMemory(&wsaData,sizeof(WSAData));
3 U& Y6 Q( l- a% C$ C" Z" x   ::ZeroMemory(&server,sizeof(struct sockaddr_in));
1 V2 q4 T/ ]( n, W/ z% i}) |9 m: s  I9 B
void __fastcall TListenThread:oError()$ X0 z% a$ \3 L7 G; ]$ h
{
' a/ @0 E% j  h1 {   if(m_Socket!=INVALID_SOCKET) closesocket(m_Socket);
9 x: H" O! P' B- a5 N   WSACleanup();1 t9 k6 T& S( L0 X( h0 M4 |
   return;% k  a- T8 e: m( B3 H
}" l3 P5 l. G5 r$ r; H- M
void __fastcall TListenThread::InitSocket()
. i4 x8 I  z: \; j; u{
) @, I2 _  m/ G$ p6 }# E2 H* R   WORD version=MAKEWORD(2,0);' e& T0 o: V) @
   if(::WSAStartup(version,&wsaData)){  A+ V8 w& V# p  a3 F7 T" Q( U/ C
      sprintf(szTmp,"Failed to intiailize socket,error no:%d",::WSAGetLastError());
3 ^, b4 L" F/ m; l/ @5 U      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);
, Y! D5 o, {% ]- C- ~: ^      DoError();; p1 v4 P" A- t- ]% Y
      return;2 p4 u- P: C% g  O& X
   }; `# Y$ ~8 t! E/ m
}
3 B( l0 o) E: n/ O4 m2 C" M/ ?void __fastcall TListenThread::CreateListenSocket()6 ?& G* Z( \  `
{
2 w9 R( {/ d# v/ B   switch(m_Protocol)- y' P/ ]6 Z+ J1 C2 ]6 H& o
   {# w. }5 S/ S9 K
      case UDP:6 @$ e: f" w- `2 p
         m_Socket=socket(AF_INET,SOCK_DGRAM,0);; y& q5 _- q9 s5 O. `( h" `
         break;
& |' {" B' I* f/ y$ ~      case TCP:! r- A% W* Z6 s$ K  e/ h: k3 A
         m_Socket=socket(AF_INET,SOCK_STREAM,0);
) _; h- s7 p, f1 `( s* {         break;
3 P+ E' v/ L! u: F9 e; V      default:
* f/ _+ B9 K, X& r  U6 K& s         sprintf(szTmp,"Error protocol!");
6 M9 [6 e9 R" ^9 a6 V         ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);" I/ @: [: |1 H! r4 i- A
         DoError();
: @; d' M+ D! K         break;) q$ ?& U) J# H# L
   }6 e# U! M; P4 n9 c$ s) p1 C' l
   if(m_Socket==INVALID_SOCKET){
# Y% E# G2 ?- d, c7 V      sprintf(szTmp,"Failed to create socket!");
( f* j( K; u0 [  \' b) C. m, {" B. u      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);8 ?  u% g( w9 }9 [
      DoError();5 x5 v, x5 W2 P/ U+ j+ J1 D1 r
      return;+ ?% w% c! C  |( `4 N8 _
   }
$ F+ T: R% y) U2 e9 O}- g9 m) I+ k4 C0 M
void __fastcall TListenThread::SetListenSocket()  D" t% L( |( L
{
- s! H  P5 I6 Y2 y5 L6 u   server.sin_family=AF_INET;
; z0 K9 S& E  u5 l$ w   server.sin_port=htons(m_Port);  v' r; t5 E* b: t3 B
   server.sin_addr.S_un.S_addr=INADDR_ANY;
; H/ {2 z, G/ X' J9 X   int NewOpenType=SO_SYNCHRONOUS_NONALERT;
' f9 o& b4 [/ R8 ~* Q* L   if(setsockopt(INVALID_SOCKET,SOL_SOCKET,SO_OPENTYPE,(char*)&NewOpenType,4)){1 J& [- [% Q2 b6 m% y) I% \8 t! T
      sprintf(szTmp,"Set socket option error,error no:%d",::WSAGetLastError());
' X) }7 N2 t" p6 F. B$ D+ b% G      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);$ N1 ]% v4 d0 s" {: L
      DoError();
1 R: G3 }" d6 i/ k' s3 h- x      return;
2 P% Y# {# t: c& a  `7 Q   }
9 E" @( @* }2 I}# G6 v) S! ^/ p0 S7 A
void __fastcall TListenThread::BindListenSocket()
/ w0 t1 `+ ]+ y' H9 E4 O% X{
* J; g. E0 _3 c% p$ ~    if(bind(m_Socket,(sockaddr*)&server,sizeof(struct sockaddr_in))){4 d3 |' h; n. _; q6 N9 \, I
      sprintf(szTmp,"Failed to bind socket,error no:%d",::WSAGetLastError());
6 f1 Y! X& n6 }! z" d      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);# Q, K1 ^9 o- O0 N/ s( `
      DoError();1 b2 R2 M% C: D
      return;7 E0 O; P+ U6 \; v2 l% a
   }& e! O9 X5 O$ H1 b

' u0 n& ?5 f3 f}
. ^- E4 Q$ \- @8 @8 m! hvoid __fastcall TListenThread:istenSocket()) I: p" v7 T  C* K5 k
{
) A7 x+ K( j+ i; W, ?8 f9 I  if(listen(m_Socket,SOMAXCONN)){4 }; Y. a. C) a% ^9 R: ]  Q% `. r
     sprintf(szTmp,"listen error,error no:%d",::WSAGetLastError());
9 L4 q% j8 j2 E     ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);
- A% _7 u5 D% G, [     DoError();
# |% r6 i! `1 a4 C1 ?     return;$ x+ g0 `! a$ ]  c6 a" k8 J
  }( v. ]7 w1 s% d/ N# ?) |( c
  //Determine whether there is any connection
1 N* M4 a4 z4 y- A7 W' J  FD_ZERO(&FDS);' m8 g" _' B- m
  FD_SET(m_Socket,&FDS);
( X: A/ R. D3 l& B- ^}
4 ^( r# E5 W3 e0 Z+ R6 x0 kvoid __fastcall TListenThread::Execute()0 G( J3 Y. M3 v6 W9 H% p- W9 z% b- G
{) a  b' l) Q/ k; W) g6 Y. ?# H
   char buf[4096];1 E8 [5 i6 H8 K: i! f; r$ p3 q! t
   struct sockaddr_in from; //for UDP% g9 g" ^) A* Y7 \8 [- D
   int nLen=sizeof(from),nSize=0;  //for UDP& e7 A0 d, h5 n
   InitSocket();
' |. B. Z/ `8 {9 d1 I" g* h   CreateListenSocket();
: H# E, a, Y9 n   SetListenSocket();
4 w! _8 U; K3 p" f6 n   BindListenSocket();
4 |9 M6 z  l) Q: k   if(m_Protocol==UDP){9 D3 Z- w; d  Y5 o( N
      while(!Terminated){
2 Y: ~* y9 |. p8 u         int nSize=recvfrom(m_Socket,buf,4096,0,(struct sockaddr*)&from,&nLen);% `; f9 Q0 \' H: v' Q
         if(nSize>0){
+ a1 O- h% q( E8 @9 s            buf[nSize]='\0';
, ~# l6 Q' y, l/ ]            PSTNForm->Memo1->Lines->Add("Received Length:"+String(nSize));
- b& m! o4 w) g7 {6 m0 n' j4 `            PSTNForm->Memo1->Lines->Add("Received:"+StrPas(buf));
( h0 C+ V' e1 u/ v            ::Sleep(100);8 H$ j& y) _( w8 H- ]' i- S  N* v
            sendto(m_Socket,buf,nSize,0,(struct sockaddr*)&from,sizeof(struct sockaddr_in));9 o: B5 Y# o6 h
         }1 M4 A. z" m# X- G$ v* U
         else return;
4 b$ {' V7 u) R6 c  _6 b1 n) e5 X; z  [' l# Q
      }/ [, b6 q6 p# J% d' m
   }
1 Y9 Z; c2 g+ V   ListenSocket();0 G' |3 J: J+ t+ Q. Y' q
   struct sockaddr_in client;+ S: z+ T4 c  s
   int nLength=sizeof(struct sockaddr_in);
0 }' a+ G! n2 Y; _8 P1 q" @) {   while(!Terminated){. C! x) F) _, e% z8 K: T" p& ~' {
      int nError=select(1,&FDS,0,0,0);7 U& t  ~8 t7 m
      if(nError<=0) Terminate();
' B% N7 e, H( |0 D- `, o      SOCKET m_AcceptSocket=accept(m_Socket,(struct sockaddr*)&client,&nLength);
- R3 Q3 V6 @: X) y      if(m_AcceptSocket==INVALID_SOCKET){
5 h% w+ K. Z/ q1 J         sprintf(szTmp,"Failed to execute accept,error no:%d",::WSAGetLastError());' i& Z+ t+ v* a6 u- M% u
         ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);
8 Z# f2 z3 T8 C, }) T- N         DoError();
( J! v# `: j+ r% V5 X% O& `- H/ H         Terminate();# [7 ]- J5 R& x2 a9 X1 x
         return;
  Q% n+ X7 T! F7 x! |# N( X4 {! _      }" T4 ~' c6 ]% F7 ^, u6 V
      TCommunication *pCThread=new TCommunication(m_AcceptSocket,FALSE);
( u1 f; w' B% T/ k5 }      pCThread->Terminate();
+ I0 q; I9 e- S$ m  F% Z) b0 t; Q      pCThread->WaitFor();
! ?; f+ q/ b+ F; ~  x+ G1 F$ B3 F   }
- W4 I3 [8 A* H* V; \6 T) B}  o8 u- P! u- R5 }! v& s& w- Z
//************************PSTNForm*********************************************//
" [9 d7 ^' J! k- W- }& Y2 j; B__fastcall TPSTNForm::TPSTNForm(TComponent* Owner)/ J7 c: @2 N, S7 L, O& B
   : TForm(Owner)
" ^! P, R9 D* i8 f! m: l$ @* v{" C2 b5 T* ~5 P
}" t" V3 R" S+ s9 o
void __fastcall TPSTNForm::Button1Click(TObject *Sender)
9 r' v% c( e2 m( y{
: @6 p0 [6 T  n' r   Close();9 i; Z; J2 s' r1 ~7 e3 K; s( B
}
' |  M9 u: S5 b5 K7 V7 d3 Tvoid __fastcall TPSTNForm::Button2Click(TObject *Sender)
0 `# [. r+ @; g) P{
) M- E' i# p  ?   if(pThread){
1 B4 g5 t4 a/ a. R3 Y9 i/ {      pThread->Suspend();
8 ?% d5 u" O# V8 q      pThread->Terminate();6 M$ B$ h: v5 |; Q0 |& M
      delete pThread;6 v5 z6 @' z( ?7 a, Q4 e/ A& L
      pThread=0;
. F' F% u/ m, e9 }/ ^   }+ n! D( j8 N4 \
   UINT m_Port;
' L. t3 g: T: s9 e; O   try
, H# F. v  R5 P! _   {$ D9 z4 Z! c( z/ D* K9 S3 R* Q
      m_Port=Port->Text.ToInt();5 I  y* x; |6 V. e5 x6 b
   }
. n2 c$ \, B3 u: k  R& R   catch(Exception &e)% q; a. O# U3 s
   {
& ?, H! H& I, q/ n  [      ::MessageBox(0,e.Message.c_str(),"Error",MB_OK+MB_ICONERROR);
  W2 A. q4 t" c, m& g      return;4 a5 P: [8 k1 z
   }
% Y2 Y3 Y2 F3 h  e; T   PROTO m_Protocol;8 c7 \' ?* J% q+ p
   switch(Prot->ItemIndex)
! U$ e# b7 v/ o: ~8 ^   {9 g# q6 \7 s( i/ U. T/ D4 V% G1 O
      case 0:
5 }+ c7 Q, A3 }0 V/ e5 K2 [* H         m_Protocol=TCP;
5 i2 e2 P" R  H* i         break;; D3 {! J& x: Z; z1 h$ I+ B
      case 1:
$ f/ x. R9 o$ [! [/ i3 ?0 ^) J         m_Protocol=UDP;
" A7 R& _7 n$ I/ T0 R  g; f         break;
# q7 t% C4 k! U3 C# e# B* `) \      default:
* Z( e1 }$ m4 A( S% w3 m         break;/ ?5 T0 \+ j8 w  B
   }( q3 ?7 T7 ~6 L) |) h/ Z; j
   pThread=new TListenThread(m_Protocol,m_Port,FALSE);4 F3 ~( |9 b" i7 d( t5 N. O" N
   //pThread->Terminate();
1 W7 K5 J/ S* `$ p# D# [* L; ^}6 Y4 r+ a' O+ a! c; d. g- E
void __fastcall TPSTNForm::FormCreate(TObject *Sender)
. d3 z3 ]# L- i4 K) d; J{! b3 Q, p! s6 J' L: N+ S1 ?' p
   ::SendMessage(Prot->Handle,CB_SETCURSEL,0,1);
5 d( ^) K8 H. e% H1 ?: X* v+ g" S}
7 R$ P" l* {! {2 K# o
* y* _9 P0 W' @$ x2 |' C% @void __fastcall TPSTNForm::FormDestroy(TObject *Sender)* }* W3 A' L3 ?$ k; i4 O
{
3 T" _1 _+ \0 n8 j: A  {2 G   if(pThread){  `& |! h1 c& ^2 `$ ^$ T
      pThread->Suspend();
( ^* y" u! F+ v      pThread->Terminate();}- }) w1 m$ E' {
}3 m4 l8 a+ z6 ]+ w( I
上面的代码,各位可根据自已的需要和针对自已的应用,在数据处理方面加以改进就可以了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-10-2 05:00 , Processed in 0.017014 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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