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

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

[复制链接]
发表于 2004-2-15 14:01:13 | 显示全部楼层 |阅读模式
在CB中用socket api来写网络通讯程序; o9 P& }5 s) @( m$ ^! v* d
作者: kingcaiyao ,如转载请保证本文档的完整性,并注明出处。7 W6 q8 b8 N% i  L+ s
欢迎光临 C++ Builder 研究,http://www.ccrun.com/doc/go.asp?id=5692 p; ]$ N5 o) @3 X- p- L! v* t
本文转自csdn,作者:kingcaiyao. s) H: G- Y; q5 N! }1 c
原标题:在C++ Builder中用socket api来写网络通讯程序(同时支持TCP和UDP协议)
% m) [7 i9 h% v) `原文:  http://www.csdn.net/develop/read_article.asp?id=19883
5 V3 u$ @! _' h1 n8 C" e  _! E) _& j5 {7 x& l/ O- Q

( j% N# w! g; U% w* h+ _8 ?; g5 f在7月4日看完sockcomp.pas后,我决定用socket api来写一个客户端和服务器并且同时支持TCP,UDP协议,于是我就去做,现将代码贴出来(已调试通过)
3 y3 w! I$ ~. M) E; v, qSocket api Client:1 ^) L  H6 }/ }9 W: m
3 G: M( }# Q% c# S: r) }
#ifndef UDPClientH5 d" x  d6 f9 Y% D
#define UDPClientH
5 D/ T; l7 Q+ B( M! b( D#include <Classes.hpp>1 I1 W. U/ c4 x. E1 O/ [5 o/ [
#include <Controls.hpp>, M: p/ P6 x# U3 g7 U9 T% q' M1 `
#include <StdCtrls.hpp>! ]( h* v# \1 k/ O! p8 O
#include <Forms.hpp>
1 k$ O! m3 n" {! h$ M#include <stdio.h>
4 O( W0 _3 q+ S6 N' A( b#include "CCEdit.h"$ N0 G% M& {0 ^
#define WM_SOCK WM_USER+100
( S, {  \4 X2 V2 L! d' c, I* eclass TLANForm : public TForm
5 n9 U$ v/ e) I1 [  d" H{
! d. S8 ?6 F/ \- s$ k__published: // IDE-managed Components) B! X/ ~+ M1 \
   TEdit *Port;
! z; D: E# b9 ~! @2 C   TLabel *Label1;8 j# f/ W# F1 |+ e( o0 n; \5 X
   TLabel *Label2;
: A" A8 }2 E& O, @8 H) l+ ]   TComboBox *Prot;
% G& `, @( p) g   TButton *Button1;
' c1 n9 Q' e8 Y  D& G1 z" y   TLabel *Label3;1 |' z4 J. ]5 q  @& @# ~
   TEdit *Addr;/ U" i7 ]" o0 e# A; {! i$ D
   TCCEdit *TxtEdit;0 @6 s8 f/ ~& I8 j
   void __fastcall FormCreate(TObject *Sender);- P* N# |' s5 [9 s! O8 L
   void __fastcall Button1Click(TObject *Sender);+ i7 n0 W% {, D3 }# }; N
   void __fastcall FormDestroy(TObject *Sender);  ~; ?8 E& @# w% J8 ~
private: // User declarations0 I; p* A4 X% c1 t  P" M9 r* z! j( q
   void __fastcall OnRecv(TMessage &Message);
: w- U4 O  v2 M% N5 o' E  M: M- Zpublic:  // User declarations
: G; P! U# h9 ~* V& V7 k/ {9 u   __fastcall TLANForm(TComponent* Owner);
! ^1 M+ y; d; _$ {: x' G+ z. X   BEGIN_MESSAGE_MAP" k1 S. S% |9 p' f1 u4 Q
      VCL_MESSAGE_HANDLER(WM_SOCK,TMessage,OnRecv);- ^( K  v; R0 X6 ^! E
   END_MESSAGE_MAP(TForm);  s7 S- u8 d( @3 D7 ]8 h9 l
};
$ b5 R! r! x# B) d  t- j7 L8 wextern PACKAGE TLANForm *LANForm;
7 \9 ^2 {& g$ O1 f% p4 v+ H#endif+ C" F+ y2 N/ ~% E! ?0 ^

" g! `" `+ I3 H" Z: \: S! E' j0 f2 ~) q; P9 T, R
.cpp File! D6 |1 y3 k, \& z/ A! |1 }; Q  ~
9 h, u4 D- P( F& C
#include <vcl.h>$ Z: C7 }# n/ S+ ]1 x
#pragma hdrstop: ?, L$ R, k# C3 Q+ _
#include "UDPClient.h"! Y' f# w2 k8 g. [6 O, b2 _
#include "WinSock.h"
+ }0 d: Y% M8 n% \2 d, {3 n#pragma package(smart_init)
! m. F$ i( ?5 [' V: n, ?, P) {#pragma link "CCEdit"" u2 |5 g9 |. i% p4 {$ X
#pragma resource "*.dfm"& R4 L4 B. o4 {# b# A* J% \+ w7 W
TLANForm *LANForm;$ o6 i' P0 a2 a1 r. S
enum PROTO {TCP=0,UDP=1};
9 J; P/ a9 J3 Y" s7 }3 v; D0 C* ^$ ESOCKET m_Socket=INVALID_SOCKET;
3 I& O* b9 M5 H  X0 g- kPROTO m_Protocol=TCP;, m% m& ]! D+ [" ^
__fastcall TLANForm::TLANForm(TComponent* Owner)
8 ?' z% P  @' C   : TForm(Owner)
) x4 T7 s: \# E9 h1 l, y{
! k. \( H5 d+ O( j/ D0 E# O
: q5 B& O9 ^4 U' d0 c7 u}; h$ e% |( W% D: A8 [
void __fastcall TLANForm::FormCreate(TObject *Sender)
& i) A& F8 N7 k; {. O{
  @! t' u6 j2 i7 [   ::SendMessage(Prot->Handle,CB_SETCURSEL,0,0);
9 E. ~8 ~+ e* }. s9 D. R}1 d6 Y  ?; ]2 b
void __fastcall TLANForm::OnRecv(TMessage &Message)
/ A4 D" Y/ E1 W9 C8 n$ O{
3 U2 P. X$ N: o; W: U+ O   char buf[4096];: T3 k; V; H; X$ i' E
   int nLen;
& u; n( u7 M, R: H( a1 U( C* ~   struct sockaddr_in from;! }5 U1 o8 B8 C1 Q
   int nLength=sizeof(struct sockaddr_in);: R% F+ C3 `6 _* P+ i% C- F! e% W
   switch(WSAGETSELECTEVENT(Message.LParam))
/ ^$ B3 Z% ~" d1 X- ?   {
# `/ V; j# u. G- j3 o4 B+ y      case FD_READ:3 v1 M9 k, i6 {& @1 R6 H
         switch(m_Protocol)6 S' K4 \  v2 A. T1 x
         {
3 ?4 l' q3 f4 b4 r. K            case TCP:
- c) J- b7 O, H; v) K' O$ i& g               nLen=recv(m_Socket,buf,4096,0);
3 ]$ j6 ~& n8 f4 p               if(nLen>0){. G, b5 U, u6 T: k- p7 H
                  buf[nLen]='\0';
( G5 y  G! j, K9 d. v" f                  TxtEdit->Text="Received Length:"+String(nLen)+"\r\n"+StrPas(buf);
( _8 l. c  B4 g8 ], Z& o5 q, X# e               }+ e& k8 K, t1 \% P0 Z3 c- r/ F
               break;
5 U/ f9 g6 s* s1 H9 w            case UDP:( _" F! c) n4 `3 H& ^! t
               nLen=recvfrom(m_Socket,buf,4096,0,(struct sockaddr*)&from,&nLength);( T$ ~0 {* q5 d* Y) n$ R+ a
               if(nLen>0){& u5 ~) U) M' g2 R3 O
                  buf[nLen]='\0';: V! e& v4 ^+ C. P
                  TxtEdit->Text="Received Length:"+String(nLen)+"\r\n"+StrPas(buf);
* l& R1 d7 A6 B! [  F6 o. ]$ `) R  C               }1 P7 E1 H/ F' C/ Q9 }+ V
               break;
, U9 _& D7 f1 V* ?         }
( g8 i7 |) a4 n2 E         break;  T) _9 X9 L. j$ R: I
      case FD_CLOSE:
0 n1 m# _, p& z4 }         closesocket(m_Socket);
8 |9 s8 L0 U4 V         break;
1 Y$ h  H  X& ^" b   }9 z6 w& z3 j" }7 u5 m  u3 ~
}& K  u+ [7 T5 G

/ [! `: m  j6 ~2 S( Uvoid __fastcall TLANForm::Button1Click(TObject *Sender)
- I! C' m, g8 ^7 |. e" `{& G& f- v  D, V' q
   char szTmp[256],buf[4096];" e, f6 a! j3 I# d! T' b
   int nSize=0;
- ?! j% c& O8 Z0 \2 v   UINT m_Port;" j! ?3 p0 F) ]! L: F
   AnsiString addr;4 E, }3 \( J# S, ]* O- B: }# g
   addr=Addr->Text.Trim();& V5 q' T1 G$ R. p' O
   if(addr.IsEmpty()){
) k4 _. n9 r1 f. o( P7 c$ |# M      ::MessageBox(0,"lease enter the server IP!","Error",MB_OK+MB_ICONERROR);
9 P. p/ d6 C2 }2 ]) m      return;& y+ c& O6 t! v& j
   }- t, c9 C. |& h' B& e
   unsigned long nAddr=inet_addr(addr.c_str());
3 z7 G5 ^) P1 ?# Z; }# Z' ?6 C   if(nAddr==INADDR_NONE){  J  L1 p$ M' L
      ::MessageBox(0,"Bad Internet IP!","Error",MB_OK+MB_ICONERROR);' x5 x* h8 i1 y8 w
      return;}
, `0 i* v$ }3 ?$ Y5 v% K8 I% ]# M0 _% @, b$ _1 T, ~- X. K
   try
1 D0 Z; V6 c2 Y7 g4 M   {
) W0 q) X8 E- C3 Q0 i) B, P      m_Port=Port->Text.ToInt();  {+ X; l" g( C9 R/ h' Z" Z
   }
" Z) p" f+ ~2 O+ f   catch(Exception &e)
2 v( x5 ~2 ~% q/ k0 N: y   {  g1 z9 O) }. q, M! I/ f
      ::MessageBox(0,e.Message.c_str(),"Error",MB_OK+MB_ICONERROR);7 E: ?  A4 S  k% \
      return;6 u" ?6 P% _& A& F, Z5 D
   }
4 X0 L7 Y& [) a   switch(Prot->ItemIndex): b9 W# k: m1 A1 ]( w
   {
8 S$ l2 ]# X/ H6 u) W      case 0:/ M# Q' g6 v4 y7 i5 E9 D
         m_Protocol=TCP;
9 U0 l6 Z3 Y) U% m" T5 k5 j         break;
; E# I4 C1 I  [% ~0 J% x, r      case 1:8 @% Z- M# x, l: B4 g1 {
         m_Protocol=UDP;
5 {6 O1 C2 z) R+ Y! l3 d         break;
" J# L. m, R1 p/ \8 ]. D+ g" n   }+ |; w& U* a8 d
   if(TxtEdit->Text.IsEmpty()){
1 Q: E# e0 U) k: x      ::MessageBox(0,"lease enter the text you want to send!","Error",MB_OK+MB_ICONERROR);0 S" p& u' q8 J5 k& O. ?
      return;}
5 c/ R$ A  i8 Z) L; E! ?
5 i# c; k2 g! L7 |! D   //Initialize Winsocket+ K* |/ K( S+ P8 z2 G8 \
   WSAData wsaData;
& o/ \1 M2 Z: N) g5 d4 c) S1 `   ::ZeroMemory(&wsaData,sizeof(WSAData));. c  |/ o9 w0 u" a% }1 n/ Q
   WORD version=MAKEWORD(2,0);* A& Z" D5 ~, J6 ]
   if(::WSAStartup(version,&wsaData)){# K& C4 Y% g* t/ r2 ~* U
      sprintf(szTmp,"Failed to initial winsock enviroment!,error no:%d",::WSAGetLastError());, \# E& @" z0 F- n4 x0 `+ N
      return;}- u& ^- F3 B/ }8 ~
% c% R7 _3 ?8 u* |* G- {( q
   //Obtain the active connection
" n2 l7 i5 E2 }5 g   char ComputerName[255];
0 ]# Y( c6 _- J   gethostname(ComputerName,255);7 V  m- M  e- U% d) L. O. |
   struct hostent* he=gethostbyname(ComputerName);
% b: d6 K& C& g( Z- ?/ [! }# s( H   if(!he){$ E. x2 Y$ A8 d# D
      sprintf(szTmp,"Failed to get information to host!","Error",MB_OK+MB_ICONERROR);* ?  w$ d% E9 r& x
      ::WSACleanup();
. A  j  r( P7 j/ M% G/ H$ m      return;
* \: ]0 A+ s, ?8 A) h   }
  [3 A5 b9 f* h4 g$ b9 [4 `( G   //create new socket7 D/ j" G% k4 p; q4 v
   m_Socket=INVALID_SOCKET;# }* _3 q" \1 ]3 E
   switch(m_Protocol)
$ B# W5 ]/ W8 t   {; }3 t: g7 `- G! B5 W
      case TCP:$ E8 K- M7 n3 W9 ~) M8 `0 V/ |  N& o
         m_Socket=socket(AF_INET,SOCK_STREAM,0);5 w: c5 ~- H7 Z' g
         break;+ u* `' H' D0 X: V
      case UDP:
# |3 p9 C2 @5 A6 k& l3 D         m_Socket=socket(AF_INET,SOCK_DGRAM,0);( o$ _, o( n: X% v6 z8 I5 q0 v' L
         break;
: b# n2 F9 ]. w   }
0 B) _" f, c- J* r+ _   if(m_Socket==INVALID_SOCKET){
: i+ W) |& N& O' I      sprintf(szTmp,"Failed to create a new socket!,error no:%d",::WSAGetLastError());
' z0 k. D( I9 h      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);
9 N- ]% K1 x+ s7 T7 U* g! G      ::WSACleanup();0 p- F. Z! N! ^
      return;! k* u% v2 s% m) [% c& I4 C
   }
6 A. g8 }2 K, h7 Y' u- u2 H3 X( B   //bind socket
3 {# Q! G/ W( {8 D   struct sockaddr_in client;# X$ v6 A2 n$ d, q# |( W4 s4 x1 U
   unsigned long nClient;2 d# v! I! {5 n7 Q" w% w7 j
   memcpy(&nClient,he->h_addr_list[0],sizeof(int));! S5 C2 n3 u# c! E; |
   if(nClient==INADDR_NONE){
/ s3 Z" E" p0 I# H      sprintf(szTmp,"Failed to obtain the local machine's IP!","Error",MB_OK+MB_ICONERROR);" T7 \% g# W5 P; e& E
      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);
2 H+ @) |% ^# O6 ]# }  Y. s      closesocket(m_Socket);  P8 L' s6 u6 v0 @
      ::WSACleanup();" c9 S; b# I0 [( n
      return;
. y; M8 V( C" b9 G  W  U, c  o   }6 R' S# U4 C3 Y. `
   client.sin_family=AF_INET;$ h) a+ H: U. t: ^. l! ]
   client.sin_port=0;  O: m( a- v' X3 I  g
   client.sin_addr.S_un.S_addr=(int)nClient;
, u5 l1 j- O/ \" l* Q2 z   if(bind(m_Socket,(struct sockaddr*)&client,sizeof(struct sockaddr))){# H4 P5 T6 `& E5 l
      sprintf(szTmp,"Failed to bind socket!","Error",MB_OK+MB_ICONERROR);
1 V* y6 K, K* \0 \0 W) q- [% [      closesocket(m_Socket);
6 t! k: }6 u! i( Q! R      ::WSACleanup();) p; A  F( l1 r7 m
      return;}) n0 C4 A" J% V" |/ B
   //connect socket  c( g- C" |9 x7 Q, [4 R
   struct sockaddr_in To;/ P  Z& h3 M5 X% }
   To.sin_family=AF_INET;; k  I- g8 P7 j# k( b
   To.sin_port=htons(m_Port);
7 b7 W. c, Z: x   To.sin_addr.S_un.S_addr=(int)nAddr;
- S' I# [6 C- E8 |" d+ z) x: A   fd_set FDSET;
& V5 ?' n2 F, M0 j6 J8 i: H2 ]   FD_ZERO(&FDSET);# w# p, P9 H6 S8 V" V9 ]
   FD_SET(m_Socket,&FDSET);$ X) P) A9 W& f6 n) y& K% K

$ O. ^2 z* L4 l+ x! J3 m& U' C* @; Z; H1 ~- z/ n
   if(m_Protocol==TCP){
, W1 U2 D$ q& Z9 R      if(connect(m_Socket,(struct sockaddr*)&To,sizeof(struct sockaddr))){# P( A' A+ X) Z. S) E% T: N+ y) T2 ~
         sprintf(szTmp,"Failed to connect the object!,error no:%d",::WSAGetLastError());
0 L5 H. }) L9 m         ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);) h9 ~  z* r/ }
         closesocket(m_Socket);5 B% n0 J: r. u8 _
         ::WSACleanup();
+ V& L( T/ d0 @9 x( y         return;' r4 e" a$ ^6 B) i2 ]" ~
      }9 ]5 B( r0 y0 j0 @: y
      int nError=select(1,0,&FDSET,0,0);
% O, Q5 ~% G% @8 b3 n: f! ^      if(nError<=0){
" x) V1 x" O+ z; ?4 k      sprintf(szTmp,"Failed to select socket!,error no:%d",::WSAGetLastError());' x- o- {" ?7 n* d* i- j
      closesocket(m_Socket);
* e) u# I8 c6 ?7 A      ::WSACleanup();  H" g3 D0 `  e! _6 }8 g
      return;}1 X8 S& e% p  b" h- ?
   }
0 g( Z0 J+ O  h$ r" C   //Send data( r1 X- x1 o; H2 W2 @
   int nLen=TxtEdit->Text.Length();5 D% N, V1 w" `7 p9 k; p6 e0 K
   if(nLen>4096){
* j/ E1 z% `6 w, ]      sprintf(szTmp,"The buffer is too size to send,it shoud not be more than 4096 bytes!");
- ^: }* Y5 K  B6 m' i: U' B# E1 n      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);  u: z& }! h) g- W& F9 @  O: T0 ]
      closesocket(m_Socket);
, Z* [3 I9 D$ P1 |      ::WSACleanup();7 B3 W: K7 C2 E
      return;/ ^5 ]3 S2 [' L2 L: t4 A: L
   }! e, C( B) I8 {  t& f0 {( w/ b
   strncpy(buf,TxtEdit->Text.c_str(),nLen);
" C- g' S7 E: v" L/ Z8 \/ [   switch(m_Protocol)
: q  D: R; t! a' W; I+ [6 T; P   {
; B) V( {* C# e7 Z      case TCP:
% i' o9 y% z& n; w& v9 h, s- g         nSize=send(m_Socket,buf,nLen,0);
  t; a6 j; P* q& j0 m         //ShowMessage(nSize);- ]( Y+ x$ z- _2 }; c
         break;# Z0 u2 K7 k( W+ [% L
      case UDP:" K# r+ f% n, @! X
         nSize=sendto(m_Socket,buf,nLen,0,(struct sockaddr*)&To,sizeof(struct sockaddr));
5 G2 o1 I# l; P         //ShowMessage(nSize);
9 s2 x0 {- I/ y, Q         break;, u( G3 e; s; d0 C* ?. p. J
( ?" o7 @9 m6 G! u5 S" Y
   }
3 H6 \( H% e7 [- t5 \5 L   if(::WSAAsyncSelect(m_Socket,Handle,WM_SOCK,FD_READ|FD_CLOSE)){
* u5 {) k- V; d! Q0 g      sprintf(szTmp,"Failed to register socket event!,error no:%d",::WSAGetLastError());
9 |  l% O# @; W5 z# D      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);$ N! h# ^6 v; e8 k4 W
      closesocket(m_Socket);" j) P& I& C0 k) M
      ::WSACleanup();
: o* K/ ?; K$ S$ P6 s1 p      return;}8 N; z1 B# F$ J4 d8 G+ t
}
0 X, }  f( w: @void __fastcall TLANForm::FormDestroy(TObject *Sender)
6 Y: y8 K/ V0 c9 q4 M{
4 B4 i; ^2 X' h. p  h: [# Z( w   closesocket(m_Socket);6 l# e- i& f9 G) x' e
   ::WSACleanup();5 X2 ]5 h* Z9 J7 @$ t; V
}
% [; M3 `$ B* ]% ~( {4 o$ J* R" R3 W. |" ]8 E- u4 [, c/ K
Socket api Server:3 o& f/ D$ \9 W0 b, F
.h File8 W/ ]3 d/ W7 u! @
#ifndef UDPServerH
" E& [3 p. H' Z5 p#define UDPServerH1 \1 o2 k5 g3 x+ `
#include <Classes.hpp>, I& L% t, C1 w; k" {1 ?
#include <Controls.hpp>5 j. l: y1 j8 O4 }( }$ l
#include <StdCtrls.hpp>
9 R' a* K' S9 E' e' L6 c& Z#include <Forms.hpp>' P) L: v3 @: O/ s
#include <stdio.h>
/ W" _0 p" E$ h7 R1 p. U" z#include "WinSock.h"
& D& [+ g8 h" |7 I2 X: C8 `# p/*#define WM_SOCKET WM_USER+1000
- E2 W" q: r3 M4 t9 Y#define INITSOCKETSUCCESS 0& S" c; T& i* l1 n1 q# F
#define INITSOCKETFAILURE 1
' R* A4 r* c. c& Z2 T5 E+ Y1 e#define CREATELISTENSOCKETSUCCESS 2+ O. w% \  |$ `  m
#define CREATELISTENSOCKETFAILURE 3
1 F) \+ u! z9 n#define SETLISTENSOCKETSUCCESS 4
7 o0 U$ m5 R* p4 V" R#define SETLISTENSOCKETFAILURE 53 C5 C; g1 F1 v. b8 z9 T
#define BINDLISTENSOCKETSUCCESS 6( t/ J8 I! `. N& I8 U, }) s& \6 W6 }
#define BINDLISTENSOCKETFAILURE 7
' l+ i' j; n7 W, T1 @) t4 F% o' U8 q% |#define LISTENSOCKETSUCCESS 87 {, k7 _( q$ Z/ }
#define LISTENSOCKETFAILURE 9
( j3 M' `& n# a1 s7 [#define ACCEPTSOCKETSUCCESS 10' U# z: l4 U( b( F$ E: `
#define ACCEPTSOCKETFAILURE 118 Q+ I' Q- x* ~# }% R
*/( E, ~4 m7 y0 \: l: z
class TPSTNForm : public TForm& P+ Y- r% I3 f4 x7 M
{* }6 ^. f% g7 o+ g2 k  m
__published: // IDE-managed Components) @4 Q0 M5 r6 {& \: T
   TEdit *Port;! Z& u' S9 @  y, I) N
   TLabel *Label1;8 |* ^' H- g, w
   TMemo *Memo1;+ O9 r2 p& q. [
   TButton *Button1;9 O: W" u6 ]) L
   TButton *Button2;
: t/ e! z9 k( I5 ~, V. }" V9 Z% f   TLabel *Label2;
( N$ L& L  Z! {& g   TComboBox *Prot;
: |" P! Y9 \0 W. s   void __fastcall Button1Click(TObject *Sender);  e7 X  Q: Y" `- h0 T/ B8 b: ^
   void __fastcall Button2Click(TObject *Sender);$ `4 `! ~" d# @/ p+ E
   void __fastcall FormCreate(TObject *Sender);. v8 a. h8 G' h2 T
   void __fastcall FormDestroy(TObject *Sender);4 D5 i& @2 J0 P* @' {& E& f4 q# M, c4 g
private: // User declarations
2 q8 v; V7 I  h: rpublic:  // User declarations* M' D: f# Z* C0 |2 v! h2 g& @
   __fastcall TPSTNForm(TComponent* Owner);
- @9 X$ J  r9 B7 H& d3 {) q& _};
8 n( j) @+ `0 v$ \4 n  Aenum PROTO {TCP,UDP};8 L6 [' v& n2 A
class TCommunication:public TThread    //Communication Thread0 r5 [5 q* D1 a2 c9 S6 s/ }
{
% Y/ a. h3 u+ lprivate:) ^* a# q# V, V* ]9 _1 g
   SOCKET m_AcceptSocket;
  u: u8 x& ~* q- b   char szTmp[256];//ERROR MESSAGE
1 k: L9 M1 w. |" o! y+ @public:& o- g6 V9 {0 }7 B/ ?9 |6 d) m" z
   __fastcall TCommunication(SOCKET m_Socket,bool CreateSuspended);& Y% a7 N% p  x% O+ L: F
   __fastcall ~TCommunication();/ R9 y. x% ~5 a: w  j" _
protected:
0 m3 f2 D( s9 r0 n: s   virtual void __fastcall Execute();4 L0 U( F: V! Z4 @: L, |
};7 P5 _' @" [" {
class TListenThread:public TThread //Listen Thread
  J8 W. v  y2 [{
5 Z! X. T/ }4 \* x! H0 A3 W" Uprivate:
5 B) t! v% m' [" Q. o3 Q  V9 H' f/ `   WSAData wsaData;
( D* v' Y! e7 f7 `: V1 [   struct sockaddr_in server;
/ l# i. Y/ L8 Q6 u2 J$ v' K   fd_set FDS;
2 W& U! Z- X7 A   UINT m_Port;
4 P, x( j$ R0 t3 O: |   PROTO m_Protocol;: i2 q7 C6 w  x! t% g
   char szTmp[256];//Error Message
  ]: ?' p5 ~) w2 r( j7 Kpublic:
) X/ r8 R  u$ t; R5 f4 P* h( q   SOCKET m_Socket;
- |1 k& u- F$ T" @/ H" |5 `0 O   void __fastcall DoError();
( v. s& u  z8 Q2 [$ D3 P   void __fastcall InitSocket();0 Y- P- h7 ^. s( W$ h/ G. W
   void __fastcall CreateListenSocket();5 R% d- K3 j% k1 {9 r) y
   void __fastcall SetListenSocket();
% `  h, |, A7 ?   void __fastcall BindListenSocket();
+ D. ^. [& Y- m/ ]. K- f- y   void __fastcall ListenSocket();  d* b. J0 g2 G

; V$ I! R9 O, o+ \public:" ~& f! b! G; _( m! s+ I) V
   __fastcall TListenThread(PROTO m_ProtocolA,UINT m_PortA,bool CreateSuspended);* ]% {* A' s- f
   virtual __fastcall ~TListenThread();1 u+ P- z5 J- T! k- N+ }: B
protected:2 k& y( d2 p& s  p' o
   virtual void __fastcall Execute();. P$ N& s" o: [+ E% D  K3 b8 R
};
8 ]9 |7 _& E' R& f( Aextern PACKAGE TPSTNForm *PSTNForm;6 A  |; L4 B/ G' T, I; ^( L
#endif1 V0 \* q7 |4 }! y! I' |
.cpp File* V6 t0 L* V2 x5 N7 W
#include <vcl.h>
: z8 O, A8 p# a! V0 K6 X& V0 [5 z8 |#pragma hdrstop( q& W3 o5 N# E( d
#include "UDPServer.h"
! Z' G% j& a4 |$ e#pragma package(smart_init)0 d- R, [3 i) p" E
#pragma resource "*.dfm"
6 y; c. q% s; |3 m$ P5 gTPSTNForm *PSTNForm;
0 M( n' Z% H5 F$ oTListenThread *pThread=0;: D: J* P5 y) `9 B
//******************************CLASS TCommunication For TCP****************************************************$ P* T4 }- s, Z( U6 \0 @0 n8 o0 \7 W
__fastcall TCommunication::TCommunication(SOCKET m_Socket,bool CreateSuspended):TThread(FALSE); W/ S8 H* Z0 c& C9 Y) t, s) Q
{
$ }% T6 N( w8 r* r# w& j' V/ C   m_AcceptSocket=m_Socket;
0 l3 J$ I- j& u/ `# d& Y% p+ \   szTmp[0]='\0';
; ]; ^# U2 ^8 Z6 M, ~   FreeOnTerminate=true;& b1 T0 k% m) t4 R) T1 z
}' P8 T' f2 _# K/ |- o& x
__fastcall TCommunication::~TCommunication()
. ^8 o5 Q( o+ l: a9 Q. b  C{9 c7 }! T6 ^3 _) A2 N
  // closesocket(m_AcceptSocket);" `$ q3 M# ^9 O6 S3 s* T8 f
}
* D  ?; ^8 f# L2 b: `void __fastcall TCommunication::Execute()9 m" |+ L$ b7 f5 P: L
{8 [, Z( C, b2 H6 K7 H9 `2 A! Y
   char buf[4096];
4 e1 F8 n. Q7 L. w& k   int nSize=0;8 G$ v# c7 t& k" D
   nSize=recv(m_AcceptSocket,(char FAR*)buf,4096,0);
# T- R* N7 P; r* n9 q   if(nSize>0)7 d" h# ^  w/ {' C* A2 W- p4 ?' V
   {- V' ?1 p: |3 h$ a- {1 J! q* _* P
      buf[nSize]='\0';
' K5 P, R+ J+ J# L  q$ R0 T4 |8 p      //Display8 D# o! M: @' m1 C; Q3 k$ `
      PSTNForm->Memo1->Lines->Add("Received Length:"+String(nSize));$ \& l; x( C- O/ U& i7 E
      PSTNForm->Memo1->Lines->Add("Received:"+StrPas(buf));
" J; o0 _) X: I4 r7 B, O5 k      //Deliver
) N- j  f5 R/ A2 ?0 E      ::Sleep(100);) }, J5 ]4 a) E- u4 ]1 Y
      send(m_AcceptSocket,buf,nSize,0);
7 }% c9 a! F; f" c   }/ B8 l/ K& ~& \" i2 u( e# Q% l
0 v( t4 K' C0 _5 A' v
}: L( Z2 U  @* J3 ^$ M5 _( j1 K4 ~
//******************************CLASS TListenThread*****************************************************
4 G2 A! U9 e* H) f5 g4 s4 i__fastcall TListenThread::TListenThread(PROTO m_ProtocolA,UINT m_PortA,bool CreateSuspended):TThread(FALSE)4 x" }0 T7 I! j3 r, x, d$ z
{
0 ]- f1 `$ |3 a# @( j   m_Socket=INVALID_SOCKET;% y4 C6 k4 k5 J% t' V5 u$ v
   m_Port=m_PortA;! ~' G4 R" D" P& W8 D0 `2 @
   m_Protocol=m_ProtocolA;
0 X+ x& x6 G9 e6 q) j   szTmp[0]='\0';: _0 Y7 S  {! ^, j! X. C2 `& y
   ::ZeroMemory(&wsaData,sizeof(WSAData));
  H8 n5 d/ s# C   ::ZeroMemory(&server,sizeof(struct sockaddr_in));9 Q, M" A- r* ?( O
   FreeOnTerminate=TRUE;//Automatically delete while terminating.
$ c* R, j7 h& l, N+ _4 E! {) q5 _}
9 D$ ^. P5 l' n( b__fastcall TListenThread::~TListenThread()
% D7 @4 ?6 F% |6 W4 t+ d" m3 a{) \$ i9 S9 S, }' |9 T$ p
   closesocket(m_Socket);) N" o3 Q& _6 M8 ?4 c
   ::WSACleanup();
9 p, `7 b$ j' T/ R& s   m_Socket=INVALID_SOCKET;" Q4 z* b) `; _2 J, v
   m_Port=0;
# O% w2 x  w& r8 x  V% I   m_Protocol=TCP;
% o: J  d" t7 J   szTmp[0]='\0';7 p2 m/ }# M; C
   ::ZeroMemory(&wsaData,sizeof(WSAData));. f* F* L0 R4 k( Y) ~0 Q" N5 O
   ::ZeroMemory(&server,sizeof(struct sockaddr_in));
4 B1 J  N6 @- t, D# x2 n}# l% d# ?" G: u$ O. h; g
void __fastcall TListenThread:oError(); o+ y' p% t; K& L- O- L% o  I
{+ Z* K* g* p( k6 h5 n8 _
   if(m_Socket!=INVALID_SOCKET) closesocket(m_Socket);
9 O$ G$ ?; ~0 V0 c; x8 z; s0 H   WSACleanup();! ?# J: _' Q  @) m9 }* Z- n
   return;
0 m; e2 n4 h* I( K5 a" w6 X}
* F2 l1 C0 X7 F4 p6 dvoid __fastcall TListenThread::InitSocket()5 l  b7 N# ^( |! r, i* m* A0 ?
{
9 B$ U3 P5 \9 R# b   WORD version=MAKEWORD(2,0);
0 D1 G' o" z! l   if(::WSAStartup(version,&wsaData)){
% n* I  Z/ C# |( s) `      sprintf(szTmp,"Failed to intiailize socket,error no:%d",::WSAGetLastError());) z3 u' B$ u  Y5 l: |) f$ S, g
      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);8 p0 t% B# M1 _/ v. G
      DoError();
4 i' f/ m; l9 @8 ^, }8 S+ x      return;* n: h# P$ _" ~
   }
7 ~' Z) D" t' Q6 ^- \2 Q}8 }) U7 O9 D+ a- _
void __fastcall TListenThread::CreateListenSocket()' m7 n7 C! y6 v4 K% r' R, V3 [
{
" @4 j/ ]/ O. E6 I9 u   switch(m_Protocol)4 y7 _4 W4 d6 y* ]& I5 D
   {
) s, b+ K: N9 R2 G4 K; _      case UDP:5 M* t' ?( ^/ {) ^7 v
         m_Socket=socket(AF_INET,SOCK_DGRAM,0);3 {# P  F- [" d( v, ^8 Z
         break;
0 B( }$ t, P9 E, y      case TCP:
( v" H5 N, @4 a. t/ O5 r         m_Socket=socket(AF_INET,SOCK_STREAM,0);
. g& l* z, y$ }% {+ Y. ~         break;
- ^% Q- ]8 M) `$ c" a) D3 ~/ y      default:
1 m5 a4 ?( f  M+ ?8 _, F         sprintf(szTmp,"Error protocol!");" C% I  i5 A6 H
         ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);. {% C  Y( v+ _5 ^' B6 u* T* S( p
         DoError();: H2 a% k+ K* d+ w- J: G
         break;
2 W( k+ V5 ]2 F5 x1 c, d   }! T* z8 W/ m6 O- `" Q
   if(m_Socket==INVALID_SOCKET){1 g$ O- ?" ]* ]7 m6 K
      sprintf(szTmp,"Failed to create socket!");7 m' d& n; B9 W
      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);
) {* m& h- ^, a. h/ c5 a      DoError();. ], Q, f! E3 ?
      return;
' I: c. E, b3 m. A0 u   }( o. t6 \0 f% K
}9 E4 K" h2 ^3 D! `
void __fastcall TListenThread::SetListenSocket()# ~1 b+ z( [4 S  G+ U
{
4 X) q) A7 X2 S7 f' J5 B   server.sin_family=AF_INET;' D: P4 O! j7 R7 [0 w/ [' ?3 n6 R' O
   server.sin_port=htons(m_Port);
/ G& \5 @4 P9 |   server.sin_addr.S_un.S_addr=INADDR_ANY;" c  q* f4 ~8 _( a
   int NewOpenType=SO_SYNCHRONOUS_NONALERT;
7 D8 e( }; S! A( M   if(setsockopt(INVALID_SOCKET,SOL_SOCKET,SO_OPENTYPE,(char*)&NewOpenType,4)){; p$ W/ X; O2 A1 p8 s. j
      sprintf(szTmp,"Set socket option error,error no:%d",::WSAGetLastError());
) c3 _* l) P+ {& P. g% j) z      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);
9 b6 t/ Y. `0 ]& J' V2 M      DoError();" k( Z/ Z) ^4 f
      return;
5 ~, Z9 \9 Y: H: a6 V$ g$ e" g   }
# j3 ^( [8 m2 Y}9 u: [- ?* }; d4 y3 _
void __fastcall TListenThread::BindListenSocket()
* y) r7 S* l1 x* D$ f% }{
- ]. R7 P6 O5 {2 }" C1 L    if(bind(m_Socket,(sockaddr*)&server,sizeof(struct sockaddr_in))){; `$ t  K- d2 B  G
      sprintf(szTmp,"Failed to bind socket,error no:%d",::WSAGetLastError());  ~) T) s0 s7 d% [6 k
      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);% h- p6 F! Y; [! o3 L7 T2 `
      DoError();
. V! Y- V! t7 c& U/ x/ j      return;! @+ }! t# [& w. {) m
   }
5 v# j' z; w* O( j; _) `9 w5 c  q# m  z* B  Z
}# W  ?* {. g2 i" y$ P4 L  o
void __fastcall TListenThread:istenSocket()3 u  s: [9 ?: n* s+ @2 z6 b7 |" E
{
" e0 C" j8 c; b, L  g9 `  if(listen(m_Socket,SOMAXCONN)){
' v- j' b& Y) v7 R1 P0 g/ e$ O  b+ W7 x) W     sprintf(szTmp,"listen error,error no:%d",::WSAGetLastError());; i" @$ ^- w4 K- h. h3 Q% f
     ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);
1 V; n3 l6 S2 v( n5 f# z4 {' z     DoError();3 n# b3 B4 \7 o6 [: A% Q6 }
     return;
, u0 g) X. B5 O$ H; `  }% ^. _) f# w& s6 w, `) I
  //Determine whether there is any connection
' B: O1 P+ y0 d  FD_ZERO(&FDS);' y6 o+ z) F/ Z/ y5 G
  FD_SET(m_Socket,&FDS);- z( T2 w% O, h! P; O1 |
}; {4 g: m3 n  j5 O+ \% J
void __fastcall TListenThread::Execute()
7 {% _/ j  H5 @5 f- _; D{
( v& J* \! C0 n! g' D( y* C   char buf[4096];, M% s% F/ R9 p0 t
   struct sockaddr_in from; //for UDP
# f' C% Q9 t, `. G; Z1 b   int nLen=sizeof(from),nSize=0;  //for UDP
' L' O! Q$ q7 K8 e( [   InitSocket();
* K3 ^7 X( V6 Y4 X/ h% Q   CreateListenSocket();
6 m+ B! W0 a% Y7 s- Y7 z  ~) s   SetListenSocket();# @7 C, V3 U: f0 Q9 z; R
   BindListenSocket();+ u( A0 t$ Z: [$ h
   if(m_Protocol==UDP){* e; R: L3 ~. a3 c, J
      while(!Terminated){
3 ~! Y. K: f; i' A         int nSize=recvfrom(m_Socket,buf,4096,0,(struct sockaddr*)&from,&nLen);0 `+ f1 J. v" I8 \
         if(nSize>0){
, |; \1 ]  y. `            buf[nSize]='\0';
. L2 D. F9 l9 B9 y6 v            PSTNForm->Memo1->Lines->Add("Received Length:"+String(nSize));
, B3 O8 e+ N3 P            PSTNForm->Memo1->Lines->Add("Received:"+StrPas(buf));
, ?$ ]0 `8 A# Y4 c. J5 w2 g! u            ::Sleep(100);: ]* D7 B7 q' j( ?
            sendto(m_Socket,buf,nSize,0,(struct sockaddr*)&from,sizeof(struct sockaddr_in));
/ G8 y) ~" a/ ~/ x$ T# g; j         }
" _, U, c* _, ~+ ~' w; J         else return;
, x. B7 {% n5 ]8 f; M4 A7 P* k  R7 l- t8 y2 e8 T3 @3 v, s
      }9 Y  k  J; y( a
   }' @1 \) F$ B& q% K  `' G
   ListenSocket();
9 x+ r, r' s; L' |   struct sockaddr_in client;* v4 E; h; E# e8 n1 r
   int nLength=sizeof(struct sockaddr_in);$ R% P3 N& N6 G6 e. O0 G( O+ r
   while(!Terminated){/ d2 m& v. b' h5 v% k* b
      int nError=select(1,&FDS,0,0,0);
6 F, k" c9 t) K9 i* T3 n      if(nError<=0) Terminate();' M/ s2 @: t# @/ T0 \. d
      SOCKET m_AcceptSocket=accept(m_Socket,(struct sockaddr*)&client,&nLength);
0 |3 Q$ A" A& A; s& h0 N/ i      if(m_AcceptSocket==INVALID_SOCKET){
/ K; j3 L" Z6 d( c         sprintf(szTmp,"Failed to execute accept,error no:%d",::WSAGetLastError());
6 o4 R. J  G* n" p6 Z2 L% O         ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);
3 \, @1 c% R  t1 k% x, H4 F) _3 I         DoError();
0 k( V) e: G1 c" m; c7 E# r  W         Terminate();
8 x) U& \1 D4 V: g7 q/ L  ^         return;4 ?( h$ a8 B8 e3 B6 w9 `2 _
      }
+ g! M: L! R: u. {9 N      TCommunication *pCThread=new TCommunication(m_AcceptSocket,FALSE);
3 c% s* T( j* d* N" p1 E3 ~  X      pCThread->Terminate();
$ ?  m: V# b! {, r, }      pCThread->WaitFor();
% Z3 N; T& L# c8 d4 p8 ]   }
+ b' Q( R1 Q( t: h' j3 s4 D}4 h7 \( ?# o  l8 [# f% }: \5 {  F
//************************PSTNForm*********************************************//6 b! s) ]9 q4 H4 {, C' O, t
__fastcall TPSTNForm::TPSTNForm(TComponent* Owner)& F+ f; B$ _1 U2 i% }7 g
   : TForm(Owner)
& B3 w, Q9 r- p2 n{0 [, \4 h; ^: x  L, @% T
}7 d3 T# `% g6 i! i
void __fastcall TPSTNForm::Button1Click(TObject *Sender)
; d. }* G0 _5 T6 ?{- I" `) m% r) ^7 M( u: K3 f& |
   Close();/ k7 e$ H$ d5 l3 q8 S
}. a* c8 g+ i! C
void __fastcall TPSTNForm::Button2Click(TObject *Sender)' b' z7 n1 O( n
{: }- v/ t$ d( W
   if(pThread){
5 e3 [6 E; X1 k* O2 H$ E      pThread->Suspend();
3 F' Z4 [* R8 \. ]" Y8 m3 G9 Y      pThread->Terminate();/ `# K5 u$ |/ E3 W6 d7 x  u
      delete pThread;
. W1 b* h# U$ L0 g      pThread=0;
7 V$ F# {+ f/ d0 t   }) R  I# s# G1 ~( I
   UINT m_Port;
6 t1 a8 Y% U% b# n. @- Z6 a   try
& X. A  R! `6 J! A6 D/ K/ e! O& Q   {
; E" r# z4 j( E! H8 ]% j      m_Port=Port->Text.ToInt();
/ X* t: I7 a* n: N   }- s& P7 y# ]' W8 F% X
   catch(Exception &e)( _: B2 V: y0 a  V1 `6 i
   {% k$ F1 o% u. N# o
      ::MessageBox(0,e.Message.c_str(),"Error",MB_OK+MB_ICONERROR);
% o% x" ~" B: ?$ |' U  O      return;
1 E; Z# e# {. B4 P   }
, O+ T3 t9 [6 O: ~. g   PROTO m_Protocol;
% y! B) E% C3 [  @, x" ?& v   switch(Prot->ItemIndex)* c; X6 i! l8 r) O8 c
   {4 X& C3 g/ I1 x4 R
      case 0:4 ]8 T8 ^) a" O1 j2 {3 U
         m_Protocol=TCP;0 i5 X+ K" D! k2 [' R9 R, T- P
         break;" _, Y1 u" o' @$ O; M4 O6 @5 a+ }' @
      case 1:
; B; c/ v) H' W' F1 Z" M* w; Q         m_Protocol=UDP;
& [* g% s; \7 s; T         break;
' p+ @& x5 c3 Y  N' N      default:; K+ ?0 ^' s. n
         break;& e. o; v$ `5 C
   }8 E. z8 H  P0 T: H. W6 d3 U
   pThread=new TListenThread(m_Protocol,m_Port,FALSE);
" X& @, B" d( Q, h0 ]; g   //pThread->Terminate();7 e- g9 ~1 W! r5 R1 _- F
}
$ ~; b' C0 V/ H' l" _void __fastcall TPSTNForm::FormCreate(TObject *Sender)- A) C" l  Z" L# X' e7 O( F
{2 @5 {, Z: S4 W; r' }8 i4 z
   ::SendMessage(Prot->Handle,CB_SETCURSEL,0,1);
1 a* o& a9 {/ n) `* F$ p& s( ?; K$ y}7 m3 v8 x& _' V# N2 t
, [' o% q- i+ i# M
void __fastcall TPSTNForm::FormDestroy(TObject *Sender)
5 s* B! A7 J" ~; l' B{, P" h, Y/ `7 K; o
   if(pThread){: r' R$ z3 x2 v, Y, j
      pThread->Suspend();
6 m# r: ?! a* M: I% K      pThread->Terminate();}
- C* T4 N+ J& g}! o  Q$ I7 y5 w
上面的代码,各位可根据自已的需要和针对自已的应用,在数据处理方面加以改进就可以了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-12-13 10:09 , Processed in 0.023173 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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