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

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

[复制链接]
发表于 2004-2-15 14:01:13 | 显示全部楼层 |阅读模式
在CB中用socket api来写网络通讯程序
7 U/ Z7 g9 F% p* a作者: kingcaiyao ,如转载请保证本文档的完整性,并注明出处。8 M( u6 D( ~8 ^3 }: B
欢迎光临 C++ Builder 研究,http://www.ccrun.com/doc/go.asp?id=569  C# h% t' F! \4 @8 U9 [
本文转自csdn,作者:kingcaiyao
; [. g) I% I" R) Z原标题:在C++ Builder中用socket api来写网络通讯程序(同时支持TCP和UDP协议): e9 `" C1 e: ?8 ~3 @
原文:  http://www.csdn.net/develop/read_article.asp?id=19883$ }$ a& E. [" k% c

4 o! \7 J# x* }& V, o) E6 Z) ]1 }* l4 b$ t) c) F/ D) w. L. V
在7月4日看完sockcomp.pas后,我决定用socket api来写一个客户端和服务器并且同时支持TCP,UDP协议,于是我就去做,现将代码贴出来(已调试通过)2 D8 ~$ `0 z6 _4 t! ]% \- L7 V6 g
Socket api Client:
  r( }' ~( Z1 K, b; Q: v. i, G8 F% x/ z" p( K+ u8 j9 W# o
#ifndef UDPClientH: L. K9 {: Z( S1 I2 A" }
#define UDPClientH
; Z2 a2 S  [2 _( b6 N' H#include <Classes.hpp>9 Y: g! n: b6 P6 h
#include <Controls.hpp>7 v# M" f+ F6 z7 s  {
#include <StdCtrls.hpp>2 g. @: K% z) H* i: I" C+ j2 I8 o
#include <Forms.hpp>
9 G' T. H$ G8 n4 {#include <stdio.h>8 M* W4 O2 K+ N
#include "CCEdit.h"+ V- y$ ]' T1 d: ^0 s
#define WM_SOCK WM_USER+1005 W' s! K/ @+ N3 N% ^1 B
class TLANForm : public TForm
6 E5 }& h8 l, ~4 \7 g5 B+ U{
  G* \& p' b: n. Q: l5 W& L7 E/ C- y__published: // IDE-managed Components& I& Y, `" H, o. R/ t* w1 A
   TEdit *Port;
: V, @0 |6 Y; u/ f5 N" V   TLabel *Label1;/ o: b1 m, E0 J4 i7 h
   TLabel *Label2;% l7 G6 q- N2 N" d; ?5 g
   TComboBox *Prot;* r) u3 Y- B" x& z% g
   TButton *Button1;" u9 Z4 h3 j+ d; H8 K
   TLabel *Label3;# Q0 l6 ?" D# g, w6 T" ?1 W; t
   TEdit *Addr;5 x* S; I* i; B' i7 g
   TCCEdit *TxtEdit;% s5 i! W9 L( Y4 B. V9 q
   void __fastcall FormCreate(TObject *Sender);
, h/ O' D# M" x) T0 ?1 R   void __fastcall Button1Click(TObject *Sender);- g' _* @3 g! r. f$ F; t9 M
   void __fastcall FormDestroy(TObject *Sender);" H! k- m* b' S! ^3 K3 M3 l+ ~) ?
private: // User declarations: F% S  A& J' D! H! \. l9 u
   void __fastcall OnRecv(TMessage &Message);9 q: s) ]1 {  ]: F; ^4 l- h
public:  // User declarations# e9 q6 W& b4 B% m' k9 d- Z
   __fastcall TLANForm(TComponent* Owner);
* h) {# x6 k% G! w# Q4 e   BEGIN_MESSAGE_MAP
( u& a+ |& p, e+ D; `- ~( U; M9 b      VCL_MESSAGE_HANDLER(WM_SOCK,TMessage,OnRecv);7 x0 p! z9 ~. H2 p
   END_MESSAGE_MAP(TForm);' h: P7 R+ E- F3 K: u& C5 g
};: s  @& m0 C$ ]7 r3 S: w- d
extern PACKAGE TLANForm *LANForm;
/ Q( v) @& A' p" `* T/ Z& G" J; S#endif1 e) g2 @# ~" `4 r; C1 n+ I* F' g8 i
# ~) g+ u6 j3 q
; W; z, B0 ?) p9 H( H1 N$ ?
.cpp File1 {8 `; @' z: t# ^- m

/ ~9 f  ^/ B7 A$ N8 O) i#include <vcl.h>+ |" W  [0 r- Z3 c
#pragma hdrstop  R  Y" |0 @1 G6 E5 W
#include "UDPClient.h"
" G) |( F" R) }4 C, X#include "WinSock.h"* j) H6 f: J( @, h1 m2 Q
#pragma package(smart_init)0 z, t( b2 a& |# t8 f, z
#pragma link "CCEdit"
% r( n+ n: W6 G. j+ [#pragma resource "*.dfm"
5 G: k- V- h5 A: ~/ q1 KTLANForm *LANForm;4 A+ s: ~2 a' f% ^0 ?; S/ ~' F
enum PROTO {TCP=0,UDP=1};
1 s$ t1 m- e# j+ h! y9 x" s6 j9 CSOCKET m_Socket=INVALID_SOCKET;; Q# P6 [1 u( B" ?  K: @$ F
PROTO m_Protocol=TCP;
" e/ e- @* x# w: g  [# @- }* T* b__fastcall TLANForm::TLANForm(TComponent* Owner)
4 f: Q7 U' U2 l   : TForm(Owner)
" h3 Y  ^8 \) E$ C5 @. b) f2 ?{
( e; n, C2 ~: S9 ]6 `( f" A( E7 p2 y: d" q" k% i& u' l
}8 Z' t8 H) E! D& L* _
void __fastcall TLANForm::FormCreate(TObject *Sender)+ m9 F% n: m( P! M
{% d: D( O# l/ k
   ::SendMessage(Prot->Handle,CB_SETCURSEL,0,0);7 o* u. E! O. R6 \" `) n
}
( B& ~$ Q' E" ]$ |/ Pvoid __fastcall TLANForm::OnRecv(TMessage &Message)
" V" A. U* n9 w+ C- M( l! s3 _+ X{4 J; G- F0 K3 e) A( ^3 g! Z
   char buf[4096];  e- i" O1 D# l' M& j/ u
   int nLen;
  @9 x+ M1 y2 P, x- N7 k8 c7 b) f   struct sockaddr_in from;9 b& c1 o. x3 N& `( j, B, p
   int nLength=sizeof(struct sockaddr_in);
+ E3 G# j' S% W" p. G4 [  R) t   switch(WSAGETSELECTEVENT(Message.LParam))
- x& L  V% `/ u# G" S( X   {, `. @7 R" y9 c" a* x# Q
      case FD_READ:# A  p) f$ f. |/ l2 S2 P2 d: J
         switch(m_Protocol)
% v( n8 e: b1 ]3 Y7 L         {
1 P/ j0 D5 Q9 S+ H9 s0 ^7 Q; H" i            case TCP:  z( W* l$ X8 X9 o4 h
               nLen=recv(m_Socket,buf,4096,0);
" E6 g% }% {% [0 {! X               if(nLen>0){* |$ K0 x1 T( S+ q! T+ y7 p0 m1 H+ k
                  buf[nLen]='\0';
/ p# n+ @, L4 p- k                  TxtEdit->Text="Received Length:"+String(nLen)+"\r\n"+StrPas(buf);) w5 }8 T6 H# K
               }+ ]- a1 g0 x. a7 d0 b) X
               break;
5 m( D4 t% _# c) q            case UDP:4 [+ S& q  c! F1 m
               nLen=recvfrom(m_Socket,buf,4096,0,(struct sockaddr*)&from,&nLength);/ K5 b" y! F1 ^! U/ e
               if(nLen>0){0 M# o/ @$ ]  R# F0 R$ A& v" `/ [
                  buf[nLen]='\0';+ o: t  J/ S( M9 {& u4 f, ~, k
                  TxtEdit->Text="Received Length:"+String(nLen)+"\r\n"+StrPas(buf);: `5 O" h; w( k& z- [. K6 s
               }' a8 ?& `9 I# u6 [1 `& `
               break;" f' f! }# L- v8 o6 i; P9 D
         }- \( x- G9 V) {
         break;
& X3 y# L& p! }9 y6 _% D      case FD_CLOSE:" G4 e4 t5 F- u; R
         closesocket(m_Socket);' B; V6 d: S4 T/ i/ q3 E) ~2 d+ H
         break;
  N% }0 d8 j( b% l6 B   }) H5 a; B! u& @+ J. J
}; J& n1 Q& p/ p; [, K# x

6 y" h( P8 |0 Z5 D' X/ Ovoid __fastcall TLANForm::Button1Click(TObject *Sender)& z# z9 V; r3 J# U. ]3 x, l
{
/ D! O& D4 i* n( A( M   char szTmp[256],buf[4096];/ X( w: K7 m/ A5 l
   int nSize=0;8 f( H: `1 f6 P8 k
   UINT m_Port;
5 K( K' L- Z0 J; c7 k! k% ^   AnsiString addr;  x3 m8 r0 k- P$ v8 B" a* m
   addr=Addr->Text.Trim();2 H3 G# x0 d  D
   if(addr.IsEmpty()){: G8 D: I0 L# k- ]
      ::MessageBox(0,"lease enter the server IP!","Error",MB_OK+MB_ICONERROR);* n* K# T7 J9 L
      return;% H: R/ s/ |3 y# O# h! b( ~) {
   }
" C5 T- u8 }/ s5 d   unsigned long nAddr=inet_addr(addr.c_str());
5 l- ^( C8 J1 q) Z  u' }/ ?+ \5 ?   if(nAddr==INADDR_NONE){6 Z3 U" t3 A8 X. o% M  N% ?
      ::MessageBox(0,"Bad Internet IP!","Error",MB_OK+MB_ICONERROR);
& Q# f4 D5 d+ s      return;}& I- s+ l* w* {: ^. e7 M4 r9 g

9 v* i3 v5 G7 h: ^6 y   try, j3 b; z* q# |) `2 E
   {
  b% [& e  h9 k: F& v5 Z      m_Port=Port->Text.ToInt();
( Y# G# y. z/ W  ]( W   }
* m) C8 D) k9 K( b1 M   catch(Exception &e)$ F3 m, e/ G# N7 k, A  i5 ~8 l$ T
   {# ~' V; e+ V/ O5 q
      ::MessageBox(0,e.Message.c_str(),"Error",MB_OK+MB_ICONERROR);. P& a( G5 X: d, e6 w
      return;" [. e# J, Y; c- J/ F
   }: B% M; g- c6 L
   switch(Prot->ItemIndex): M: @: E4 L( Y6 k
   {- d/ Y7 f$ J/ F4 t. d* p
      case 0:
: l8 \+ o! x/ O' c' x         m_Protocol=TCP;# m1 |4 Z3 M; q* \- z
         break;! }& X) h1 s$ [( M0 m2 P
      case 1:* D, a# j' l$ c* x% O6 F$ E7 @
         m_Protocol=UDP;
# K6 t! k: S- k. k# e# @         break;; b. t$ ?% I9 A/ |
   }: n3 R, G' g" ]3 _) ^3 }
   if(TxtEdit->Text.IsEmpty()){% @# H1 X$ {1 Q+ t; P3 A6 H
      ::MessageBox(0,"lease enter the text you want to send!","Error",MB_OK+MB_ICONERROR);
8 }) b# T) A: }) a9 S! x      return;}
2 `" J' ^+ c* [
0 S3 C# n: [- R# v   //Initialize Winsocket/ N- y+ ~" Z7 G# O/ q  g
   WSAData wsaData;0 U) g6 g3 X, ]8 W# _& c
   ::ZeroMemory(&wsaData,sizeof(WSAData));
8 j9 J' s- Z) a- y" e. f   WORD version=MAKEWORD(2,0);7 j/ o  L9 j3 A! G
   if(::WSAStartup(version,&wsaData)){
  h" f, `. z3 s+ H) {4 \2 m- G      sprintf(szTmp,"Failed to initial winsock enviroment!,error no:%d",::WSAGetLastError());! W5 ^; b% q6 W5 w3 `
      return;}  w6 d( P1 [. V$ q8 E* F8 q* _2 x) s" K

; g: i6 m: n4 X5 r' l7 @6 P   //Obtain the active connection
' a) n, g( n4 a) `$ n% g; W3 s   char ComputerName[255];
9 k+ ^+ C2 w% V: D: a9 K   gethostname(ComputerName,255);) h3 L/ a1 T* Y
   struct hostent* he=gethostbyname(ComputerName);( G0 j( V+ c+ V1 N
   if(!he){( v/ \+ |* D' V& `
      sprintf(szTmp,"Failed to get information to host!","Error",MB_OK+MB_ICONERROR);
8 c* j+ S# k7 ~      ::WSACleanup();
( [$ P# w% q. O2 M6 d7 d1 G, X      return;  N: `6 }0 j4 k5 m' I: F
   }
$ B+ i& M6 o+ f   //create new socket
' V6 ^2 r- H4 i8 n, j   m_Socket=INVALID_SOCKET;. z7 ]2 B3 o1 ^( b; o) R, l
   switch(m_Protocol)
! p! Z7 A3 Z+ Y) q" D  T9 s   {. k- B- K) {- O4 u- {$ t- e
      case TCP:3 J8 H1 p- X) U6 Y4 @' d
         m_Socket=socket(AF_INET,SOCK_STREAM,0);  |% ?: T" k( x( N. Y
         break;5 H& t, g3 m" _
      case UDP:
: G8 G5 B( g, g         m_Socket=socket(AF_INET,SOCK_DGRAM,0);$ W- e8 e9 d0 ^8 {( ^
         break;4 m( O, Y* v5 c3 d. J
   }- O0 q/ q( L4 u* z( G) q
   if(m_Socket==INVALID_SOCKET){( [4 x$ n7 D; A* H$ ~( D
      sprintf(szTmp,"Failed to create a new socket!,error no:%d",::WSAGetLastError());
: [& v$ @* y7 K3 n& v4 w( J" n      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);
! q& L8 X" U, E; y" ]      ::WSACleanup();  R6 {7 q# K$ D' x
      return;, a3 g4 q) m, B2 A! M. q: x
   }3 P# ]  o) A1 J9 n
   //bind socket0 ]& F+ V+ Q/ r
   struct sockaddr_in client;
9 o  V5 _% f9 H- q% |( ?- f: Y   unsigned long nClient;
4 V. ?; d9 @& x# v) M   memcpy(&nClient,he->h_addr_list[0],sizeof(int));( u# c, G/ L  M3 L
   if(nClient==INADDR_NONE){
4 H$ \- \( C" U$ X4 {! g$ g" ?! q      sprintf(szTmp,"Failed to obtain the local machine's IP!","Error",MB_OK+MB_ICONERROR);
4 y1 j- o* @8 d( s/ H% H      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);
1 _! |$ n% Q$ z/ t4 m- k* g3 e1 s      closesocket(m_Socket);
  b  _! o0 {+ o0 q! L! P7 ]8 ^: ]      ::WSACleanup();) p" F) [  b6 _) K0 X: q  R
      return;
1 t6 s# _0 m/ {: M   }
. x# K- d" v1 T) o7 q   client.sin_family=AF_INET;; k+ \3 I( y6 G9 w
   client.sin_port=0;
' @2 r, ]+ e, q9 I3 c3 b   client.sin_addr.S_un.S_addr=(int)nClient;! s5 q& R- q5 f7 y; J& P
   if(bind(m_Socket,(struct sockaddr*)&client,sizeof(struct sockaddr))){
: F$ h8 I: ~2 o: s8 n- `      sprintf(szTmp,"Failed to bind socket!","Error",MB_OK+MB_ICONERROR);: l9 s8 D: l! h  m
      closesocket(m_Socket);
" |5 a5 A% l; v' ]  ~' b      ::WSACleanup();
6 z8 N) J7 \6 c& ^6 t2 B      return;}. I& y. O1 D# T0 Y) Z9 t
   //connect socket
" ]' w6 `, E' H8 a   struct sockaddr_in To;! B& }1 C  B4 I% M% T# h' f
   To.sin_family=AF_INET;( }; m% i5 G0 J
   To.sin_port=htons(m_Port);
. f% g* B9 S# E9 ]; f* e   To.sin_addr.S_un.S_addr=(int)nAddr;
7 |- _' M4 C5 `) C& z' u6 O   fd_set FDSET;$ `0 k$ K# K1 c. H4 G, g
   FD_ZERO(&FDSET);
+ D$ p+ k- I9 \9 J* r) a4 B   FD_SET(m_Socket,&FDSET);
) H: s: e" c* S/ c: K7 K( }* W9 T  L& v, n& N6 m, f2 d: t
' b% e4 L$ p4 |' J$ d# n" u
   if(m_Protocol==TCP){
# s7 [) i" M  {4 }7 d      if(connect(m_Socket,(struct sockaddr*)&To,sizeof(struct sockaddr))){
9 x$ l8 x/ P" E% W/ k( }! C3 A         sprintf(szTmp,"Failed to connect the object!,error no:%d",::WSAGetLastError());
$ E2 ?1 f: u, W1 T+ B) r         ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);
, ]" s' s  e/ U* C4 n         closesocket(m_Socket);
7 w( c6 y; m5 v         ::WSACleanup();
, n- r( @+ d6 V( Q! @( b6 z         return;  r2 N( \6 I# K8 \, u- }
      }) X0 a: B- k1 i4 X/ a+ [
      int nError=select(1,0,&FDSET,0,0);
, N% |0 g* W+ I. T; Q& q      if(nError<=0){4 i6 W( X4 R7 N6 u# o0 `4 \5 v6 x
      sprintf(szTmp,"Failed to select socket!,error no:%d",::WSAGetLastError());
4 ?& d. g* Y7 @; D& x      closesocket(m_Socket);
) F0 e3 v- T* f& g      ::WSACleanup();
2 q! U" ]/ ]' k& {; V: k4 u6 _3 G      return;}
8 P8 G: g  [- |5 [   }
. T  J' @' l% t# f% D' C   //Send data, [8 ?5 D- w. d
   int nLen=TxtEdit->Text.Length();4 n0 V/ Q, J6 Y
   if(nLen>4096){
0 ?' R6 m& Y5 O; B7 l0 z      sprintf(szTmp,"The buffer is too size to send,it shoud not be more than 4096 bytes!");
  t# S8 `  G  }" S5 ]      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);
( \% E. \( ^  o, m0 v, U( M/ C      closesocket(m_Socket);3 t' Z. T7 ?9 ^
      ::WSACleanup();
: z. w% t$ m& x' S6 V      return;& a. O/ k8 Z( r; h: Y
   }
6 }8 G7 Z7 {* k9 J  H* M* r; K   strncpy(buf,TxtEdit->Text.c_str(),nLen);
4 {/ [5 E3 p* V) z7 {9 b4 g2 K   switch(m_Protocol)
* r1 G; U9 }: N   {
. s5 a9 w& o: ^3 v" W- d5 o      case TCP:0 `2 l! c! d8 ]$ s# R* M7 j1 u+ F
         nSize=send(m_Socket,buf,nLen,0);
- F) l0 i+ O: K( S         //ShowMessage(nSize);( g$ e) S1 F' J1 P, I( t$ u7 W
         break;
- Z! V2 t: |3 O      case UDP:9 t, q$ w$ J0 k* g
         nSize=sendto(m_Socket,buf,nLen,0,(struct sockaddr*)&To,sizeof(struct sockaddr));7 \) [: U. \; L/ X& V
         //ShowMessage(nSize);; ^& s0 b7 Z3 h0 C: b; ]
         break;  ?2 e# ^8 z5 S4 h7 T
0 W) s- g- n! W1 j7 G) J' ^' }6 A# Q! I
   }
, L7 L' a) A3 n* s. p8 d   if(::WSAAsyncSelect(m_Socket,Handle,WM_SOCK,FD_READ|FD_CLOSE)){
+ k) e5 ~( A& Y/ d      sprintf(szTmp,"Failed to register socket event!,error no:%d",::WSAGetLastError());5 l& L+ N% ]' B( x+ P1 u# T
      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);
+ G, ^0 i: p6 C) o; x5 B6 j      closesocket(m_Socket);2 M" |, d) p% D; z
      ::WSACleanup();
0 y3 t% d. m$ Q      return;}( n  U' t/ l2 w+ _
}
4 T+ I+ [) C. v3 |3 e: I- Rvoid __fastcall TLANForm::FormDestroy(TObject *Sender)
; f* [+ l- f+ g; j{
- x; B' @0 L" X4 V; c   closesocket(m_Socket);
4 }  I' F2 H+ ^6 O   ::WSACleanup();; h% ?  c( b  A3 e; T+ v% U: K
}
0 x/ `0 V% D3 y% t2 v) |1 O) Z! R- a+ J" D2 @& k
Socket api Server:% m3 O2 g2 y7 b% ?# d" n
.h File
6 L0 N( n# a* o+ c#ifndef UDPServerH7 ~) O4 N: b1 {2 u3 h' I
#define UDPServerH
2 \( C! E, g+ f( r3 b: T#include <Classes.hpp>
4 k: A& X$ r1 e9 }4 o- m- b1 |#include <Controls.hpp>
( M5 v9 y2 g. @* b- i% E8 M#include <StdCtrls.hpp>: w  `* x/ E3 X8 g: f9 \
#include <Forms.hpp>
! F, J+ Y9 b! p6 ]& K#include <stdio.h>
: x3 g* m3 U! L#include "WinSock.h"
: H8 `# }" A( s& Z# k/*#define WM_SOCKET WM_USER+1000+ q! F. C0 ~0 r
#define INITSOCKETSUCCESS 07 Z+ [  A4 Z; }3 m) B
#define INITSOCKETFAILURE 1) ?# X  I' w4 E( r8 Q9 F, r6 `7 R" z
#define CREATELISTENSOCKETSUCCESS 2
, X5 P/ c5 V3 m* `( N0 s0 b% o. b9 g#define CREATELISTENSOCKETFAILURE 3/ g' C/ b, U* w5 G
#define SETLISTENSOCKETSUCCESS 4
% |; B( l+ u# w9 ?( D% I$ W#define SETLISTENSOCKETFAILURE 55 h5 F/ \) Z2 R9 S- V* u7 y
#define BINDLISTENSOCKETSUCCESS 6
/ ?; i6 P6 {$ S. t% G+ U! c! S#define BINDLISTENSOCKETFAILURE 7$ q' ^9 J6 \* ]
#define LISTENSOCKETSUCCESS 8
4 B) {" w! [* I7 [" v#define LISTENSOCKETFAILURE 9* j& X( Z; q; o) r* h2 n
#define ACCEPTSOCKETSUCCESS 10
' t9 f( I, C1 I#define ACCEPTSOCKETFAILURE 11
( L; a- D5 Q2 o" l1 @' r1 N*/2 `4 o3 H3 q1 y) p1 [* q
class TPSTNForm : public TForm; X( z5 n/ H/ t  H
{/ P5 c: s) b1 C
__published: // IDE-managed Components
+ B3 ?! u. e, e3 W6 X   TEdit *Port;* P% G+ h( B+ K; [2 R* p9 R5 a. _# T
   TLabel *Label1;3 o+ O4 g2 Z7 a  m% |8 k
   TMemo *Memo1;7 |! n& C3 P& g% \  V2 P2 U
   TButton *Button1;0 Y0 w, Y2 C6 Q1 n9 h. @5 T
   TButton *Button2;
2 M* B: T7 z- \$ X0 W/ R  H1 e/ w   TLabel *Label2;
0 S; ], ^, r1 G8 T8 p   TComboBox *Prot;4 Y2 k, G  y4 s. b$ I5 l0 H
   void __fastcall Button1Click(TObject *Sender);
2 Z) J4 f# k2 U; X; W$ x   void __fastcall Button2Click(TObject *Sender);
5 m! V5 D7 Y7 I( ?5 `   void __fastcall FormCreate(TObject *Sender);' N, ?2 b( A- X3 v% E
   void __fastcall FormDestroy(TObject *Sender);
' k/ Z7 e5 M$ \( i; M9 o1 vprivate: // User declarations
' Q- Z) `, p) x: jpublic:  // User declarations
- N+ d+ Q" J+ q   __fastcall TPSTNForm(TComponent* Owner);
1 Z( r9 z  b' R8 f8 g4 R) ?6 r) n  O};4 R2 y& w  C! [& H* o
enum PROTO {TCP,UDP};
3 q, M9 Q5 B3 c& P9 l. S. Cclass TCommunication:public TThread    //Communication Thread4 b7 H; F9 Y0 l4 r# s
{
* @. a+ a: L$ J; D6 h& _private:. F- I7 j  L: b" k5 G3 L6 L( k
   SOCKET m_AcceptSocket;
( D* X0 @( r8 y. b( G# o5 S5 g   char szTmp[256];//ERROR MESSAGE
1 f% `- N( Z' qpublic:, j* ]3 E' ~# F/ ~! \9 i% c
   __fastcall TCommunication(SOCKET m_Socket,bool CreateSuspended);  j" V! j# P& b" D2 q
   __fastcall ~TCommunication();1 ~: q. ~' a1 V1 Y! t4 _2 Q
protected:
& V6 n1 u, J3 f   virtual void __fastcall Execute();
7 y9 F9 ]% Q" o2 m};
4 J7 u: A4 u7 H9 f; V: D2 Dclass TListenThread:public TThread //Listen Thread
3 c3 v9 q/ O1 m; D" a" a{! X7 X$ d' I9 C
private:( l) U9 V2 Z* j5 e+ D- ^& E
   WSAData wsaData;$ e% m/ G2 U# d8 p1 f$ ?2 R
   struct sockaddr_in server;% V: \$ P3 u3 @' Q( E( h! ?
   fd_set FDS;
, C& B2 i" A1 ~8 k' m2 T   UINT m_Port;
/ u0 [! _" a$ O/ l! U) k   PROTO m_Protocol;
+ V9 {* e1 L! N/ w, v   char szTmp[256];//Error Message. W  V3 J$ @" R) F, `
public:4 u9 Z$ @6 B+ T% r4 ]  A
   SOCKET m_Socket;
9 y2 @' I* V5 [9 J. N  m   void __fastcall DoError();0 m* ^% I3 x; {* k) t% X
   void __fastcall InitSocket();/ y( v( l2 L1 {
   void __fastcall CreateListenSocket();
  o. ^" }) U. K' i4 a/ ?4 s   void __fastcall SetListenSocket();
  U3 @% }+ n2 z. |2 C1 ?   void __fastcall BindListenSocket();/ e$ K& {  G1 C5 W- F4 {
   void __fastcall ListenSocket();% n' M& w0 b: p' F; [, I

9 q* ^2 E/ R' @3 E8 Apublic:: D# v7 {! x; j& ]. J
   __fastcall TListenThread(PROTO m_ProtocolA,UINT m_PortA,bool CreateSuspended);  U! y" N' M# y4 e
   virtual __fastcall ~TListenThread();; t+ d+ Z* f6 i( i
protected:7 t5 ~0 p4 f8 s( E" k# [
   virtual void __fastcall Execute();
7 r, E/ L; f# p/ S* e3 Z; |* _};( [" a: {9 q0 T) ?
extern PACKAGE TPSTNForm *PSTNForm;  A4 A( y+ r/ A. g+ u  U6 [
#endif; G" E" f$ g2 p1 b" x# C. S) O
.cpp File
, i$ y3 I1 h  m5 j! p2 W1 A6 z' }#include <vcl.h>. |# x* n% v+ B$ T7 M7 Z" z, t
#pragma hdrstop
& G) k4 h6 _5 h9 P- j#include "UDPServer.h") b9 T/ E3 T+ {
#pragma package(smart_init); x$ T( J" r. m3 N; `
#pragma resource "*.dfm"
  j  Z" {0 q3 |6 o- CTPSTNForm *PSTNForm;% ^8 x- B4 w3 V5 S
TListenThread *pThread=0;
+ |; R& K! H4 F+ {//******************************CLASS TCommunication For TCP****************************************************8 I, T: _: n4 u  w
__fastcall TCommunication::TCommunication(SOCKET m_Socket,bool CreateSuspended):TThread(FALSE)
, o1 @0 X5 c8 X1 b0 X9 q6 Z{
# U! [5 Q1 j' y/ Z' Z   m_AcceptSocket=m_Socket;
8 n+ u) J- E) v, J4 p& Q4 a" {   szTmp[0]='\0';8 {6 Z2 B2 n6 @6 w! |4 q. I* Q
   FreeOnTerminate=true;
  a9 m7 d" y3 S% M! [7 ~' \}. K) [/ d7 Z! }2 C% m) |: j
__fastcall TCommunication::~TCommunication()* p! \0 l% {' Z* G/ U4 s
{3 c. c0 U1 m- A; g0 i
  // closesocket(m_AcceptSocket);
5 e6 N3 p& ?( v! p}
2 U. E. m9 Z* Q8 p3 B9 b8 Uvoid __fastcall TCommunication::Execute(): n) C! H) n5 W4 H) t; D
{
9 L5 f  c& S1 E: ?, ]   char buf[4096];3 _& J" ~$ `0 z  P2 M; r+ t6 v
   int nSize=0;! S% Y; \/ C' a
   nSize=recv(m_AcceptSocket,(char FAR*)buf,4096,0);
8 u1 y# t6 a6 H7 g8 V   if(nSize>0)
! Z9 T! W+ I8 E) ^4 E3 `) s8 q   {: J- k, L! S' x6 m: X5 N: `: E
      buf[nSize]='\0';$ T$ B, A' W& Y( S* [& _
      //Display2 y/ t+ M) X" p* B) H# {1 t
      PSTNForm->Memo1->Lines->Add("Received Length:"+String(nSize));& D$ \$ K: X" N: U8 F8 T
      PSTNForm->Memo1->Lines->Add("Received:"+StrPas(buf));
7 |, M. n/ C5 r4 U# k9 R      //Deliver& P% _# z$ S7 X
      ::Sleep(100);
  F, q' M# k. q7 O      send(m_AcceptSocket,buf,nSize,0);
( t2 W: V. ^2 l( f% i! B0 q! ~   }+ P1 N, {5 a( W; ]! c% z0 m( K  B
& \4 |+ E- ?  t& [
}! r8 R$ _3 B8 r: Z, W7 A6 N+ o
//******************************CLASS TListenThread*****************************************************
2 ~% ?. O0 {' k__fastcall TListenThread::TListenThread(PROTO m_ProtocolA,UINT m_PortA,bool CreateSuspended):TThread(FALSE)! Z0 f: D9 I9 b3 X
{
; d- A$ C, r( ?4 x; n3 I   m_Socket=INVALID_SOCKET;" y% O# V7 I# h& G7 @
   m_Port=m_PortA;9 @% w- e- n9 O1 [
   m_Protocol=m_ProtocolA;
( S) K: r; _) O   szTmp[0]='\0';5 H/ W) N3 `  f% O
   ::ZeroMemory(&wsaData,sizeof(WSAData));+ o+ c$ U1 M1 c2 P
   ::ZeroMemory(&server,sizeof(struct sockaddr_in));$ X3 o# q9 f+ B$ V
   FreeOnTerminate=TRUE;//Automatically delete while terminating.+ i  l/ `; B6 l' D1 C
}( A0 p1 q/ U  X  w  u
__fastcall TListenThread::~TListenThread()7 W% Y3 D: L- F' K
{
$ o. K  c' J* y$ g5 g" D   closesocket(m_Socket);' f0 J8 h0 J" t+ e; X- G8 Q9 @6 u+ R/ x
   ::WSACleanup();! n: `  \4 e+ @8 _
   m_Socket=INVALID_SOCKET;  a6 e7 C* N1 C, c0 J
   m_Port=0;
" W) l' {5 }( D9 a   m_Protocol=TCP;* ?( E; k& r: m2 K0 O/ t
   szTmp[0]='\0';
* m! k- q3 `& L. h) x7 i9 r- O   ::ZeroMemory(&wsaData,sizeof(WSAData));0 I: b0 c) j# ~8 Y' E
   ::ZeroMemory(&server,sizeof(struct sockaddr_in));
0 ?/ y4 }7 H9 R4 U}
7 W, |3 v6 c, h# E! Y% L  tvoid __fastcall TListenThread:oError()! s; R. U! S' g7 h4 D
{
  Q. Y3 f" N5 P) M! A- B+ \# i0 c   if(m_Socket!=INVALID_SOCKET) closesocket(m_Socket);3 F( J7 o, i+ z7 T
   WSACleanup();
8 g, _% j4 j1 o6 O9 [9 b   return;- }( O0 ]0 B' x
}  n7 G7 Y3 K- Z2 R" }
void __fastcall TListenThread::InitSocket()
, z! j- m, [- T9 h# X{/ T  ~+ a* Y  S: c
   WORD version=MAKEWORD(2,0);
* C+ T! X$ u+ S9 V- O& g   if(::WSAStartup(version,&wsaData)){
! I4 _. Q4 Q. g$ L1 K      sprintf(szTmp,"Failed to intiailize socket,error no:%d",::WSAGetLastError());* h# j+ Q" |( K$ P
      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);
0 Q" l, g2 A- d. M  v# \      DoError();
, z' b: g$ \' }      return;3 H% M3 z# G& Z3 Z3 l; H. K
   }0 i) F" g* n( e, @) p- h" H
}" [. ~- D* u7 z, U3 `+ u$ i
void __fastcall TListenThread::CreateListenSocket()  L( R, j$ k/ a3 Y2 x
{
1 M% s0 c5 w% x3 Z) ]   switch(m_Protocol)- N) O' c& X* c3 H; M
   {
: D3 K/ j8 i/ \' E% z      case UDP:
9 a$ r. @1 r3 S; X  q         m_Socket=socket(AF_INET,SOCK_DGRAM,0);# F5 U0 K$ Z2 U1 |
         break;5 S. q' i+ h; m  L8 p
      case TCP:8 C3 i6 L. b# l# C( h" a
         m_Socket=socket(AF_INET,SOCK_STREAM,0);
. k- H% e  v* C2 H4 O* w  R! A" {         break;
% u( `6 Y, b7 O$ k+ x      default:; T6 n. V( F3 ^, n3 F5 k5 m4 n
         sprintf(szTmp,"Error protocol!");
; v5 ]( f2 [) `/ N7 V8 N; _& d         ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);$ S1 u- @' @( ?; ~- G
         DoError();1 q, e% L" E) g0 O6 c# y4 Z$ B
         break;
5 V5 D# M1 G9 p   }
' ^' C- i8 K3 Z0 j* R/ ?1 b) U   if(m_Socket==INVALID_SOCKET){
; @* @1 j5 f9 b      sprintf(szTmp,"Failed to create socket!");) p- V6 [# ^' u/ p2 H) X. k
      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);# \& }6 ]' N8 w, o! h4 F
      DoError();( f( L9 P  s% m; ?3 M3 b# m
      return;
( s% |4 g, q9 f2 L! p+ j7 C+ r   }" ]% j# ~7 e5 `) k4 E( \/ d- t
}3 G+ I, `! o  N8 n/ R' ?
void __fastcall TListenThread::SetListenSocket()
  `) W3 a- Q7 [' b( N" c8 h6 v, x{) ~' ^9 B9 r4 P) V9 ~
   server.sin_family=AF_INET;/ c/ W! }9 u! z% V& l% |+ J; u
   server.sin_port=htons(m_Port);4 p$ S6 U1 N$ o* I( }
   server.sin_addr.S_un.S_addr=INADDR_ANY;- G/ `7 j4 U! ^) ]- ]. j8 Y
   int NewOpenType=SO_SYNCHRONOUS_NONALERT;
) s# u. Z/ I7 S0 Y- y, l   if(setsockopt(INVALID_SOCKET,SOL_SOCKET,SO_OPENTYPE,(char*)&NewOpenType,4)){
. H( r, B/ ?3 L  {      sprintf(szTmp,"Set socket option error,error no:%d",::WSAGetLastError());7 e" V+ F  j8 ^5 F7 q$ x3 P$ U& p
      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);0 z9 v! H# a* w
      DoError();5 V/ M& Z/ S  T) `
      return;; v9 ^7 c9 I. U2 C$ Y3 e5 C2 {! ~
   }
5 L, I% S2 R+ I' q/ [! ~}6 b) f  J/ I6 ]+ H, z* i# W( E6 i
void __fastcall TListenThread::BindListenSocket()3 v5 E9 @  ]# E! n- S  N! ^
{- X6 E+ f% b! ~. ?
    if(bind(m_Socket,(sockaddr*)&server,sizeof(struct sockaddr_in))){! i5 L; s1 s% g  u6 |
      sprintf(szTmp,"Failed to bind socket,error no:%d",::WSAGetLastError());
4 Y: o( E" R4 r. t2 \3 a      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);1 ?: f/ K. |7 h( N4 {, Z
      DoError();8 k. K7 s# s7 |" q% j  M
      return;* ?4 N5 N6 Z) \7 A. L+ c, F
   }0 ?+ y/ r9 g: Y% v
' R4 H0 ]( A7 a3 n' E! @
}& k2 L" m2 Z& V# L/ `& N
void __fastcall TListenThread:istenSocket()
3 c' \8 r. Z9 p+ C{
# M! J6 T( x: |5 s+ G0 [  if(listen(m_Socket,SOMAXCONN)){
) ^1 S! a! x5 |     sprintf(szTmp,"listen error,error no:%d",::WSAGetLastError());
, I1 ?4 A" @7 k" q1 H" n( i: P3 ]     ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);5 x% {, S: |' r9 `3 z+ l2 }
     DoError();* C% t! E7 L8 I5 Q! A# I) G# Z5 W
     return;/ @# M  k! w5 I- d" t; y$ g
  }
1 t+ A1 p6 X3 F- i/ E% N  //Determine whether there is any connection
# {& M- o5 d+ T5 J  V9 Y. S' A  r" l  FD_ZERO(&FDS);
3 s# G0 j, F3 Z! C+ g$ H% U5 n# x  FD_SET(m_Socket,&FDS);3 T0 ]! u* d- E6 a0 E0 n( L* Z
}8 m; K& y$ ^7 t/ R. m0 s
void __fastcall TListenThread::Execute(); j* s6 {4 ^3 z" U+ W( t& y  g6 H
{6 c# d* i3 E! h
   char buf[4096];
$ i0 _8 p5 ]. R: h   struct sockaddr_in from; //for UDP. ?. w# x. b& `) i0 }
   int nLen=sizeof(from),nSize=0;  //for UDP
8 }3 e1 D( U2 f4 ]0 U0 L9 U   InitSocket();
3 m- J1 K+ o# T) I% J   CreateListenSocket();1 i1 j: `, X/ Q  B
   SetListenSocket();& g9 J3 u! g) {, T8 _
   BindListenSocket();
+ l- o6 g: z- Q% {   if(m_Protocol==UDP){
9 N, X* G( M! S! A# M. z* v      while(!Terminated){
2 r, w, s9 o* n$ N) T6 ~7 |. E         int nSize=recvfrom(m_Socket,buf,4096,0,(struct sockaddr*)&from,&nLen);4 E% Y5 S. J: ]& [8 B
         if(nSize>0){
9 R* b0 l0 E; O1 }( Q/ T8 G            buf[nSize]='\0';
7 R7 \8 d5 m) p) e! z' H            PSTNForm->Memo1->Lines->Add("Received Length:"+String(nSize));, `! v& H9 |6 H! X3 w) D# q
            PSTNForm->Memo1->Lines->Add("Received:"+StrPas(buf));  h/ U% [1 l. a' c
            ::Sleep(100);! y7 N* `2 \- l# V' k
            sendto(m_Socket,buf,nSize,0,(struct sockaddr*)&from,sizeof(struct sockaddr_in));# y- [: P. Z* N1 c3 t% O% o
         }
5 ]$ S3 H9 F0 m% _( r. p         else return;
7 p4 ]9 _# j) k" }. o) |& r. F* ?; m- D* e7 L4 H: m; ~4 ^. T9 w8 ]) d
      }% W8 |# ^( h& u) l8 l8 ]
   }# @9 I+ J) X2 z; ^  x
   ListenSocket();
* x0 C* u/ }3 ^6 H3 M   struct sockaddr_in client;
; |+ |) I3 v& y$ x4 q- I   int nLength=sizeof(struct sockaddr_in);, m% F! C1 ~+ d( h
   while(!Terminated){9 I" k& `; z- Y# T2 z/ x
      int nError=select(1,&FDS,0,0,0);
/ G/ m* x' C& T2 h& d: R- d, i" i3 ^      if(nError<=0) Terminate();
8 q6 K7 L. z2 K1 E8 n) y/ K: t- d* ]      SOCKET m_AcceptSocket=accept(m_Socket,(struct sockaddr*)&client,&nLength);
; @# l# b6 o, e  q3 Z9 K- ]$ Z/ W      if(m_AcceptSocket==INVALID_SOCKET){
& z, S3 S+ H6 X( K, d$ v0 P! ]# e         sprintf(szTmp,"Failed to execute accept,error no:%d",::WSAGetLastError());) u1 n. s9 K4 W6 `0 t2 a
         ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);- n) k" |5 g" M" c4 X) n+ \( b
         DoError();/ E% p$ y  w! G! `& _
         Terminate();6 T/ T: G6 ?6 b: W6 q
         return;
/ h, l/ j: @1 x7 a      }) i+ X, R8 J* l, J& C/ \. S& S
      TCommunication *pCThread=new TCommunication(m_AcceptSocket,FALSE);
; c1 u# ]9 x3 c$ N! Q2 C) L/ A      pCThread->Terminate();; T& j  ]! K" h
      pCThread->WaitFor();  p. A5 \- G1 y; ~! k( b& J
   }
  H2 V2 o4 G% Q, W9 j' R' g! @/ t}
8 n8 S1 P5 o, Y: H4 r4 y' J//************************PSTNForm*********************************************//+ ?, O! \7 I+ j- L' |' t( y2 `
__fastcall TPSTNForm::TPSTNForm(TComponent* Owner)
; e  {- E3 a# g3 e3 L   : TForm(Owner); V* H( y' n; D* V! z; b( N/ f! i
{
$ [& H/ j6 k6 n) d! r2 Z- B% y$ t}7 Z& p2 v3 M2 Y9 y- N  w
void __fastcall TPSTNForm::Button1Click(TObject *Sender)
# [1 H% t7 \' A* q{
7 T8 f8 L, {: }1 c$ m0 M( Q" `   Close();, b/ @4 N* j6 K" M7 f# ~3 k8 D4 |
}* S3 y! q% U8 t2 @* x2 {
void __fastcall TPSTNForm::Button2Click(TObject *Sender)
! W' J3 W+ p/ `: [{( N) J6 r: k( m" I" U0 B6 v
   if(pThread){
  x& `' q' Y# g: u9 s      pThread->Suspend();7 C: W& D) r) I! e. `* @
      pThread->Terminate();) W8 h! n! K- D) U; g3 r" s# H) ~
      delete pThread;
. S: k9 A7 M% J' u      pThread=0;. |* Z7 i4 ~3 A: Z$ t2 L
   }
+ [& ~8 ?" v! V' r1 |5 N   UINT m_Port;
( o6 k% Q( A' h, }2 v6 K; ^; B   try
. |3 T( U) n* W' f6 ~   {& s- e8 k- n2 U  M, s/ _% }% A
      m_Port=Port->Text.ToInt();$ s  M' N1 V# Z, A
   }
. V  I; s' m/ H" a1 f   catch(Exception &e)5 v8 D" V; k4 r0 }! M  `
   {
- w8 Q- d/ }9 }      ::MessageBox(0,e.Message.c_str(),"Error",MB_OK+MB_ICONERROR);
: q1 A( ^2 m- v# \! [      return;
% H1 |. Y' b  l, s$ l   }& f( ]6 a0 {% z/ L  t# _
   PROTO m_Protocol;: b/ v1 X9 F; u
   switch(Prot->ItemIndex)
: p1 T0 f0 U6 m4 X9 t   {
% w" F1 _6 u& m# a+ L' h. @/ D0 [; [      case 0:
. q3 q/ K4 @6 J# H7 N         m_Protocol=TCP;
, ?' F# |% e/ {. P) K         break;0 X, V0 A( c$ b. q, v
      case 1:
: d. r( X9 A$ r3 `* |         m_Protocol=UDP;7 ~8 |) r+ L( K- g1 b: `1 C  ]
         break;. w* }5 H0 k, ^  j2 X! v
      default:
0 o! @6 P* O" o8 a- w1 \         break;
7 S, }+ B& j2 b3 o   }; ^# u; g0 e0 y: N6 A4 o5 j: \) [; D
   pThread=new TListenThread(m_Protocol,m_Port,FALSE);' n0 L0 w4 T$ ]
   //pThread->Terminate();. c  [8 K9 v9 s: |5 x0 ?
}( d: n: E5 V; W/ G" l: R
void __fastcall TPSTNForm::FormCreate(TObject *Sender)& g/ s! w' |, j" C2 A) W! v) l
{2 z7 r/ Q, x7 d
   ::SendMessage(Prot->Handle,CB_SETCURSEL,0,1);
. S' y( d+ M: G0 s0 W}
: u( x! y& x; G- {3 m  G( f/ |- {% V$ q7 W! w  ^4 f
void __fastcall TPSTNForm::FormDestroy(TObject *Sender)( Z9 ]/ T* x- r$ E' D# `. L
{
' B! X3 h1 }% c   if(pThread){
  Z, W0 }# V( G! w% m9 m8 F9 d      pThread->Suspend();
) f( W" L7 V5 d4 x8 w      pThread->Terminate();}
+ L/ b* s1 H5 n( d7 F6 Q6 U+ w}
. j) `) S& |3 B% e$ G上面的代码,各位可根据自已的需要和针对自已的应用,在数据处理方面加以改进就可以了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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