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

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

[复制链接]
发表于 2004-2-15 14:01:13 | 显示全部楼层 |阅读模式
在CB中用socket api来写网络通讯程序
0 l3 w. v2 @& }3 R4 {/ W作者: kingcaiyao ,如转载请保证本文档的完整性,并注明出处。  n' W6 }; g' Y! z% U
欢迎光临 C++ Builder 研究,http://www.ccrun.com/doc/go.asp?id=5695 N' A7 {. v( n- }+ g2 q" d
本文转自csdn,作者:kingcaiyao) E" T  O3 F5 \2 t4 t+ L& B
原标题:在C++ Builder中用socket api来写网络通讯程序(同时支持TCP和UDP协议)5 m1 `* g* J0 A) [1 P: P9 y( m
原文:  http://www.csdn.net/develop/read_article.asp?id=19883' {1 }/ L4 E$ y6 N/ T7 E

# c6 Q2 E) K5 K/ `3 ^# C/ Z8 M3 }
在7月4日看完sockcomp.pas后,我决定用socket api来写一个客户端和服务器并且同时支持TCP,UDP协议,于是我就去做,现将代码贴出来(已调试通过)
) U8 S9 ^7 B( lSocket api Client:
# w4 M7 B3 s5 a: T% ]$ X% \" S1 n
  q6 N" P8 N, Q  |# ~3 D#ifndef UDPClientH# {* K# Q3 @: [
#define UDPClientH
# r0 F% ~5 H9 i#include <Classes.hpp>
" i& Q6 s4 e/ A6 u, \#include <Controls.hpp>
8 j* N) e1 W+ S! m#include <StdCtrls.hpp>
: i, D- e( v  p% F5 b9 h, Z) n! s#include <Forms.hpp>. \, F( M0 v( \, F* Q* f
#include <stdio.h>
1 p6 p& A. m/ g' n' x; B2 ^4 K#include "CCEdit.h"+ `; X- Q0 }2 V& [
#define WM_SOCK WM_USER+100, u  [/ H7 b9 |5 a
class TLANForm : public TForm. Q% a: ~+ H; W+ [2 }! C) \6 Q0 U
{
& t( \, R4 C& ~/ H) F__published: // IDE-managed Components
$ i* b, }: B5 u* @) y! i   TEdit *Port;& Z6 j: j# f# i( Q) j
   TLabel *Label1;* @. k% W. t) i7 u* J
   TLabel *Label2;6 L! W3 p1 k; `  L
   TComboBox *Prot;# p! i% Q: h, L3 Z/ n
   TButton *Button1;" H3 j- D5 _! D9 [1 p
   TLabel *Label3;' U1 _5 P  ^1 W4 W; ?  R( L2 L+ ]
   TEdit *Addr;
) F5 i( q% i0 r   TCCEdit *TxtEdit;
! J6 O0 w+ v4 I! r) ~2 K: J* J   void __fastcall FormCreate(TObject *Sender);" }% X+ l3 m; l8 x8 x
   void __fastcall Button1Click(TObject *Sender);  u6 }: F; M. g5 w, X. v
   void __fastcall FormDestroy(TObject *Sender);2 M, c- Y: G2 L& i4 ?0 x( |
private: // User declarations
: a% \  C; Q  G& m0 W   void __fastcall OnRecv(TMessage &Message);
6 E9 }2 O2 V; d9 ?public:  // User declarations; c% H8 j1 F% }1 t% g
   __fastcall TLANForm(TComponent* Owner);. M( D0 l, N( P7 v$ `
   BEGIN_MESSAGE_MAP: i2 q' \) L" @9 L; F
      VCL_MESSAGE_HANDLER(WM_SOCK,TMessage,OnRecv);( r1 e9 ]2 t  o! N# L2 Z* t2 `' ?* h
   END_MESSAGE_MAP(TForm);
! E- ~( e: t6 g5 k& T- b1 |};
7 z$ T# k/ q5 I) [extern PACKAGE TLANForm *LANForm;
2 u; ?2 q3 ]2 ?5 S% I#endif* G1 u5 _! Q; p/ z1 j

2 B, m4 L# `  g0 I7 ~( Z/ @
3 {0 c4 g) i; ]$ e& w.cpp File
8 T0 y6 h+ j6 j( m; t* E/ g$ X+ L( C& E
#include <vcl.h>: ?2 q. O% y) L! {
#pragma hdrstop4 x( o3 _, f& ^& k+ H3 c; U
#include "UDPClient.h"8 D! ~% Z) h# n, {5 \0 ^- P
#include "WinSock.h"
- s! \7 t- ?) c% M#pragma package(smart_init)
6 h+ F. G; i" u& {, }  x' s#pragma link "CCEdit"# Z9 U+ ]) W2 Q) t3 {* H
#pragma resource "*.dfm"# o2 j% ]% v4 M( N+ A' V
TLANForm *LANForm;0 o2 @  K9 q" F/ {4 X- j8 J3 }
enum PROTO {TCP=0,UDP=1};; d1 E' w5 v2 u! s3 V5 u" b+ d$ G" Q& ?
SOCKET m_Socket=INVALID_SOCKET;
$ v5 M0 r( ]7 ~  L1 }PROTO m_Protocol=TCP;# M. r5 p8 i* }9 W* u
__fastcall TLANForm::TLANForm(TComponent* Owner)
2 r6 A5 t# g  m. Q: j   : TForm(Owner)  ^* q* |; N# z4 z- c9 x* u% N% w
{- Q% U1 w3 D; v& x" O
3 Y7 f/ G+ H  a( F
}
: \8 |/ a; N" B% M- O6 `void __fastcall TLANForm::FormCreate(TObject *Sender)
1 l, d! y4 r; D  c4 o{' o# a; W( {2 X
   ::SendMessage(Prot->Handle,CB_SETCURSEL,0,0);
& e4 e9 `, H% P+ b. s' y}# u' L6 p8 Q9 x5 {) _
void __fastcall TLANForm::OnRecv(TMessage &Message)
* Q& z+ {& L- a1 n. L  [4 q9 `{
: Z# Y) o; {8 Z1 b# a   char buf[4096];
* z+ }( @2 h( u. U$ G0 O/ \! t   int nLen;9 A" J( g! Q" I9 U% |2 I# \8 S
   struct sockaddr_in from;
. S3 [" O4 O# `   int nLength=sizeof(struct sockaddr_in);
8 R% A; [1 u" y: N) O   switch(WSAGETSELECTEVENT(Message.LParam))
2 {0 I6 m7 a/ b$ h1 \. t0 D% A- b0 I   {4 g% H, l( M8 s
      case FD_READ:! ]+ q6 g0 b$ E& f4 w
         switch(m_Protocol)$ y" }; W5 d( F' ~2 ~. z, @6 }: ]7 f
         {+ E! W- I& C# Y; v
            case TCP:8 u# m% A- j- Z8 ]5 |3 Y
               nLen=recv(m_Socket,buf,4096,0);
+ u, t% g/ W: _6 E0 q               if(nLen>0){
+ C+ F! o4 l0 q                  buf[nLen]='\0';+ @. f# Z. w$ @4 A* l; H
                  TxtEdit->Text="Received Length:"+String(nLen)+"\r\n"+StrPas(buf);
. A8 w- w$ \+ {               }5 V5 I5 p2 z3 E. @
               break;
; r* M5 ^$ R. k0 O5 \4 o$ x& q9 {            case UDP:
1 N3 }' t) F+ D: j* I( [% U% G               nLen=recvfrom(m_Socket,buf,4096,0,(struct sockaddr*)&from,&nLength);- ]5 I* k3 Y; c# W' c- \7 q. ]2 k( t
               if(nLen>0){
7 q0 K7 Y6 S/ X                  buf[nLen]='\0';! @! r$ `( q$ c+ Y  w/ k' L$ a
                  TxtEdit->Text="Received Length:"+String(nLen)+"\r\n"+StrPas(buf);0 {! t- [+ P: K6 M
               }
6 {9 ~; A* A: o9 b               break;9 J& R+ y; R( N! L6 n% O3 q, K8 O
         }
0 ^" n/ X' y# n' r' V; k         break;
( r) _# a: n- N( j6 Z8 S      case FD_CLOSE:  F) @; m. ~& C8 w; S
         closesocket(m_Socket);; ~# I3 B) |/ |
         break;
& W! T' J1 `7 c0 Z   }0 X' t. o$ T& Z0 C9 Y1 G
}& w+ g& ~3 ?- m" W) }2 k6 [
! U8 Z' S7 }. m7 r4 E+ R# z
void __fastcall TLANForm::Button1Click(TObject *Sender)/ a: E& J% v" e9 K
{3 [, x  F" \' e) J7 T+ ~
   char szTmp[256],buf[4096];& H1 k$ e' @; R$ n! |, b1 h6 ]
   int nSize=0;
4 C9 K0 Q+ S, m9 R' v- \6 x   UINT m_Port;0 Q5 I) Y' R* ~/ |0 [8 }+ I
   AnsiString addr;' _0 w1 w4 f2 G8 \0 V" q# @' L( Y) r
   addr=Addr->Text.Trim();* K# B3 d9 e& }! ^+ p4 j
   if(addr.IsEmpty()){1 X7 c" F: h: c5 }2 U3 m
      ::MessageBox(0,"lease enter the server IP!","Error",MB_OK+MB_ICONERROR);( ~' t6 d+ p) p8 Y' Y2 g: m
      return;6 _; \! z6 c8 G) M# L, b. d6 @
   }+ _$ P6 C5 }8 Y# t; k/ E
   unsigned long nAddr=inet_addr(addr.c_str());
) A' M% }1 A8 `# j$ D2 o   if(nAddr==INADDR_NONE){
& E- D. O! `* N      ::MessageBox(0,"Bad Internet IP!","Error",MB_OK+MB_ICONERROR);. |* K$ g' Y1 G* v; `& ?7 @
      return;}
9 o) O3 y: z7 o. y+ ~( y# u" M$ A6 I% i6 b8 t
   try
) x% e; V" M* R( c9 F: |   {
$ F4 x+ m9 `! P# p, f      m_Port=Port->Text.ToInt();
7 U( X& s  g1 u2 y) K& F' Y   }2 X1 M! {, P9 q) |3 l- `( ]
   catch(Exception &e)
7 F! x. M4 ~$ g( Y1 G% |% Y3 O7 h   {5 F' t+ t( E3 }+ }) |
      ::MessageBox(0,e.Message.c_str(),"Error",MB_OK+MB_ICONERROR);
3 Y0 v9 T1 n# b. C- O( H9 ]      return;
- v. q7 x$ j' \" ^. g' |3 m* Z   }" q' [) v* @. X) v
   switch(Prot->ItemIndex)  ~$ r. J( L; `2 }; W  x/ l' {
   {
( f- P$ q/ X) w! {      case 0:
$ a. B+ Y3 V, B4 h6 E         m_Protocol=TCP;* k+ ]1 g: L; q& x0 U
         break;
% _4 |, v# q1 k" H( D, D# F      case 1:# M2 F& f1 E2 p: C+ C$ Q1 A
         m_Protocol=UDP;
5 Z8 b( E0 T( s8 O/ y         break;$ p; D0 D- K, ^2 _" |- g
   }2 S, V. @4 b2 J6 K+ F
   if(TxtEdit->Text.IsEmpty()){
9 f4 p# c1 \/ j( d* R9 W  X, U      ::MessageBox(0,"lease enter the text you want to send!","Error",MB_OK+MB_ICONERROR);
2 N& S" N1 o  Y0 R! _4 e% c      return;}
- r6 Q. }8 x; i+ o# ]/ h* v6 L. m  x, D% U7 o4 D  B" I
   //Initialize Winsocket0 W  l5 P, A% F# K  u& X
   WSAData wsaData;
. g3 w/ \, L( h& {/ K/ y* B# ~. n  q' X   ::ZeroMemory(&wsaData,sizeof(WSAData));  |9 E# ^6 n4 v# Z# O0 A, n
   WORD version=MAKEWORD(2,0);
# v% F9 {- u. T0 k& P$ S$ r3 x% F3 Y   if(::WSAStartup(version,&wsaData)){/ s% Q! I8 C; a1 Z
      sprintf(szTmp,"Failed to initial winsock enviroment!,error no:%d",::WSAGetLastError());
: y. l5 C3 K" E0 L      return;}
0 }. G/ \3 Q2 K. ^5 g3 @; h- i2 F' z+ s* ]3 H
   //Obtain the active connection- p8 x/ K: |5 P& d# n
   char ComputerName[255];
5 A1 P: j9 \0 u0 e) n8 t   gethostname(ComputerName,255);# i0 x5 s0 n% F  C% R
   struct hostent* he=gethostbyname(ComputerName);  O5 c, E' n1 M" l, s+ g* o$ l( {
   if(!he){
9 l2 z# Y, t  K      sprintf(szTmp,"Failed to get information to host!","Error",MB_OK+MB_ICONERROR);
. e, D- a3 K6 [8 q# N6 b% m      ::WSACleanup();
7 U% e4 T: z: h8 i      return;
* K; o4 k; G4 g2 D* I! \  S8 i! A0 J* K   }. T1 K; W* g5 t* m( C0 v; B/ W
   //create new socket
- h2 s" B1 g) g+ N; y   m_Socket=INVALID_SOCKET;% @5 ]  ~% l" ?6 [5 d, }: v& z& _
   switch(m_Protocol)5 [; ^9 ^- I0 ^# d6 y) g4 M& T4 q
   {
- `- o5 Q" b2 |      case TCP:
/ G1 \4 W, b" {  y# ]9 d         m_Socket=socket(AF_INET,SOCK_STREAM,0);" Y0 E0 j* s$ ^
         break;9 S. [1 G4 C2 e. e- H/ {
      case UDP:/ K  @) x# k6 X' f
         m_Socket=socket(AF_INET,SOCK_DGRAM,0);6 S  k9 R" D- L4 d
         break;
: D: _% g: V$ A3 f) _$ d& L   }
  A8 J; j! z5 N9 I, q! I3 P   if(m_Socket==INVALID_SOCKET){
( B! R* h1 s1 f% p      sprintf(szTmp,"Failed to create a new socket!,error no:%d",::WSAGetLastError());
% h" y- o$ J" l      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);$ j) h! q+ Z# A9 N
      ::WSACleanup();
; c8 T" d8 U2 C% i      return;
4 F/ B0 \6 J+ W) T  i: {: R   }
( o( E; `( o! H, I5 Z& b   //bind socket; I3 X% ?& o3 {# L0 q
   struct sockaddr_in client;
- S4 q  ]4 W" w( \) e6 {. K   unsigned long nClient;
, {: N; H3 h. L   memcpy(&nClient,he->h_addr_list[0],sizeof(int));% A$ a7 I# q, g. K. l
   if(nClient==INADDR_NONE){
0 }: ^( n: J, O& r3 A6 v      sprintf(szTmp,"Failed to obtain the local machine's IP!","Error",MB_OK+MB_ICONERROR);) |0 }# x, P/ q4 Q- c% J  C& A) E
      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);
- [' S9 p) _" J+ I      closesocket(m_Socket);
3 _! ?( p$ o7 A" U4 I+ G      ::WSACleanup();
& y) l3 B5 B! u& s      return;
: a0 k$ T* Y- Q, z( `, I3 U- E. X   }
6 k* S! m' a' C+ L   client.sin_family=AF_INET;+ Q& k4 G6 P) A: e+ u% \/ B" E7 ^' e
   client.sin_port=0;
! ^+ H3 q, A: H4 S7 `$ N   client.sin_addr.S_un.S_addr=(int)nClient;" S) G8 E! |5 v
   if(bind(m_Socket,(struct sockaddr*)&client,sizeof(struct sockaddr))){' S7 T% W& X' t! o- ^
      sprintf(szTmp,"Failed to bind socket!","Error",MB_OK+MB_ICONERROR);/ R: V& B9 s2 n1 Y/ `& E
      closesocket(m_Socket);
9 _! F, M- h& x+ c      ::WSACleanup();+ c1 n/ V" g: q
      return;}& W. F! R$ H$ m8 R( h( D1 S( T0 T7 l
   //connect socket) U. D' M* t, z& G# m. P# _
   struct sockaddr_in To;
+ p9 \7 h- y) h" h4 a# C' }4 n   To.sin_family=AF_INET;9 i! D4 s4 a& X0 C( u4 }+ ^
   To.sin_port=htons(m_Port);
7 s8 c& R1 O' p/ C9 A8 f   To.sin_addr.S_un.S_addr=(int)nAddr;
. d" p4 o: @3 Q2 [7 \8 q, a/ l9 m   fd_set FDSET;/ V9 J5 _% }1 W4 d& }9 ]
   FD_ZERO(&FDSET);1 y% O/ F: K. a# m, y
   FD_SET(m_Socket,&FDSET);( d: |/ \3 ^+ t" ]
. j- x5 M/ z& }# w* G- |& N* {4 p7 L
1 c9 p( F7 L! ^6 Z
   if(m_Protocol==TCP){
$ }) W! o  k- o# z) x" x8 {# M      if(connect(m_Socket,(struct sockaddr*)&To,sizeof(struct sockaddr))){) i0 a& j6 I9 z) N7 S% f" `
         sprintf(szTmp,"Failed to connect the object!,error no:%d",::WSAGetLastError());
& c$ z+ E  l" s. T3 a         ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);
1 u5 Q( @3 f! ?7 p         closesocket(m_Socket);
7 b2 R0 S; i9 M6 ^         ::WSACleanup();3 ^$ v1 }' T2 T5 B$ c* k
         return;0 H- O+ s6 ~2 b
      }7 d" _9 s* Z/ e+ `8 S
      int nError=select(1,0,&FDSET,0,0);
0 V- [+ ?5 O4 L: z      if(nError<=0){4 v. `" V* j8 c: |( o$ x$ n
      sprintf(szTmp,"Failed to select socket!,error no:%d",::WSAGetLastError());
7 x- t+ k9 _6 ^      closesocket(m_Socket);3 v& i, i$ S/ N0 [/ o( V
      ::WSACleanup();
8 V4 D; S  T: A' F8 s: b      return;}6 T/ g# D. |* n, U& L: J& _* v
   }
6 w7 C* u6 u% }( k; a   //Send data0 j2 E0 T# f/ a' Q5 j8 I8 L
   int nLen=TxtEdit->Text.Length();
5 e' f2 v% b7 k7 z" O6 a   if(nLen>4096){
, `8 Q8 E- K( C$ l      sprintf(szTmp,"The buffer is too size to send,it shoud not be more than 4096 bytes!");
) F5 G7 d. [, O! ]& q5 Q$ S# Y- O! r# k      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);6 S- s6 d$ ^. @0 l5 u$ H
      closesocket(m_Socket);% c0 A+ V% o. {  h# F
      ::WSACleanup();
% V8 }9 p4 J4 {5 H      return;
5 g9 N" h& z, X' J   }! X" X! A' {- M( N% `
   strncpy(buf,TxtEdit->Text.c_str(),nLen);( M+ i4 |! [& [4 N4 u; T0 c
   switch(m_Protocol)6 W, \1 d+ y! F6 B* Y* ]
   {
5 G9 a( H3 F9 q/ u8 w2 w0 D      case TCP:# E# [( h, x$ w/ J  t. x
         nSize=send(m_Socket,buf,nLen,0);' @% V/ Z( X" j2 X7 B; I
         //ShowMessage(nSize);3 f1 w# I! l0 Y) f' ?
         break;2 a8 Y' v6 A2 i* Y' I
      case UDP:; p: p& }+ w: A7 h4 A  `) a, B! J
         nSize=sendto(m_Socket,buf,nLen,0,(struct sockaddr*)&To,sizeof(struct sockaddr));
, s" _4 m& B% r         //ShowMessage(nSize);) P$ _4 W, c+ U& d' r+ R3 d
         break;. P7 U" w  G- k. t5 O

0 M2 ?$ q  G0 \! B" R9 F% k2 C6 y   }3 p+ |/ S$ T7 H6 t' w5 g7 G
   if(::WSAAsyncSelect(m_Socket,Handle,WM_SOCK,FD_READ|FD_CLOSE)){
' O+ ^% H5 v) x+ m' r% M      sprintf(szTmp,"Failed to register socket event!,error no:%d",::WSAGetLastError());& X, ^" F- d: C! k, x
      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);
; u8 \9 D, k; I- ?! O      closesocket(m_Socket);
* B$ T) c1 z  p  n1 p4 B      ::WSACleanup();
# G7 C: j/ ]; q) b3 s+ A      return;}
$ u4 U& }4 {3 ^; n% n1 o6 j1 a- b}* Q' o" J* I2 p2 F( N8 i4 F
void __fastcall TLANForm::FormDestroy(TObject *Sender)
8 \& \) l+ W* T/ y+ p8 g+ i7 g+ |$ z{
4 K  P& f: T' f& ]2 q5 _   closesocket(m_Socket);9 |  |  E) |! S8 [3 S
   ::WSACleanup();7 M' B2 F7 d: l$ o
}
1 c: [% R( j) v* ]
: Q2 P, x$ [. d+ U" NSocket api Server:
, p9 H! Z- t6 l3 J.h File1 {: I! H) g/ z4 D( r
#ifndef UDPServerH5 p3 }- }; x& \8 r! L2 l
#define UDPServerH
; s  F4 a- T: P# N#include <Classes.hpp>% D- I: ^$ M  d! Z2 I
#include <Controls.hpp>* E+ P8 s, D4 N6 F. e
#include <StdCtrls.hpp>
* X5 ^' I3 ~/ X# `& G/ D6 n#include <Forms.hpp>
, x+ K6 `& ^) Z. W0 _#include <stdio.h>
2 N; Y9 Q, w& |6 J+ Y0 G% f#include "WinSock.h"
: k! z/ e6 A$ ^6 l+ U6 ^' H/*#define WM_SOCKET WM_USER+1000( q& u) x3 J* O) E( D3 E
#define INITSOCKETSUCCESS 0
9 j$ q5 C) F6 x8 z2 c$ v#define INITSOCKETFAILURE 1
' w) o9 G+ W; I) p#define CREATELISTENSOCKETSUCCESS 2! q: x6 Y$ N. O
#define CREATELISTENSOCKETFAILURE 3
2 b2 Q2 O" D( X! ^" R$ K  R#define SETLISTENSOCKETSUCCESS 4% t& r$ w5 E) w  |  P
#define SETLISTENSOCKETFAILURE 5
$ x# S- e! c' s" n5 Y8 J9 M9 z#define BINDLISTENSOCKETSUCCESS 6
3 b$ a; M- J" x* }+ }9 {#define BINDLISTENSOCKETFAILURE 79 t" D2 l1 k1 H6 f
#define LISTENSOCKETSUCCESS 8. F8 B+ T5 }; T
#define LISTENSOCKETFAILURE 99 \1 \0 o( a% `) _6 z* j' v: s7 s
#define ACCEPTSOCKETSUCCESS 10# h; t# }6 D& \; l
#define ACCEPTSOCKETFAILURE 11$ }0 Z7 s" e0 q% `4 v6 n2 m
*/4 H/ j# t: }; u: W, I1 i
class TPSTNForm : public TForm( ]2 {# n  _6 Y% z- O% R8 x5 W$ ]
{
8 s! s: ?) o7 |7 A& z__published: // IDE-managed Components2 o* x& H' t6 x; U7 u6 d( x% d5 U
   TEdit *Port;
- n) g4 C( Q3 X6 b0 G   TLabel *Label1;& p9 w8 R, M% c3 ~. r, [; ]
   TMemo *Memo1;2 B% F2 N2 A& J3 t8 N; S7 j" M
   TButton *Button1;
9 M) n- S; [8 G" u0 T5 d4 J   TButton *Button2;8 j4 i9 S7 A5 A
   TLabel *Label2;, ^$ h) m% h$ h+ q0 y! ~+ W
   TComboBox *Prot;' q* b# b) _( D' C1 w* I; J  ]: `
   void __fastcall Button1Click(TObject *Sender);
; ]8 u  t5 i9 ?! ^1 \6 D   void __fastcall Button2Click(TObject *Sender);  O" u) W$ g# q# u
   void __fastcall FormCreate(TObject *Sender);
9 n8 e* F5 j% i* [# R, |/ ~   void __fastcall FormDestroy(TObject *Sender);$ E+ Z0 P) h  H
private: // User declarations
0 O  N0 F. r. j' R* \9 ppublic:  // User declarations
" {% @- H+ _3 T  g+ @- v- M   __fastcall TPSTNForm(TComponent* Owner);9 [- Z& F* B0 ^( f3 C5 R
};
1 R8 `5 I" I/ Z. f' k8 Benum PROTO {TCP,UDP};
4 Z( _# T2 `9 B' Y. p& Dclass TCommunication:public TThread    //Communication Thread1 s8 X$ ~6 G6 M1 j8 S) K  m
{" Z4 k2 K9 m4 T4 m7 d
private:. k/ `0 P- W3 l5 B2 [
   SOCKET m_AcceptSocket;$ {) M6 ]/ u. k/ r( h3 r
   char szTmp[256];//ERROR MESSAGE4 m8 `/ Z6 E4 F+ \% i
public:) C$ E6 j" S; L" u( D) E
   __fastcall TCommunication(SOCKET m_Socket,bool CreateSuspended);% \4 |  `% B: }. i
   __fastcall ~TCommunication();
3 R# m7 R$ p; P$ s: B! Z# Pprotected:5 m! U' L1 E8 U5 E" }9 C+ m
   virtual void __fastcall Execute();
; `: ~, |$ R0 z) r};
- }6 F! h5 c( b8 P. Uclass TListenThread:public TThread //Listen Thread3 n: c7 o* X( {. i' H( E/ u8 f
{/ s5 W( e6 r( U2 ?
private:
% J9 b; X6 ?! g& O! Y8 P7 c   WSAData wsaData;
' f, V9 l: w/ Z% o; v7 e9 D; R   struct sockaddr_in server;/ m; h& o5 u" H) V& \
   fd_set FDS;/ V) q- t) F+ k3 o" P: c& ], L
   UINT m_Port;
' ~5 ~/ w8 S9 A+ i# o  e   PROTO m_Protocol;. z, ]+ A3 L1 i6 E* N4 m
   char szTmp[256];//Error Message8 k% z6 i: C& {% Y) o) K
public:: w4 y/ L. j, m
   SOCKET m_Socket;
9 l+ K3 }: ?! T+ a- C2 P1 I   void __fastcall DoError();4 w* B/ ?9 {% j9 Z/ }* n
   void __fastcall InitSocket();
8 T9 `' s: m, [   void __fastcall CreateListenSocket();2 g& f9 _' I5 g% i6 t
   void __fastcall SetListenSocket();- n" p( r$ S) W& |
   void __fastcall BindListenSocket();) Q$ @2 [9 Y/ R5 P3 E
   void __fastcall ListenSocket();
$ l5 j$ ^/ Q% S6 c4 D: I$ N. s- g$ N. g" e" J( M1 b
public:
, D- D+ f* L  q   __fastcall TListenThread(PROTO m_ProtocolA,UINT m_PortA,bool CreateSuspended);: O5 K4 i4 x6 @" x3 |  ?2 _6 A' v
   virtual __fastcall ~TListenThread();% ~+ [+ Y$ P" i, P$ u
protected:& h$ ^2 r/ u$ B, J
   virtual void __fastcall Execute();4 E# Y9 V1 a% R9 [
};
2 [# c2 a( V( w$ |extern PACKAGE TPSTNForm *PSTNForm;
" k1 ^" t! }% o; D#endif2 r9 @# |( U3 S* e
.cpp File
( D2 o4 a6 g  J5 ~9 ~#include <vcl.h>
1 S9 z0 A8 N* r/ |% X7 l#pragma hdrstop" F1 [# B; Z/ M" q$ B  h, L
#include "UDPServer.h"1 r/ j  q- J4 |0 j% X& {- a
#pragma package(smart_init)
1 g8 t# l, o! K$ s5 ]! d/ E#pragma resource "*.dfm"2 P3 g" o0 y& F8 L& B/ @
TPSTNForm *PSTNForm;
1 S7 _5 |7 K, e* x1 NTListenThread *pThread=0;7 H2 A+ w, `, |
//******************************CLASS TCommunication For TCP****************************************************' Y- \# a$ ^: R, ]4 w" l
__fastcall TCommunication::TCommunication(SOCKET m_Socket,bool CreateSuspended):TThread(FALSE)$ [2 D' k7 U* z$ n" U) j
{6 ~2 @8 E( I; o4 C0 V  v1 i
   m_AcceptSocket=m_Socket;
+ L, g5 T; w) ~$ I5 V% x   szTmp[0]='\0';
, Z, K5 H, ?6 j0 N4 O  d   FreeOnTerminate=true;5 N; H3 W+ L/ J0 X  e5 Y2 l
}$ W8 K- ^5 A9 ^1 W1 H' z' \
__fastcall TCommunication::~TCommunication(): ~( G7 a! z7 D* J# }9 B
{' ?. K, F+ D- D* ?
  // closesocket(m_AcceptSocket);( J2 ^  r8 e  D' p
}
, N- s! [/ f0 {+ R0 @+ C  E/ pvoid __fastcall TCommunication::Execute(): u! _& S# X" ]1 e" [- s5 N
{" _1 v3 a: b3 u
   char buf[4096];
) |/ y9 N+ Y' s) X. r: o) n   int nSize=0;
, B6 N" d0 k# D* ?. E" Y3 ?* \   nSize=recv(m_AcceptSocket,(char FAR*)buf,4096,0);
" r9 [; m) q) q! x   if(nSize>0)
7 U* ^0 `7 e' a+ d1 ^   {9 T+ _1 p6 s' g4 c, y2 h5 X
      buf[nSize]='\0';. u0 [! b% _6 ^/ H3 c3 _* |* Z& D
      //Display) r) l- y2 `1 i7 [- W
      PSTNForm->Memo1->Lines->Add("Received Length:"+String(nSize));: w5 K# U4 s1 {2 @: D% P& m( w
      PSTNForm->Memo1->Lines->Add("Received:"+StrPas(buf));
9 T. c: u8 @. a5 C- `3 E# O0 k      //Deliver
: ]! S' [# X! g$ z! L      ::Sleep(100);  P8 q, u% W8 a1 u8 {1 n3 _
      send(m_AcceptSocket,buf,nSize,0);
5 T6 y/ h  \; C' s   }9 t$ h. Y4 B1 w0 ?. ]
) X* u/ l* b1 F1 g
}
" H+ N1 Z+ X$ d" A//******************************CLASS TListenThread*****************************************************7 {- c# F: h. `, G2 L
__fastcall TListenThread::TListenThread(PROTO m_ProtocolA,UINT m_PortA,bool CreateSuspended):TThread(FALSE)
  c- u# j% B. @9 [( x2 p8 Z6 G{& p+ S$ v& i& d+ }
   m_Socket=INVALID_SOCKET;
, F  L' t7 ~$ v: ~  J   m_Port=m_PortA;
+ j$ ~8 o# ~8 i: G* u   m_Protocol=m_ProtocolA;3 }/ o3 ?0 J1 s( l) z
   szTmp[0]='\0';
8 M# ]- ^" T3 u- r' S( \   ::ZeroMemory(&wsaData,sizeof(WSAData));; q& A* h. t& w1 K- c
   ::ZeroMemory(&server,sizeof(struct sockaddr_in));1 N' [9 A# N( u, }1 q, W2 C
   FreeOnTerminate=TRUE;//Automatically delete while terminating.) S6 S0 f# h- I. s* {  k" a
}
5 U. y* W! }. F/ ]__fastcall TListenThread::~TListenThread()
; |4 T0 V. ]4 c' L{; e7 \2 e7 y" d. g+ O
   closesocket(m_Socket);
5 \9 N) E2 L' I* m6 F   ::WSACleanup();& x3 q( d2 p* I& P' X: U8 ^" y$ M6 S
   m_Socket=INVALID_SOCKET;
* ^. O: G. ]7 m" ?4 N# E   m_Port=0;
1 X* ~) H7 M+ R' ]2 A6 f: m   m_Protocol=TCP;
: y$ k3 M! J, G! m& r: w0 ]   szTmp[0]='\0';8 v0 F5 ~; X2 u
   ::ZeroMemory(&wsaData,sizeof(WSAData));8 l* ^) x6 H3 `6 j
   ::ZeroMemory(&server,sizeof(struct sockaddr_in));) \  R9 Q6 H, L0 {2 k( t, N
}+ ^' e" t. H) j2 S
void __fastcall TListenThread:oError()
3 j! X! o% Y" R. P1 x. J{* @6 T7 N) X/ e3 n2 a! ^1 Z
   if(m_Socket!=INVALID_SOCKET) closesocket(m_Socket);
& c4 H7 e7 k2 y6 s* o! ]7 }   WSACleanup();$ w5 @* |& ]1 m" n) u6 L
   return;
, I9 o. [0 l* h}
" I/ R) k/ ]  ~" S% A& xvoid __fastcall TListenThread::InitSocket()
. T0 {9 {5 `$ G# q{
: e0 u) J. `: A   WORD version=MAKEWORD(2,0);3 p4 w0 f& o% ^& [
   if(::WSAStartup(version,&wsaData)){
4 k3 G5 k7 a) w- G1 _) g6 }      sprintf(szTmp,"Failed to intiailize socket,error no:%d",::WSAGetLastError());* b8 ~" P0 i5 N1 t  P* T
      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);* Y5 Y) W7 R  l" _" {# ~9 o) a  u
      DoError();- T4 `" w) @/ r( D' p0 o0 D' \' u
      return;
7 ~$ l, T& Z& \   }
) m8 H" n5 e8 h# E: s}: `$ y6 C  m) T" \1 \% R
void __fastcall TListenThread::CreateListenSocket()! \4 N6 n+ Y6 }( e' H4 |
{. c# V# K5 P/ i" i  }! @
   switch(m_Protocol)
# B& i* l8 `& V% W: A- m8 e7 B   {, `3 C) x6 i* A/ _) ]
      case UDP:- F+ n- }7 J3 P: O+ O
         m_Socket=socket(AF_INET,SOCK_DGRAM,0);; \# x- B! G' ]! J  N
         break;
$ U/ i  z+ I7 T5 U: \# u- d8 c      case TCP:
/ }" K" S" {0 a- R: I         m_Socket=socket(AF_INET,SOCK_STREAM,0);& a# y' X9 d3 [1 B# x4 \( B
         break;
/ G6 n. _- b% `) o/ X      default:: z+ T' T" f( I
         sprintf(szTmp,"Error protocol!");
( {+ k/ ]5 c+ a! i! }         ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);  q0 L: z  I% H
         DoError();
% O  O* o0 d( L( A. k' ~/ S/ x         break;
& O+ q$ C% s7 f   }
# T) n* z0 C0 _3 N4 P, J   if(m_Socket==INVALID_SOCKET){
) ]6 _& p+ t! t; x/ z      sprintf(szTmp,"Failed to create socket!");6 |  u: O; Z+ Y* g6 k% E
      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);
  f" y( C* z( D, S1 e8 G& r, [      DoError();6 @$ _8 B% l; E+ i5 _
      return;. O$ V: Q  N9 @/ K4 U
   }# _' Q* @4 `, q$ I
}
" E! s! {9 j6 l9 Ovoid __fastcall TListenThread::SetListenSocket()! h" Q0 K: s8 p
{5 X. S1 o# ?1 |0 u" {5 K, I
   server.sin_family=AF_INET;
- _4 r2 ^; s! I& c   server.sin_port=htons(m_Port);! t2 Q! z/ t8 A0 ?: g
   server.sin_addr.S_un.S_addr=INADDR_ANY;
# o, m. A; g$ u% |+ d& X2 N   int NewOpenType=SO_SYNCHRONOUS_NONALERT;
9 S& K# K4 B( b3 _% j$ l3 r   if(setsockopt(INVALID_SOCKET,SOL_SOCKET,SO_OPENTYPE,(char*)&NewOpenType,4)){& e# ^6 T+ R! {4 s+ d
      sprintf(szTmp,"Set socket option error,error no:%d",::WSAGetLastError());
0 A2 ]1 b5 r7 [- u* c5 a      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);( x6 T, g2 v. V2 O& m; g
      DoError();: F' L' a" `2 I) l0 F: H
      return;# @7 A: ?* L2 N' @0 U5 Q
   }
* [& S% _. x1 t/ \}
0 f- J) j2 }2 pvoid __fastcall TListenThread::BindListenSocket()
" R1 t8 r4 D1 P! [{( P* u- q# m1 M9 Y. r
    if(bind(m_Socket,(sockaddr*)&server,sizeof(struct sockaddr_in))){
  W2 @& N2 |+ {. y: T% @2 S+ R      sprintf(szTmp,"Failed to bind socket,error no:%d",::WSAGetLastError());* X  Z+ w. A1 j) P9 Y: x+ h
      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);
4 c3 F3 M8 f/ d$ \) u9 h      DoError();: _, H* H1 z. @6 n) g5 A
      return;; [! r( |: o% |- B% _* ]8 G
   }
! H% v, A* O% ~: z
0 T- {; F/ U7 I# o& k9 p% s}
: c+ d# l3 A' \void __fastcall TListenThread:istenSocket()0 u( s) W% x1 H. |
{
# x0 s2 d7 ?# h' z% f  if(listen(m_Socket,SOMAXCONN)){
# A  w3 t6 i4 b$ F# s: p: d2 z  s3 I     sprintf(szTmp,"listen error,error no:%d",::WSAGetLastError());
9 L2 k0 ^* E( |5 k, N9 ^$ r     ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);
/ W/ A+ o/ P1 o     DoError();$ h, t- W$ j! C- m3 C/ g! X9 X
     return;
6 j( w# T% {# W( h  }
# C$ ?2 c) K  i, q' d  //Determine whether there is any connection3 F; }; n" c6 K1 ^  ?- ?0 i+ Q! H' ~
  FD_ZERO(&FDS);1 O7 M1 g; ]& [- n$ O  L$ b
  FD_SET(m_Socket,&FDS);6 h% ]6 j2 L" F, _; b. g
}' `5 @+ q/ u( [$ X
void __fastcall TListenThread::Execute()
3 X. H: k; O0 j: s{
. B5 Y) E7 K5 y; K   char buf[4096];
$ j0 u0 I! q6 J: L0 W$ t7 T4 z   struct sockaddr_in from; //for UDP: T2 E( a8 x; [# i3 N: G  ?* A
   int nLen=sizeof(from),nSize=0;  //for UDP- s5 N) g7 ~, ]
   InitSocket();; C( ?- E, v% V: M
   CreateListenSocket();
2 r: X# _3 W4 }  e4 q   SetListenSocket();. a, P/ h9 ?4 t% p
   BindListenSocket();/ I$ ^% [' R/ q! Z1 ]
   if(m_Protocol==UDP){
  h4 s  P+ N$ ?4 K) q      while(!Terminated){( b3 m$ W3 |3 R# F( _
         int nSize=recvfrom(m_Socket,buf,4096,0,(struct sockaddr*)&from,&nLen);
1 r- A- M3 c! K2 T) }2 U$ e         if(nSize>0){
* f2 n8 M8 a/ f; n2 S9 J            buf[nSize]='\0';
+ B- q  g( x, n1 H9 M            PSTNForm->Memo1->Lines->Add("Received Length:"+String(nSize));
: s7 l, S- ^+ [% b5 j/ @$ Y7 {( X3 G            PSTNForm->Memo1->Lines->Add("Received:"+StrPas(buf));
, y. t1 f7 Y" D& y( `            ::Sleep(100);
: L: Z6 c0 K  U/ O            sendto(m_Socket,buf,nSize,0,(struct sockaddr*)&from,sizeof(struct sockaddr_in));  \; A1 R) t* Y" G9 P! E
         }
+ k9 w3 ]4 }1 h; k! T$ [4 q. ~         else return;/ W1 |6 o0 e% r" i
7 i5 i/ W( n0 E5 z5 z
      }
3 P% s; G. }+ d, X9 Z   }. m( }5 [- q& ]' j
   ListenSocket();
- i8 j6 u8 R: V  O# J& ?   struct sockaddr_in client;
! Z) @! y* T9 T   int nLength=sizeof(struct sockaddr_in);
  a: p  N8 `# K! o$ t5 Q$ e5 ?   while(!Terminated){0 D2 I( f- ~) f- u* M" z4 H
      int nError=select(1,&FDS,0,0,0);
3 N; N. }8 w* i2 l" v2 [4 \- x2 ~      if(nError<=0) Terminate();
) x- p; N5 O( }) q3 X& I      SOCKET m_AcceptSocket=accept(m_Socket,(struct sockaddr*)&client,&nLength);6 @  z' F3 e) P" [
      if(m_AcceptSocket==INVALID_SOCKET){1 K; J5 D4 t) Q, d/ \- F
         sprintf(szTmp,"Failed to execute accept,error no:%d",::WSAGetLastError());2 u& }; R  q& t* f. d0 W4 w
         ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);
" b, U: V4 P/ h8 z0 E, p6 i) W: M0 a         DoError();. o  E* x1 m$ p- Z0 z4 I: k! @7 a" @% `
         Terminate();
  N/ \# n) p+ l1 N. m$ k8 w& @; J         return;8 P5 ^4 n% ^4 F& n( B
      }6 q( g! g" j# G, @$ E
      TCommunication *pCThread=new TCommunication(m_AcceptSocket,FALSE);8 C/ e& n6 s/ h; i) X1 p
      pCThread->Terminate();; O5 x$ p0 ?8 x' l- u
      pCThread->WaitFor();
% ?8 a# M! r, {: {4 {   }
, c! P& J# K+ i/ D1 G/ Y}
/ g4 h1 l  C* _( n1 d: m/ R* P//************************PSTNForm*********************************************//
: o; o, d) T5 e" Y2 t' @2 S4 o__fastcall TPSTNForm::TPSTNForm(TComponent* Owner)- P$ b, y) ]$ j( ]( T) p
   : TForm(Owner)! q6 d: X! o: B7 ?8 x0 J
{: o8 S; ~* P1 c
}
) n+ ]" _7 M1 C) l$ x( T  P* \$ Gvoid __fastcall TPSTNForm::Button1Click(TObject *Sender)
, y" J8 }: ^8 \3 f( `{% y( Q: I6 i! [; a
   Close();
' L% \6 ?# i% Q% A5 Q, w}
2 O# j* @' @- H; x- s5 O* vvoid __fastcall TPSTNForm::Button2Click(TObject *Sender)
9 R3 M. g) `7 C6 F3 D{! C* ?4 x4 w% b$ ^- ^# ?! l* Y0 h
   if(pThread){
" x! L( h; k' f5 [( r; Z" X      pThread->Suspend();
9 b" j. _$ b  \      pThread->Terminate();9 t; z7 ?7 B% l/ ^- ^" I3 n
      delete pThread;
4 F; A& {8 E& w5 Y      pThread=0;! H+ ^8 B" s+ B
   }
9 z1 @# \' `3 Q# D" v0 ^   UINT m_Port;
! I( v' F' z- V   try
/ ]- _, f0 f/ \$ N6 m& A" f0 }   {
- g8 O; X' g9 f  V% Y* \0 H5 ?      m_Port=Port->Text.ToInt();" y( a) c8 P5 M4 f
   }+ k# `1 D( r7 k7 f- L
   catch(Exception &e)
4 u( }$ g7 ]* [5 u   {) u: o4 {' V  x6 A( t* Z, |
      ::MessageBox(0,e.Message.c_str(),"Error",MB_OK+MB_ICONERROR);
5 r' X2 \$ j1 i6 M5 a) W6 Q& \  ?      return;: L+ |" l4 s# V6 r
   }$ Z1 I! b+ l5 c% O* U5 Y
   PROTO m_Protocol;
/ k" }% l) L0 n8 E   switch(Prot->ItemIndex)& y. B! D6 o, p  g1 ]$ c. j
   {
$ v4 t% T' f+ G0 ]: A3 c      case 0:
5 c. ^1 P9 O! h5 C$ W' f0 V         m_Protocol=TCP;4 K4 `" h$ O6 J% {: v9 o# k) D
         break;* ]0 ~% _2 Y6 z
      case 1:
% N. J, F* x5 C% r         m_Protocol=UDP;
2 Q  D  V' j- y* `; V2 A# s         break;! \5 z4 A9 H; N. G8 |! \0 B
      default:
/ t; H+ ^- j% Z5 D9 Y         break;- O& e$ M8 J/ t6 R  e# b/ _
   }* h# f8 v- W3 ]9 R, W
   pThread=new TListenThread(m_Protocol,m_Port,FALSE);
/ @3 w5 ?( A6 M& V9 R/ T3 Z+ M   //pThread->Terminate();
! s9 ]8 Y9 n' a}: }/ q7 o7 \. N
void __fastcall TPSTNForm::FormCreate(TObject *Sender)5 w, m) e# X* H" {, y8 |1 E
{' e- k* ?6 D8 [; c$ q
   ::SendMessage(Prot->Handle,CB_SETCURSEL,0,1);
' ]7 N# Y* \) y$ {" Z; ?  v: _}8 T% A* V" e/ ]& w; c. j% I( K* W
0 v. ^. x( q+ }% ~6 N) _- _2 x1 H
void __fastcall TPSTNForm::FormDestroy(TObject *Sender)
- k" b* u; ]. i  `% s) m" q{. M: j4 [4 R& u$ U; l
   if(pThread){" F" E$ K' z8 s9 M$ ]
      pThread->Suspend();! Q% {$ a# t  J& e, K+ Z
      pThread->Terminate();}% W* `" |# ?  }' ]0 |) U8 c
}8 a: T- b* L. V3 @
上面的代码,各位可根据自已的需要和针对自已的应用,在数据处理方面加以改进就可以了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-5-5 09:10 , Processed in 0.017205 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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