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

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

[复制链接]
发表于 2004-2-15 14:01:13 | 显示全部楼层 |阅读模式
在CB中用socket api来写网络通讯程序& k7 N- u' E# i8 d) ?
作者: kingcaiyao ,如转载请保证本文档的完整性,并注明出处。6 I& ~4 h; P/ n) z/ U
欢迎光临 C++ Builder 研究,http://www.ccrun.com/doc/go.asp?id=5693 A9 e- {$ b1 t9 |. F5 x
本文转自csdn,作者:kingcaiyao
+ e  r0 `, u8 w6 R; J% h" e/ C原标题:在C++ Builder中用socket api来写网络通讯程序(同时支持TCP和UDP协议), t# n4 q: q* s/ ]
原文:  http://www.csdn.net/develop/read_article.asp?id=19883
( [/ E; h) U2 p+ s; r# i' E1 J8 o: R/ u' ?
4 V. a4 S5 b7 \  _3 T8 e1 {4 ]
在7月4日看完sockcomp.pas后,我决定用socket api来写一个客户端和服务器并且同时支持TCP,UDP协议,于是我就去做,现将代码贴出来(已调试通过)  h. m$ E# }5 U' E6 M4 K
Socket api Client:
+ g0 W: F1 J( t& t- o7 M! q+ G6 `7 W7 ?( {
#ifndef UDPClientH, f* Y& C5 z5 J1 @
#define UDPClientH1 t/ [; ~' z; s1 W; v/ h
#include <Classes.hpp>* G- _' N  }0 T/ h+ N; k
#include <Controls.hpp>- d4 ~9 z* i1 H0 b5 o
#include <StdCtrls.hpp>" _1 K3 N, e. z! [
#include <Forms.hpp>) a( F3 d) t6 E" z
#include <stdio.h>1 ^! K4 T8 Q! D% V. v( O# s
#include "CCEdit.h"
' z% U& m* _3 c; G$ @% b5 D#define WM_SOCK WM_USER+1002 [- H9 c8 G: W2 ?" h: `( l
class TLANForm : public TForm
" }9 m4 P% }9 c. A2 E{6 x8 a" r. w3 y, Y6 {* \  |
__published: // IDE-managed Components8 h" q  [, Q4 ~, `4 ~; ?
   TEdit *Port;
6 N3 S  ?7 C( Z, b   TLabel *Label1;
# }- o" x  E3 s9 C- }- ~   TLabel *Label2;
7 r+ q9 D% t$ B1 ?. ]   TComboBox *Prot;4 l* I: J8 Y- s( b
   TButton *Button1;& t9 y& A; B% N& F: `
   TLabel *Label3;
4 j# I+ B- E2 i   TEdit *Addr;
! B( R; V( X- d5 o9 O2 K/ a8 L  r   TCCEdit *TxtEdit;
: w8 Y+ X8 Q( Q& P  Z   void __fastcall FormCreate(TObject *Sender);0 d6 H4 p- [/ ^" }' O" d. \
   void __fastcall Button1Click(TObject *Sender);! D( \$ G8 Z) K8 m5 b: n
   void __fastcall FormDestroy(TObject *Sender);+ y2 G. u& y& T# G
private: // User declarations0 m$ p& F5 T; h9 `4 l
   void __fastcall OnRecv(TMessage &Message);
% F7 h3 x8 J, X* d" g0 Lpublic:  // User declarations
: j, V8 F. s. U   __fastcall TLANForm(TComponent* Owner);- O2 u" u* W$ e  F
   BEGIN_MESSAGE_MAP2 n  m$ T4 w$ a% R
      VCL_MESSAGE_HANDLER(WM_SOCK,TMessage,OnRecv);
' u* q1 R# f/ ]7 m  O! F   END_MESSAGE_MAP(TForm);. z8 r3 q- Q( E: L
};
5 q/ E9 v* j" D7 D- Zextern PACKAGE TLANForm *LANForm;6 g4 j+ Q* ~& Q. x
#endif" x0 [- \( _; r, {+ x
$ b+ h7 V9 m% B# {9 v4 r. H, |

, @8 Z! W. |! G2 [$ G, C.cpp File
# n- n2 i! Q( P4 K# P% M
( |5 x4 H8 H1 d& _5 v6 u  g9 b#include <vcl.h>7 O4 X( C; i+ ]8 E! F, }
#pragma hdrstop( B7 ?$ k* k& R! q
#include "UDPClient.h"
) _8 Q1 \) F. H: r; |: R#include "WinSock.h"
# c$ E4 m4 k/ b" \6 E8 a#pragma package(smart_init), w6 f5 x" E* M6 d4 i1 a
#pragma link "CCEdit"$ \( _% b5 [7 }! P
#pragma resource "*.dfm"3 E3 i. {  x1 ?* m8 `% c
TLANForm *LANForm;) B  ^/ C5 }5 Q' J4 w0 N" H$ e
enum PROTO {TCP=0,UDP=1};& g! G% c8 P, r
SOCKET m_Socket=INVALID_SOCKET;7 y6 ?7 h' Y% a
PROTO m_Protocol=TCP;1 y% O1 N1 b: O# B+ ~% h! |
__fastcall TLANForm::TLANForm(TComponent* Owner)
( t& w$ a4 u( S' K: e. m   : TForm(Owner)
) w( _/ i* R0 h{
7 m# a. F* D1 O5 @4 H- d$ k( k4 E# e& C/ J! U
}
0 _6 Y2 q" [" n! _0 ^; w: M4 o: Rvoid __fastcall TLANForm::FormCreate(TObject *Sender)8 H1 b, b) G) }) d; l- e2 K3 p- j
{
1 T/ r& y- O' y; G- j$ O  W; i- l   ::SendMessage(Prot->Handle,CB_SETCURSEL,0,0);& @, k6 ^  g& V2 Z+ ?- M2 {1 `, S
}
, I# d& i1 p. b- |: Q' P' J7 cvoid __fastcall TLANForm::OnRecv(TMessage &Message)
( y5 p. m8 X+ d{
5 g; ^+ b+ m, Z" k( v" W! S& Y   char buf[4096];
1 W$ f8 [6 \0 _. A+ }   int nLen;  R. \% I8 Z0 O1 b2 m3 e
   struct sockaddr_in from;
2 i0 |- B# M' n/ G   int nLength=sizeof(struct sockaddr_in);9 }; H5 t( ]/ N" e3 B9 f! j
   switch(WSAGETSELECTEVENT(Message.LParam))
% a$ r/ {) {% ]' F% r9 r, s# i4 L# C   {, V% ]' B" J* P; L5 E
      case FD_READ:5 l! ^( k' o, C5 w5 m' r
         switch(m_Protocol)
0 N7 e4 F# I' \3 v+ Q         {
, n8 K6 U6 {) H# ^5 `7 N            case TCP:
6 J5 |/ p; S/ u! f' E( e0 n+ q- V               nLen=recv(m_Socket,buf,4096,0);
: G( }" }! z4 K6 v; c# N               if(nLen>0){, d- r8 q6 ~4 q9 m, f$ t$ W
                  buf[nLen]='\0';
. A' }, H, G, d8 M$ m" _/ A                  TxtEdit->Text="Received Length:"+String(nLen)+"\r\n"+StrPas(buf);
# m' T* i* [" u2 U' |               }; P# E: m; S% k: B; J
               break;
7 [# |% G; Q, o0 d& _            case UDP:6 T) [% x& i4 y5 v0 c, h7 _# C
               nLen=recvfrom(m_Socket,buf,4096,0,(struct sockaddr*)&from,&nLength);
4 X1 |6 y! g9 T) N8 I$ X               if(nLen>0){
) m" d: H2 N+ p8 B                  buf[nLen]='\0';
% m. G# p% }- W, X                  TxtEdit->Text="Received Length:"+String(nLen)+"\r\n"+StrPas(buf);$ c( D! y2 Y; \
               }
; u' J5 \$ ?3 D- J! w& p% r  E- w               break;0 {+ J4 |+ R, Z; d5 B* ]
         }
  @& O, D% ]# c! }& c, z         break;  v$ M2 z+ k  S3 e( _% @
      case FD_CLOSE:' _) d/ ~; c4 m0 X1 U2 I+ o
         closesocket(m_Socket);
/ K+ _/ V- M  f' Z) k0 K4 M* R         break;
4 D" |9 {9 f6 g8 {7 N) T   }3 r, V: [: {3 i
}4 [+ ~8 n7 e# t( ?

( ]9 y" G& Z. G4 {8 d* lvoid __fastcall TLANForm::Button1Click(TObject *Sender)7 i' V1 _7 `, w, z3 `2 _
{. w) t- W# L. e+ k/ E
   char szTmp[256],buf[4096];! @# g* I( p5 ]/ N2 b  c; ^3 L5 P4 _' Z
   int nSize=0;
! R2 Q$ D' j6 D4 c- E   UINT m_Port;
! B/ C& Y" G! A* g( ~) G- F/ a0 |   AnsiString addr;5 ?) R. M) K3 b9 M' _2 J
   addr=Addr->Text.Trim();
, k( t0 R% q0 N' i  X   if(addr.IsEmpty()){3 o) b$ q9 X! M' O) j
      ::MessageBox(0,"lease enter the server IP!","Error",MB_OK+MB_ICONERROR);2 h6 w4 A3 ~/ g
      return;
8 T9 ~. c' |* {   }( J3 J0 A3 {8 t9 S
   unsigned long nAddr=inet_addr(addr.c_str());
$ C0 t- ]4 w5 J1 H. l8 P' I/ N   if(nAddr==INADDR_NONE){; l: ]! U) _) D. I$ `0 e9 v1 D) x3 o" g; P
      ::MessageBox(0,"Bad Internet IP!","Error",MB_OK+MB_ICONERROR);4 W3 a, k6 `& Y$ R
      return;}
+ q1 Y5 E/ _* g# c- f( Q, c& z7 H, v: m5 I2 P
   try
4 j! m' R! J* S. y! s8 H$ u   {
. ]' I" G2 j/ b% p$ C8 l      m_Port=Port->Text.ToInt();
9 A' \  B  k/ j7 U! h( z   }4 u' n0 v- b5 @) W6 M0 ?  f
   catch(Exception &e)$ M7 v3 S8 S' G! g1 p
   {
0 ]$ T" q+ l: v0 v, N4 Q4 S      ::MessageBox(0,e.Message.c_str(),"Error",MB_OK+MB_ICONERROR);! O3 ~2 m7 Z6 M; X  W; n
      return;0 X: S2 T& @: c: Q2 `: W
   }
: V. s! ~; A* z   switch(Prot->ItemIndex)
3 I- w9 v7 F$ W4 r' N1 `- n   {
- P4 W  i3 n! y0 U      case 0:
2 P/ \6 ~5 E9 x! O% X         m_Protocol=TCP;' f+ [1 B/ @0 ^% [& y1 b7 x
         break;
4 m9 C; P1 A0 c, Q      case 1:+ F+ ~' X- [7 b/ j+ l2 e& @2 h
         m_Protocol=UDP;
- p+ \7 c; A" C. G3 m$ \         break;
3 D6 U4 I- g  @  {. M! @2 _   }+ Z7 P/ O, `4 \) X8 L# h
   if(TxtEdit->Text.IsEmpty()){3 `& r9 H8 O# q2 |( H( l- R  _
      ::MessageBox(0,"lease enter the text you want to send!","Error",MB_OK+MB_ICONERROR);- s  C. ^" D: N1 Y
      return;}" E$ P( W6 _8 z: |/ x

  x4 p( v" |* b% P$ }   //Initialize Winsocket( z2 V! O# l; h" G4 _& a$ s
   WSAData wsaData;2 G9 M, `7 K+ X0 n# M0 i3 D
   ::ZeroMemory(&wsaData,sizeof(WSAData));
- f( a5 G8 ?3 g2 \$ ]   WORD version=MAKEWORD(2,0);
" l$ k8 C; P, Z/ K' Q4 O   if(::WSAStartup(version,&wsaData)){
# Z  g2 h: O6 z9 h4 W/ P% M      sprintf(szTmp,"Failed to initial winsock enviroment!,error no:%d",::WSAGetLastError());
- i& d; ~9 K3 l      return;}' O' ?2 f! N) `' K4 c

! k! k0 ?1 K4 N* Y   //Obtain the active connection
8 B- m5 `2 G( D: c( p9 [$ h+ e   char ComputerName[255];8 d9 P+ Z; S0 `
   gethostname(ComputerName,255);
3 {8 B+ p4 k8 @$ S   struct hostent* he=gethostbyname(ComputerName);: C4 h5 p# [! f
   if(!he){
; ]6 J3 y( ~# e7 n# `      sprintf(szTmp,"Failed to get information to host!","Error",MB_OK+MB_ICONERROR);  ^. p/ E7 i/ }  t+ D5 W
      ::WSACleanup();2 ^& E! ?1 r' l6 a1 j
      return;6 P3 z) I1 l* s- o' a, W; i# L3 }" O
   }
* I! T1 x5 h! @8 ^& |2 _5 U/ o; k   //create new socket- d* l* g) b) D1 R; e
   m_Socket=INVALID_SOCKET;
- b. |/ `2 c/ N. y/ H0 h) W; m   switch(m_Protocol)6 j# F. a+ T3 f  a! s% }
   {4 G8 m7 ?/ |3 |
      case TCP:
& X# `* g8 p6 ]& A: D         m_Socket=socket(AF_INET,SOCK_STREAM,0);
6 C$ J9 T5 z; S         break;4 [/ k8 z% B8 ^  r8 S% H
      case UDP:
' M! W  e1 O3 B" I. s. ]         m_Socket=socket(AF_INET,SOCK_DGRAM,0);+ k9 x1 Q  v( x3 |$ `8 s. f
         break;/ n+ Y! S3 O& f  Z/ j- s7 F4 G: J
   }( j  |. g5 x$ G0 }
   if(m_Socket==INVALID_SOCKET){9 r- t: z1 e1 S) |# m
      sprintf(szTmp,"Failed to create a new socket!,error no:%d",::WSAGetLastError());
% W) c/ D  s' x' q0 ~, w      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);
) ]" ~$ ~/ q- l% _; ?- @% F5 ?& p* H- @      ::WSACleanup();  q% y& ?3 S  x7 X
      return;
0 |4 s) V+ U+ L" e, Y+ t9 r+ h   }/ y3 G& C0 H" |6 C3 O' G# A
   //bind socket2 B! y! ]- y4 h
   struct sockaddr_in client;0 Y( o- ^; ?: L/ Y& J& ]( h! o
   unsigned long nClient;
1 Z/ I! a* @( b, b: U   memcpy(&nClient,he->h_addr_list[0],sizeof(int));
1 x9 P" }5 I8 x' t/ f% e   if(nClient==INADDR_NONE){) h( `; t  p3 a9 P9 r
      sprintf(szTmp,"Failed to obtain the local machine's IP!","Error",MB_OK+MB_ICONERROR);
& `) x! g+ G5 ?( {      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);
+ Q0 l7 @3 y# a      closesocket(m_Socket);3 A* J+ a7 n+ n) P: I# K( N/ O
      ::WSACleanup();- L" g0 `" |  ^4 [* C
      return;
2 |0 T& O2 K% Q   }
% x+ v) Q9 A4 d% j. w9 J   client.sin_family=AF_INET;6 w0 X. p3 j& P+ S5 P
   client.sin_port=0;- T! }6 H9 a  d2 o" e% S# d
   client.sin_addr.S_un.S_addr=(int)nClient;% v3 W2 Q6 ]$ M% N
   if(bind(m_Socket,(struct sockaddr*)&client,sizeof(struct sockaddr))){
$ c; i, l, s: V  k2 {* W  ]      sprintf(szTmp,"Failed to bind socket!","Error",MB_OK+MB_ICONERROR);' z: Q6 n8 U4 @4 W3 U. l) R
      closesocket(m_Socket);5 `1 n% P. l# k# ~
      ::WSACleanup();
: g) n5 \5 R! E* W) ]# m7 M% W      return;}
1 C2 A. {4 ?/ `" ]7 g0 d( o   //connect socket
+ t/ e' |  g4 r0 k$ e   struct sockaddr_in To;
. N  ]7 }& x- _2 s8 }# `1 H   To.sin_family=AF_INET;
7 E6 e7 h2 F$ |( A& d* w  A& H   To.sin_port=htons(m_Port);
+ M: z5 X+ q, Q* ~% x   To.sin_addr.S_un.S_addr=(int)nAddr;
9 z0 T  D0 p2 Y/ b0 ?5 w1 A1 B, Q; m   fd_set FDSET;' o9 h1 H7 P1 |/ S7 N7 \
   FD_ZERO(&FDSET);
7 U( |7 L! m( P1 G7 l$ P. F3 J$ F   FD_SET(m_Socket,&FDSET);# X( T( {3 D. k8 i$ {

3 u  ~- d5 }' L4 H7 r$ B; P  f6 @. o7 v+ ~* n: t5 t7 I
   if(m_Protocol==TCP){9 j/ C( _1 ~* z+ W% P, q3 O+ V
      if(connect(m_Socket,(struct sockaddr*)&To,sizeof(struct sockaddr))){
' V2 J0 n7 J  L9 o7 C         sprintf(szTmp,"Failed to connect the object!,error no:%d",::WSAGetLastError());3 K1 g' W/ G) q: |
         ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);6 V% L8 B. c* @3 B! K6 Y/ |
         closesocket(m_Socket);- e1 v' k. s) x) v2 p) y( H0 @
         ::WSACleanup();
" o7 F3 B1 B; d, ?! N4 r& T, H% s         return;
' |6 x; {6 r# i; `  p& B      }; y2 L+ z* ]  g. E) k+ {7 I
      int nError=select(1,0,&FDSET,0,0);. a1 q9 U4 S2 V& \, i0 {
      if(nError<=0){
/ n* Z2 p$ L2 v0 `# K8 Z      sprintf(szTmp,"Failed to select socket!,error no:%d",::WSAGetLastError());% D+ @: V; ]/ H! E# a; c
      closesocket(m_Socket);- w2 R3 m$ u' P$ J( o7 b9 J1 g; }
      ::WSACleanup();, d2 f  e4 J# n: D, r0 m5 Q; o0 e
      return;}- k& @3 r; s6 C4 K
   }
, E0 S! o) s; w- {   //Send data
2 C" v8 x( j( M9 i( m/ c   int nLen=TxtEdit->Text.Length();: q4 d# w7 C" C
   if(nLen>4096){
' g3 f7 `; B" m  s/ y; e: a+ H6 Z      sprintf(szTmp,"The buffer is too size to send,it shoud not be more than 4096 bytes!");; ~# X7 Y7 z" a4 J5 t
      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);2 X% n: I% T; N! ?: ~- s3 k
      closesocket(m_Socket);7 L+ Y' c4 g& v& H2 w; O
      ::WSACleanup();
* [/ X6 z/ y6 r5 L. t# N      return;
3 Z' P* X9 s% A. E, w/ J7 [   }
3 _+ D1 n" c$ z1 G! h* r   strncpy(buf,TxtEdit->Text.c_str(),nLen);
+ H( S8 b/ @9 Y' y2 p   switch(m_Protocol)
! I3 W0 B1 p" e) F& L- Y* h- D   {3 Z8 w5 L8 ]. p% Q+ `/ `+ c
      case TCP:# P3 j) m8 q' |) k3 {* U
         nSize=send(m_Socket,buf,nLen,0);
3 t. T/ ~: o% ^, Y2 d0 ?         //ShowMessage(nSize);' H% N+ z. l% H8 e0 s( L
         break;
2 u1 ~/ {$ s, i( F      case UDP:7 }$ c( y0 d. L7 t* e: s( h. i; B
         nSize=sendto(m_Socket,buf,nLen,0,(struct sockaddr*)&To,sizeof(struct sockaddr));- X, A* ^5 y+ ?% \
         //ShowMessage(nSize);* u# b4 I( {. Z8 r  c# t) F( z6 \
         break;
% F, a. x3 q( j+ u) N# o/ {0 k; ^
   }
7 |2 Q: r5 q2 A" D+ m" }   if(::WSAAsyncSelect(m_Socket,Handle,WM_SOCK,FD_READ|FD_CLOSE)){
( u8 Q. v. X2 O/ R  q5 L. A8 x* }      sprintf(szTmp,"Failed to register socket event!,error no:%d",::WSAGetLastError());
& [( N4 U* f9 X) x. e      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);3 ^( O4 i. ~+ A5 r, e6 y4 r
      closesocket(m_Socket);% T" J' E. o! W) r# T8 T
      ::WSACleanup();6 r: l% Q: Y* Y7 b- f% g
      return;}. R* Q' i0 v! ^0 H
}
. v" {% g# W$ r  U  M  A" c5 ?void __fastcall TLANForm::FormDestroy(TObject *Sender)
9 l' P' x. ^) m8 C: u5 z9 n{
5 ^: ]. F( F" i' G" R   closesocket(m_Socket);
8 p& L* S( D+ W' ^7 m   ::WSACleanup();; x1 |* m  F. T1 E" l
}
" @( Z. _: Q& L3 W* o: _0 w4 T8 `9 Q" A( s; ?
Socket api Server:) D' ^( I5 H+ C$ C6 ?5 g% _
.h File5 h9 G! w; a$ t
#ifndef UDPServerH
& c: a# M2 T# Q* g4 U6 S#define UDPServerH9 N! d/ F  I; v& P: R0 B
#include <Classes.hpp>6 c2 W- W( t+ A
#include <Controls.hpp>/ R) l# t% `- A, _
#include <StdCtrls.hpp>5 J- e" J9 u. k4 e
#include <Forms.hpp>
! I- w7 l/ C" e  d#include <stdio.h>
: D2 v) s' x4 _( V: ?9 h# v#include "WinSock.h"+ p' E; a/ h! P# z
/*#define WM_SOCKET WM_USER+1000
+ I6 H3 K3 y: Y* Q4 j9 t! V#define INITSOCKETSUCCESS 0
3 E# u& y3 i3 m0 K#define INITSOCKETFAILURE 1( m" d: j( C" y1 h
#define CREATELISTENSOCKETSUCCESS 2
9 w+ p8 N- i5 o#define CREATELISTENSOCKETFAILURE 3
# h! M: A" h* c8 `#define SETLISTENSOCKETSUCCESS 4
9 A) \% u& k8 b( v#define SETLISTENSOCKETFAILURE 5
& e% ~! h9 D$ d4 }& D- ]' ?#define BINDLISTENSOCKETSUCCESS 6
" b/ |1 w) A) m) Q" j2 ~#define BINDLISTENSOCKETFAILURE 77 |6 t) s9 e1 ]4 t+ [3 \# x
#define LISTENSOCKETSUCCESS 8' j+ ~, f* I0 [. E* r
#define LISTENSOCKETFAILURE 9# ~- {' `+ g3 ]+ {5 l5 T/ }8 c$ w
#define ACCEPTSOCKETSUCCESS 10
' z+ E. r' G3 _0 i3 c  J/ ]- C8 A#define ACCEPTSOCKETFAILURE 11
; r/ o3 D. ?3 t; H( `* |. `& p9 V2 A*/
* v( D  Q0 _; P% G; `class TPSTNForm : public TForm
$ {3 ~, j) g8 m7 i; ^* g+ p- |3 N, Q{
) v+ Y$ s6 ?' d- `__published: // IDE-managed Components
# g4 o+ T( G4 e5 I( |1 q0 O   TEdit *Port;$ d$ _; O% a. }5 l  F
   TLabel *Label1;
# z+ P  P8 n2 i2 z) ]1 `  O   TMemo *Memo1;
9 V: O2 R  s2 K   TButton *Button1;' f' s* S. V# t
   TButton *Button2;
5 a% m3 m4 t: H   TLabel *Label2;6 i, u; t$ L$ r# K- a) u7 K
   TComboBox *Prot;
8 S) }# ~" _8 d1 V. D  b7 A% a   void __fastcall Button1Click(TObject *Sender);
  _; U5 ~' n; ]: ^0 L* m9 p7 N   void __fastcall Button2Click(TObject *Sender);
8 g5 G( `) M2 B7 B: W   void __fastcall FormCreate(TObject *Sender);
  l" L4 X2 p: y+ g# V/ w   void __fastcall FormDestroy(TObject *Sender);3 t5 l0 w% e' J# r
private: // User declarations
& }7 B- ^: y7 k, Q2 e0 Hpublic:  // User declarations
4 H- T! Z9 o  f; R5 J4 J0 U- f. `   __fastcall TPSTNForm(TComponent* Owner);$ K* b( X/ i$ }% z$ \; `5 E+ N6 m
};5 F' `7 k: N6 z" Z0 ~- F+ k
enum PROTO {TCP,UDP};
- \( |3 M- c- Oclass TCommunication:public TThread    //Communication Thread1 e0 s5 k$ y& V: J
{: f) r; C: H! [- Y/ }
private:& K; ]; w; f- H0 E5 g5 v$ y$ c: q5 S
   SOCKET m_AcceptSocket;
% P1 e9 U( F. @   char szTmp[256];//ERROR MESSAGE
6 P+ d+ o' p4 q) H1 V* _2 e" Ypublic:
6 Q+ ?8 G1 x0 e6 m, a& n. F   __fastcall TCommunication(SOCKET m_Socket,bool CreateSuspended);
8 S8 q0 N' @2 }4 a2 W) Q& P0 ]   __fastcall ~TCommunication();
% Y7 `2 _" b- R* G! x: \+ f9 ^0 Gprotected:
6 ^- I7 H$ b9 B! W1 Q- s) u; q2 A   virtual void __fastcall Execute();& Z! ^- v# s! U% e7 C6 x% g' w
};
" P, H* v9 f* E, q8 \# Fclass TListenThread:public TThread //Listen Thread
. p0 s4 R  O2 E$ o{
' P! V1 Z2 A$ Q2 Aprivate:: q. V& a) |9 |  B
   WSAData wsaData;9 _/ |1 @* h' }+ P
   struct sockaddr_in server;& q: T, T" L: N% u+ C) k
   fd_set FDS;, [0 j. u: d& X9 Z/ N
   UINT m_Port;
' Q$ [& d6 c7 w& T   PROTO m_Protocol;
7 A( W0 \* S4 H   char szTmp[256];//Error Message
9 l" _; {; H' l- v) X4 E1 d3 j) vpublic:
/ w7 X1 B, a6 x8 y4 d' C   SOCKET m_Socket;
: i" k. Y* P/ ~   void __fastcall DoError();
* Y7 m- I. T" ]   void __fastcall InitSocket();# i0 c) c0 Q0 v/ W" o
   void __fastcall CreateListenSocket();
$ h% X/ \' I# p+ Q   void __fastcall SetListenSocket();
" h' Z0 S. K1 }4 \   void __fastcall BindListenSocket();
# P. N# y& Q: m, j- @$ n9 G   void __fastcall ListenSocket();) b7 r6 N( @4 y* B1 M. M& \

6 g3 N  @: f! z' ^public:3 B' v2 B& C: ?  O- n( D
   __fastcall TListenThread(PROTO m_ProtocolA,UINT m_PortA,bool CreateSuspended);
& N, o3 Q* G/ _4 ?8 g1 [$ y   virtual __fastcall ~TListenThread();
, o) ~  s9 V0 ?  R' Xprotected:
! ^9 L9 K6 v8 J3 u& R   virtual void __fastcall Execute();7 Z+ x: N0 F- C+ |) p1 j
};: F, |9 Z) L& g0 k" o0 E6 ^
extern PACKAGE TPSTNForm *PSTNForm;0 |+ F4 q: J5 d8 c5 a6 Z# V: c
#endif% ~1 P7 j" ]  m5 h, ~% O, E$ F6 ?2 l+ C
.cpp File; M$ O: k% w1 i, F
#include <vcl.h>
7 l' Y' h) M% n#pragma hdrstop5 K- \+ Z) |% J
#include "UDPServer.h"
/ v" i' n2 X1 k" b5 z#pragma package(smart_init)
) F3 ]6 q8 R, C! q. I3 l#pragma resource "*.dfm"  y9 ~1 y, {. a$ a
TPSTNForm *PSTNForm;
7 F& J4 l) Z  E: |  |% w3 m5 }TListenThread *pThread=0;
2 k( N* y4 W7 b6 J, f//******************************CLASS TCommunication For TCP****************************************************
: Q. g& H/ Y0 w7 `; i% A2 T__fastcall TCommunication::TCommunication(SOCKET m_Socket,bool CreateSuspended):TThread(FALSE)- V" x  @  b. ~( e& T2 B- K
{* b, x! c; X4 K- J
   m_AcceptSocket=m_Socket;
8 e( w+ I5 {6 d8 i8 E9 v) P# [   szTmp[0]='\0';' T! d; E* p. W, h9 q) s9 ^
   FreeOnTerminate=true;2 f: i: {$ p" r3 U5 a0 |( |
}
% T* N4 ^4 w8 i- W5 u  i__fastcall TCommunication::~TCommunication()/ {6 `* R3 ?' S- b3 M% b
{
6 o2 c6 a4 X8 J& H: d- n9 [  // closesocket(m_AcceptSocket);0 q" M' E" z$ p3 p* y
}, l/ R+ v8 {, @4 y
void __fastcall TCommunication::Execute()
$ K9 d7 }& L, n{
2 n' R" \' a- R$ J1 ?6 t( Z- N   char buf[4096];( t9 R0 M; E/ Z" H+ n
   int nSize=0;
& k; ?/ B# x, H1 Y2 o; u& t+ V. Q   nSize=recv(m_AcceptSocket,(char FAR*)buf,4096,0);  ]) z5 l# c6 @" h* E/ g
   if(nSize>0)
2 _  r: o0 k, O+ f  G% V   {- _6 U" i. A8 k' d. E# L
      buf[nSize]='\0';2 x" K: d4 x; u7 x- \9 G
      //Display, a% o% Z. j6 k6 ]
      PSTNForm->Memo1->Lines->Add("Received Length:"+String(nSize));
) m  J; @, Q  q5 p  _( }; X      PSTNForm->Memo1->Lines->Add("Received:"+StrPas(buf));
" [( ~/ @5 A' ~      //Deliver0 W  ?% {! z4 t* ^" G+ Q9 [( `
      ::Sleep(100);
/ T, U1 C/ R* m- U& m, ^      send(m_AcceptSocket,buf,nSize,0);
1 ^2 `: {* B$ M% [( `( X' i$ i   }
6 |1 n$ a/ J4 M: Z# `9 O  Z
$ Q1 B2 |4 n7 }* g+ G6 m4 H}
7 U( M$ E" q3 t2 \8 i//******************************CLASS TListenThread*****************************************************1 Y, Y. v/ i9 E5 \5 \+ c
__fastcall TListenThread::TListenThread(PROTO m_ProtocolA,UINT m_PortA,bool CreateSuspended):TThread(FALSE)
+ G2 r+ E3 i8 ?' G* n{1 `4 ]+ M' T: {# B4 @9 g6 h* v
   m_Socket=INVALID_SOCKET;: ~5 i+ W. q# r* n6 c! g9 ~
   m_Port=m_PortA;1 m$ N9 R+ m. A; [. z! a
   m_Protocol=m_ProtocolA;
% B, m" _. p1 ]4 x3 h1 ^% Z   szTmp[0]='\0';" j9 A4 c4 a9 `3 W
   ::ZeroMemory(&wsaData,sizeof(WSAData));" h6 m, N2 H( y1 c
   ::ZeroMemory(&server,sizeof(struct sockaddr_in));) I" m% Z8 o7 }, o9 i2 k
   FreeOnTerminate=TRUE;//Automatically delete while terminating.
% M/ n9 a. X$ L) y4 X8 m+ s1 ^}
+ u) K/ `+ Z5 q: Q__fastcall TListenThread::~TListenThread()1 b, T# P# m5 m# I
{
6 V% i' Q! \5 C, B0 q/ Q   closesocket(m_Socket);/ g( x/ Y* y# a* [" P. M
   ::WSACleanup();. F9 }* P/ {8 l; O1 F9 j
   m_Socket=INVALID_SOCKET;
# u7 M1 H# t$ {& p6 r3 y  r' r  d   m_Port=0;
1 [1 W8 @% P+ U0 N   m_Protocol=TCP;
# C$ K) h/ a/ a3 d   szTmp[0]='\0';
) r& e! n& f) \  x3 N" A   ::ZeroMemory(&wsaData,sizeof(WSAData));
8 f6 H& w+ y3 z1 T! i$ S' ~8 A   ::ZeroMemory(&server,sizeof(struct sockaddr_in));
' x+ H; T! b  H2 c  |0 I9 \5 `}8 E# U9 \0 p1 T0 H8 i
void __fastcall TListenThread:oError()
, K8 U8 e9 K: {6 a{
) {1 T6 c- R5 g6 n3 R   if(m_Socket!=INVALID_SOCKET) closesocket(m_Socket);. F9 {5 N; g$ C
   WSACleanup();, F7 }  f" I) a
   return;: \' F2 m6 {* z2 ^( j, E
}: I2 _* t: J* Y3 a
void __fastcall TListenThread::InitSocket()
2 `  _! O. Z- L# ?{
" \5 B( K  h2 w   WORD version=MAKEWORD(2,0);+ T# z) g2 ?! S: J
   if(::WSAStartup(version,&wsaData)){
; r! r. P; X! i" }/ w* m1 r      sprintf(szTmp,"Failed to intiailize socket,error no:%d",::WSAGetLastError());  ^- n* z% C/ p+ z5 F. @9 ^, d
      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);
9 c1 l  G3 s$ P( x8 r- Q/ G      DoError();/ \1 A/ p: @' R9 d
      return;
4 f" R: `% z  _5 m4 R   }
) q2 k% N3 t2 n}3 Q0 |: P2 y4 F! i: e: u
void __fastcall TListenThread::CreateListenSocket()
# Q- f, ^2 _+ r' G! m+ e{
: d3 A9 T+ L  Z/ u   switch(m_Protocol)4 z6 J0 S2 ^3 {9 E
   {  p+ o# Y. T" ~: j+ d
      case UDP:' X, e  p5 o% y4 W1 U$ b7 |1 q6 i
         m_Socket=socket(AF_INET,SOCK_DGRAM,0);+ W. X5 t0 r' E; b
         break;
3 ]% c5 J' ], N( R/ K' a- Z      case TCP:! c- k" @- |; m! `: @" p$ |: C
         m_Socket=socket(AF_INET,SOCK_STREAM,0);
5 w* S, d' N0 a  q         break;& _4 Q3 ~1 E' K9 O9 e, u0 l! e
      default:/ W; e' f. N5 _7 \
         sprintf(szTmp,"Error protocol!");. M5 q  c7 D) H& y2 D! N9 P
         ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);3 Q: ?( o7 n- N2 \
         DoError();- F% U+ z; ^8 t
         break;7 @6 ?5 c7 k% I* }9 f7 }7 A
   }
( Z" ]" c( J, o3 ^7 s! a; ?) @8 ^   if(m_Socket==INVALID_SOCKET){
. q! @2 ^  l8 {/ p* T# @+ X      sprintf(szTmp,"Failed to create socket!");+ k* @: L) J* {+ c. D2 x' X5 o! v
      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);
. |) S! o' @4 ~( l) Z% w3 X      DoError();7 p+ s' c* h( i4 {4 A' J9 q: X$ y
      return;
: ~$ |7 D5 d' \, O: @: i   }& t% M  M# g3 e
}# w1 {. u$ B* `
void __fastcall TListenThread::SetListenSocket()" P! T; |- o/ t" J
{
( m/ o$ j) F9 a1 [# e   server.sin_family=AF_INET;
- i# R6 G3 |& H" z   server.sin_port=htons(m_Port);
9 Y. @) R0 x4 q, G# _   server.sin_addr.S_un.S_addr=INADDR_ANY;3 c: K9 e! R% g5 V# }8 b
   int NewOpenType=SO_SYNCHRONOUS_NONALERT;
. P' m+ m; {2 K* y; j( Z+ R2 X   if(setsockopt(INVALID_SOCKET,SOL_SOCKET,SO_OPENTYPE,(char*)&NewOpenType,4)){
* \' U+ l% |7 B# w% f      sprintf(szTmp,"Set socket option error,error no:%d",::WSAGetLastError());+ g# L7 u) V, ^8 B5 v: Q
      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);
# B# u# |0 N0 b6 [      DoError();9 X+ \+ Q+ |' N0 x6 C
      return;. ?3 o0 s5 O1 n
   }
0 `: k3 ?% v' t) I7 U7 A8 s1 J}2 x/ Z2 Y; G4 b$ T
void __fastcall TListenThread::BindListenSocket()/ @8 U) g3 q& d6 S, D
{' m( [( h: @  @5 n
    if(bind(m_Socket,(sockaddr*)&server,sizeof(struct sockaddr_in))){8 m$ m, p+ L( Y5 x6 g; B& r, L( @
      sprintf(szTmp,"Failed to bind socket,error no:%d",::WSAGetLastError());
. c8 `4 T& k# p; ^      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);' @+ p$ a4 F/ u" _
      DoError();
+ d% Z5 F4 A% P2 r5 H/ h. ?" |+ E      return;
: k+ F: T* {3 S7 w   }
9 N0 S" f6 E7 r" W6 A, Y" g5 B* i9 J9 R& M5 R- w! z
}
# k: u9 M8 h5 P  y7 W0 dvoid __fastcall TListenThread:istenSocket()
! I8 p4 Z" Q" a- x+ c{' X1 E9 R" f  F+ u( ]/ G
  if(listen(m_Socket,SOMAXCONN)){! z8 d9 O5 F) D- k9 g
     sprintf(szTmp,"listen error,error no:%d",::WSAGetLastError());
% s2 _2 I: z, [/ T; K, C0 x  {     ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);
& T& v5 w3 T0 D     DoError();: w# V& X& P- m$ ]; e( U& V$ X
     return;4 r. f2 K$ D. I& X
  }2 y, k% `, ?7 W5 y6 B
  //Determine whether there is any connection
7 U5 @. r3 M- V$ x  FD_ZERO(&FDS);! j8 ~5 ^+ C2 K. X3 ~6 i$ ?% Q
  FD_SET(m_Socket,&FDS);( c( G' E$ w6 B) @- [3 M
}
/ x3 Q8 ?  L# c5 h3 ^5 y! nvoid __fastcall TListenThread::Execute()  P# k: d$ d, k1 X
{; j) f* }* b& m5 a
   char buf[4096];
' c& c3 Q+ |4 r8 K7 c- ]   struct sockaddr_in from; //for UDP
! ~" F5 N, H- U: \9 P+ D   int nLen=sizeof(from),nSize=0;  //for UDP
* D, Q; L, e- n6 W0 T  v1 w   InitSocket();! x! S: z3 r0 C
   CreateListenSocket();
7 ?; N" S# E" G, n" x   SetListenSocket();
2 ?* t9 ?! s" k5 d$ w   BindListenSocket();5 s6 b! c2 k  p
   if(m_Protocol==UDP){3 U9 i' Y  s" e+ e; X
      while(!Terminated){
9 x, }# Q4 l' _         int nSize=recvfrom(m_Socket,buf,4096,0,(struct sockaddr*)&from,&nLen);* }+ D( L+ T8 Q7 J9 n+ [
         if(nSize>0){
& D+ S' e1 X; k7 ]0 X+ k            buf[nSize]='\0';
: Q$ u& R6 u1 f) b- m5 Q            PSTNForm->Memo1->Lines->Add("Received Length:"+String(nSize));+ S4 r) [' L9 E2 S% }4 R7 O
            PSTNForm->Memo1->Lines->Add("Received:"+StrPas(buf));1 @- k" L  t: R( b" n6 n( Y9 F
            ::Sleep(100);( _3 X7 r8 u2 m( d" {3 _
            sendto(m_Socket,buf,nSize,0,(struct sockaddr*)&from,sizeof(struct sockaddr_in));
7 s7 g, ~" a# P% \0 \7 e" ^, F- p- R         }
) Z- p% g4 ]# h8 j         else return;
3 X5 Y5 Y' Z, _# A3 Z# k, [* ]
* n9 Y, X  J+ A" z( p4 s, B5 c      }7 r& N7 Z2 p9 b
   }* |$ G) d8 N) T% Y! d7 ]" k. _( ~
   ListenSocket();
* ^# F& n) k3 @6 m. U% f   struct sockaddr_in client;
0 p" d5 M; t4 K1 B1 ~  D7 l   int nLength=sizeof(struct sockaddr_in);6 ]+ [1 u! z. i0 E
   while(!Terminated){
% x+ v" N6 G2 N+ u6 d( l% {      int nError=select(1,&FDS,0,0,0);9 E; B4 d; C4 X. P
      if(nError<=0) Terminate();
. r3 y  `' r$ B/ ~& }/ g9 ~      SOCKET m_AcceptSocket=accept(m_Socket,(struct sockaddr*)&client,&nLength);. n  O: |6 i* x, g. L. B
      if(m_AcceptSocket==INVALID_SOCKET){2 s" s  s5 i7 V
         sprintf(szTmp,"Failed to execute accept,error no:%d",::WSAGetLastError());# P  ]  m  a( g. B8 i; d$ N
         ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);: h& D/ y5 X" U4 P$ k& H+ n
         DoError();4 V, t$ |, {, y* L$ Z" h: g, w, v6 Z
         Terminate();7 ^, {: D4 t* x! x6 o
         return;
# i6 {& h& u, B; x+ I2 A: P      }
2 M  T+ ^6 W. D( [' X8 L      TCommunication *pCThread=new TCommunication(m_AcceptSocket,FALSE);
3 x: F% W2 ]. L+ ]2 K- X      pCThread->Terminate();
* h* Z& B8 N0 o      pCThread->WaitFor();
4 p/ E) b/ s% m1 g   }
: I* x8 C  b, ^) \, e# V% \; t}3 m4 x6 a6 C0 J% o( i" N* y
//************************PSTNForm*********************************************//
2 C" l/ a( X% q1 J__fastcall TPSTNForm::TPSTNForm(TComponent* Owner)7 S, c: j4 X  Z& d
   : TForm(Owner)
. g2 _9 S# [9 v, r2 ^, K% W8 [9 o{
1 G  G: s& |5 G. V}! u% x5 q% d/ h8 ^5 I- z
void __fastcall TPSTNForm::Button1Click(TObject *Sender)
" w9 b8 M. `) ?( A{  d6 w) b& `! q8 {9 f
   Close();
- u2 v! n, S- j6 y* b% M6 H}* L7 m1 U8 l4 V8 w% ~2 V
void __fastcall TPSTNForm::Button2Click(TObject *Sender)" x2 b/ i! e- L7 c
{
) P* V/ y; L( E' w5 |- _+ C   if(pThread){, `( b" L8 N9 |4 s" Z1 [2 S5 D, w
      pThread->Suspend();
. O/ y0 f" s! z# Q  g$ w      pThread->Terminate();" V7 |& q. o/ Z! s! |# j. ~
      delete pThread;' u$ `5 G0 g/ u' o: f
      pThread=0;$ x2 c, Q4 U2 D
   }. y. T' ]7 j2 O  q
   UINT m_Port;
4 Q1 T# ^" _8 W% G/ v   try
; Y  Y8 ^. [1 r5 e- G% J0 U   {
( y/ ~! H9 Z, O% b" h      m_Port=Port->Text.ToInt();
' B/ U! V  Y& I   }
/ f' _- N0 o& d: e% r# s   catch(Exception &e)! \* }+ F0 s' Z) a& B2 _
   {6 U8 L9 ^. l$ O8 l8 Z
      ::MessageBox(0,e.Message.c_str(),"Error",MB_OK+MB_ICONERROR);% ?; e. x3 F! x
      return;  g6 Z% Y4 \, x/ \) j( u0 ~; b
   }
' r) C$ |0 K* Q$ Q   PROTO m_Protocol;9 h2 I( V4 A! P. Y5 m  \+ N
   switch(Prot->ItemIndex)
3 m/ M/ x6 }, X! _3 Z6 w8 k   {
+ F7 b3 `( a1 U  k) `. v. w      case 0:
, J3 i7 ]' G5 S         m_Protocol=TCP;( ?) u9 H/ }$ L( ?1 R( c# _/ G
         break;- T$ a/ t$ [1 R6 K* D! D: m  ]7 u
      case 1:
! f0 D  W# T1 B         m_Protocol=UDP;# o# E& o2 M6 ?5 e" ], r
         break;
3 N: p& I2 E6 d2 n2 `2 o, j      default:" U. T5 @+ T/ _. Z  m
         break;# b6 O( f3 I6 z5 x& E
   }
. T$ i1 d: O+ Y0 B   pThread=new TListenThread(m_Protocol,m_Port,FALSE);6 m8 T: ?+ k6 U- R
   //pThread->Terminate();7 O4 q# g8 B; m
}& E# _' j9 c' `
void __fastcall TPSTNForm::FormCreate(TObject *Sender)
6 d. F- _) `( ^{  C  I  c& i8 m* N" U" S& J, K% `' k
   ::SendMessage(Prot->Handle,CB_SETCURSEL,0,1);( B' k( I6 W3 \. s! ]) N
}+ o' M' U/ _2 G) e
  \  l1 o( d' |9 l- Z2 i5 L3 e
void __fastcall TPSTNForm::FormDestroy(TObject *Sender)' Y/ o/ i5 r- W# B! R
{
% O2 T: c- Y" Y% u) {- |5 ?   if(pThread){
! o: W+ X& }, i: d      pThread->Suspend();
. u. N2 S- z; e; i      pThread->Terminate();}
  M9 W! t& g* Q( _6 j- X8 C}' Z" E. r3 b5 X
上面的代码,各位可根据自已的需要和针对自已的应用,在数据处理方面加以改进就可以了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-8-15 10:27 , Processed in 0.021138 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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