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

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

[复制链接]
发表于 2004-2-15 14:01:13 | 显示全部楼层 |阅读模式
在CB中用socket api来写网络通讯程序
# S( C; O1 x3 P; M' J  h. i' g作者: kingcaiyao ,如转载请保证本文档的完整性,并注明出处。
2 E0 N6 w# R. o) r欢迎光临 C++ Builder 研究,http://www.ccrun.com/doc/go.asp?id=569  w. z3 N( V$ ?0 t  ?% K9 i
本文转自csdn,作者:kingcaiyao3 @4 [( A  n! R0 @$ O7 `. {
原标题:在C++ Builder中用socket api来写网络通讯程序(同时支持TCP和UDP协议)
# G8 G; @* ]1 a6 R原文:  http://www.csdn.net/develop/read_article.asp?id=19883& x! g% e6 J$ D# K
  }3 s" K% s" t- L

& d6 H! c+ m, Q+ b: L# L在7月4日看完sockcomp.pas后,我决定用socket api来写一个客户端和服务器并且同时支持TCP,UDP协议,于是我就去做,现将代码贴出来(已调试通过)" U( [& T+ c# n( i! Q
Socket api Client:& u% L- B* v- L
2 c( @9 k& _/ P- Q/ D& R* G$ x
#ifndef UDPClientH
; p% _, t0 S3 h! R#define UDPClientH
4 P, i7 N/ ]" A5 M, {#include <Classes.hpp>8 d5 `) [. t3 m2 a, b
#include <Controls.hpp>
0 g: T* |, x1 r3 u#include <StdCtrls.hpp>
8 o9 ^- e0 b* e1 Z+ p. G#include <Forms.hpp>
9 ~- x! o7 H- z  [6 ^2 S' [. ^$ s1 c#include <stdio.h>( W( ]5 b- \/ N4 v+ p
#include "CCEdit.h"
& J! u2 |( e! W$ y#define WM_SOCK WM_USER+100
3 w& C' L% Z) Eclass TLANForm : public TForm
) h4 N% m6 ^+ Z3 @. T( S: V8 Y, V{
: g# t& ], x( [& v+ j# R8 {__published: // IDE-managed Components0 A$ a7 `0 W9 E' Q% k
   TEdit *Port;
, x  ]- @& N# T9 ~1 u: L5 g- O" V   TLabel *Label1;0 t+ g5 |- w5 f5 u% q- G7 J3 A
   TLabel *Label2;+ C0 {1 \$ C% D3 g4 H: H
   TComboBox *Prot;! P% p/ o5 l) ~, t8 t9 v4 W6 N' P
   TButton *Button1;
* L: o; ]* w! x   TLabel *Label3;) U  F4 C2 t, M  s: l) B
   TEdit *Addr;* @) h+ N1 ?( B# }) m
   TCCEdit *TxtEdit;6 |4 M8 p& }9 v2 S; t% L
   void __fastcall FormCreate(TObject *Sender);
* c, O+ ~( l6 N# A) ^   void __fastcall Button1Click(TObject *Sender);
7 ~. V: ~8 N# b5 D   void __fastcall FormDestroy(TObject *Sender);+ o, z9 C) n- p
private: // User declarations! I, v, `  b3 @9 ~0 f$ @! z
   void __fastcall OnRecv(TMessage &Message);
' J; T4 P* ]* j# z. h; O1 D8 L  f+ d$ d) ypublic:  // User declarations
, i) O0 u) w- r8 d, R4 K   __fastcall TLANForm(TComponent* Owner);: y" ^0 }/ H% x" y7 b
   BEGIN_MESSAGE_MAP
3 C" a; g3 A& r      VCL_MESSAGE_HANDLER(WM_SOCK,TMessage,OnRecv);2 z8 \' L8 B! r/ U& W' E' d1 d
   END_MESSAGE_MAP(TForm);
4 B8 |1 E1 d7 p% D6 Z  J% f};
5 `0 Y& W% S+ J0 J3 _7 G1 Vextern PACKAGE TLANForm *LANForm;) D: p5 W+ |+ S0 \; a
#endif" B. R( @$ G0 O* o
4 Y$ G- P( A  t( `

9 z; S. c) [9 ~) y- d: i" P.cpp File; v) S6 x# C& \) v

2 ~! q! V' z3 O#include <vcl.h>7 }5 Q4 l7 W) u
#pragma hdrstop+ L# c. W' i3 Z0 S$ {. E7 g
#include "UDPClient.h"
2 ]% r! |0 p8 v2 o; q- c4 [4 }#include "WinSock.h"- b3 W+ s# f8 d2 g; Q
#pragma package(smart_init)
$ ~& `  a; t7 Y#pragma link "CCEdit"
% C" _" a1 s) t#pragma resource "*.dfm"
0 m4 {. ^( m+ d- N# C: Z+ mTLANForm *LANForm;
4 E- n/ \% o" f% p+ ?enum PROTO {TCP=0,UDP=1};$ \2 L; ^0 y# D. F) p: e9 x7 h. r8 S
SOCKET m_Socket=INVALID_SOCKET;
7 x7 N3 ^9 S- z1 m, t5 J/ p2 [" aPROTO m_Protocol=TCP;- d. [- d) b) H- T+ u, ^
__fastcall TLANForm::TLANForm(TComponent* Owner)6 g6 e. X" t! i5 Z
   : TForm(Owner)
  i) N! K# B% L/ k% Z8 p{, M1 u4 W+ k/ s4 Y

+ V3 |' Y: [9 m' G}, ~3 h9 j, T% w) N# @
void __fastcall TLANForm::FormCreate(TObject *Sender)
" |! F$ x6 R; ?, ^+ V* y{
8 Q9 v' g" K1 X% M  D   ::SendMessage(Prot->Handle,CB_SETCURSEL,0,0);
; h9 K3 P) B& u* Z& l5 H}
) f' Z7 E3 K8 Y# s- I. Cvoid __fastcall TLANForm::OnRecv(TMessage &Message)
# Y& z$ g" T: |) A6 |+ T( j{- K1 a: c8 }3 C8 t$ }+ |: F
   char buf[4096];
- g1 ]; }( S- |/ w7 H4 ?   int nLen;8 _+ q5 e* B5 o
   struct sockaddr_in from;7 z) m- o$ b" r/ y' b- e2 Q
   int nLength=sizeof(struct sockaddr_in);1 i' d+ J/ h& E  d8 ?" A3 G
   switch(WSAGETSELECTEVENT(Message.LParam))# A$ H% z( Y& X& |
   {& Q- _, S+ ]! h1 ~& L% H0 D
      case FD_READ:
7 l+ x0 v; N3 K. Q1 ]" B0 M) Y         switch(m_Protocol)+ Q1 d4 o3 x6 V, E- m2 c1 P
         {+ x3 h( q" Z9 _' f5 j4 |; s
            case TCP:9 |; f* l8 _7 K, W6 H) e& w: W
               nLen=recv(m_Socket,buf,4096,0);; h3 N- o# f& F, n7 D7 p  ?. F
               if(nLen>0){+ ^0 I. D, M" e. W" p
                  buf[nLen]='\0';; ~: m. s9 V% I. b" @* z& I
                  TxtEdit->Text="Received Length:"+String(nLen)+"\r\n"+StrPas(buf);
1 M; q! U) [* y' V8 g, `8 s- G, c               }
( A8 i4 v" A, b* F* ^! K# x               break;1 s4 u9 K3 b2 M! c7 `- J; e+ @4 V6 x
            case UDP:+ y; O3 ]- h- y6 z" q8 \& S8 K% g
               nLen=recvfrom(m_Socket,buf,4096,0,(struct sockaddr*)&from,&nLength);' }& _; E( w( _7 h
               if(nLen>0){
( c7 _  }* v: H6 i( c                  buf[nLen]='\0';
5 w$ P, N' l% s& c3 W8 J, P' Y# [                  TxtEdit->Text="Received Length:"+String(nLen)+"\r\n"+StrPas(buf);
! x6 N7 z, n) l' g               }
: @  C/ R$ B4 S8 n               break;( S% M" O; e! O- a. `5 f
         }  p7 ?3 U5 e- d4 j
         break;  d% u0 r& S6 `6 f/ q+ o! L0 r
      case FD_CLOSE:
; ~; O# d" i9 B9 q8 o. r         closesocket(m_Socket);
  l* B' f- r! K  F" [. Q8 z: R/ B         break;9 N5 E; a+ D' @+ h! W
   }1 W/ m$ Z% z3 Y
}
7 v& B9 N4 v* P, ^! L0 O2 m* h; }( F; q7 z7 g( w! Q3 i
void __fastcall TLANForm::Button1Click(TObject *Sender)
1 l) N9 t! ?$ h{) Z/ H7 b1 p. y5 z2 V/ x
   char szTmp[256],buf[4096];
% W- E2 ]( f' ?   int nSize=0;( O1 N+ u$ o( J, {7 v$ X2 c
   UINT m_Port;
" h# U: J9 `$ g; |   AnsiString addr;
+ K3 s- ^* L5 k   addr=Addr->Text.Trim();
, t$ l& }+ m$ L6 a8 Q7 L0 k   if(addr.IsEmpty()){
) ~3 e# n$ g8 v; S/ T' Z      ::MessageBox(0,"lease enter the server IP!","Error",MB_OK+MB_ICONERROR);8 h' Y' ^5 Y; r/ C" L$ P# w6 t5 M
      return;  \, y+ a# k$ G. M" [) q2 a
   }2 O2 O( j; u, k) Q4 P$ \
   unsigned long nAddr=inet_addr(addr.c_str());
5 o8 Y5 p1 h' t5 z3 J( d: U0 f- [/ O   if(nAddr==INADDR_NONE){
" }. L9 l3 ?- f6 l4 ~; B      ::MessageBox(0,"Bad Internet IP!","Error",MB_OK+MB_ICONERROR);1 Y3 `4 f  T. I" z- e
      return;}4 b5 g. P7 }2 Z$ b6 S# Z

6 G; y* X* L+ L" Z. r/ h/ o) e   try4 |; S/ t6 G) i. C2 G
   {! r. ?# S5 v4 p/ C5 I/ j% I: g7 r
      m_Port=Port->Text.ToInt();
  x9 q& c1 S+ ]7 K   }
- B+ R7 q6 m, }0 R2 ?   catch(Exception &e): M) D  N! g& ~8 E7 ]! o
   {
, Y- J2 v8 _$ R8 L4 v1 N7 w      ::MessageBox(0,e.Message.c_str(),"Error",MB_OK+MB_ICONERROR);5 s2 |+ H  a3 g, ^
      return;
9 A3 t6 H. L4 g: ]' {; `1 f   }, G  @5 i9 S3 ~, _: C4 s
   switch(Prot->ItemIndex)) Q" ]+ @. J) q- r, o
   {) Q# |0 V1 S! D6 a" c- ?) b/ U, ^; o
      case 0:
4 D" w6 D6 L4 O6 K( P         m_Protocol=TCP;
0 O% D5 e8 L9 i/ u# w         break;
1 x' v6 V, V! D; E# R      case 1:6 M& Z. B8 S2 o4 A3 I
         m_Protocol=UDP;  w9 H, D& O8 u7 x
         break;8 ~2 z. h$ e" {3 p5 y6 s8 ?
   }, E+ e; `4 {3 i% |. j
   if(TxtEdit->Text.IsEmpty()){1 A- L/ ]9 k9 {
      ::MessageBox(0,"lease enter the text you want to send!","Error",MB_OK+MB_ICONERROR);* s- q/ J* m2 c1 p6 b
      return;}
3 p4 k$ T7 Z2 d1 |5 [2 l
9 r7 K2 m2 _" @7 A- y, P1 d$ |/ B   //Initialize Winsocket
4 U3 S' r. a4 `4 Q   WSAData wsaData;- ^, q% `" N$ A. h  Z- T+ K
   ::ZeroMemory(&wsaData,sizeof(WSAData));
- ?" `/ r& w0 M& I3 v   WORD version=MAKEWORD(2,0);$ f( y0 d% ^6 A. W
   if(::WSAStartup(version,&wsaData)){
) }4 n: |- k  G9 m0 ]9 x      sprintf(szTmp,"Failed to initial winsock enviroment!,error no:%d",::WSAGetLastError());
- D. s( Q% A4 C6 G1 @      return;}
" c' l' y* a0 v1 N0 c$ U% s8 e3 P, Z9 `8 u0 j
   //Obtain the active connection: {4 X# R9 ]6 G( @
   char ComputerName[255];
' S3 r) r) x  y5 Y+ O+ k   gethostname(ComputerName,255);7 p% |: |; ~! L) H/ ^# K
   struct hostent* he=gethostbyname(ComputerName);
3 L: ~. R7 i* p. R   if(!he){' g. I7 N  N( v8 R: A+ N
      sprintf(szTmp,"Failed to get information to host!","Error",MB_OK+MB_ICONERROR);
6 {/ @* m! r( i2 _$ @6 ?5 F! e      ::WSACleanup();/ \5 f1 p5 p) {3 k+ P9 L
      return;
" b7 O% n' {5 T  {- I   }9 \9 |. }6 c$ e. Q" P
   //create new socket
( w3 n, |! r: o; Q   m_Socket=INVALID_SOCKET;
3 k/ V: v: S1 w0 H' i) w* o   switch(m_Protocol)9 W5 }+ @% T: x0 {' Q/ c1 g
   {; S: k: ~8 x; q1 `' V- x
      case TCP:
5 U. b, o, v! @/ N3 J+ B         m_Socket=socket(AF_INET,SOCK_STREAM,0);
  u( U# s  ]$ \7 g/ i* v  o* P         break;
* Z& }/ T4 S( R, k$ @5 b      case UDP:
1 Q2 T0 F5 W0 c* ^9 z6 v         m_Socket=socket(AF_INET,SOCK_DGRAM,0);
* \- c6 C8 _+ s# P4 G9 y) N         break;
! ]7 ^! K+ l8 B7 D( G   }
, N- T6 U- n0 Z: \! a   if(m_Socket==INVALID_SOCKET){0 _4 h7 t4 ?# i% j. p& H6 i& n- C
      sprintf(szTmp,"Failed to create a new socket!,error no:%d",::WSAGetLastError());
* e$ i& x* j5 `# ]5 R! W      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);
) ~  t3 Y1 d8 E/ C) f: D      ::WSACleanup();( Y9 u' g3 b) \7 x
      return;
8 j" e5 l" ~: D   }' l; C" A7 G4 s9 h6 P
   //bind socket2 d$ K  _+ C5 P3 x3 h
   struct sockaddr_in client;( F1 v" i2 s- A
   unsigned long nClient;
6 h. o" |0 h) v" Q2 T   memcpy(&nClient,he->h_addr_list[0],sizeof(int));3 Z1 M  \/ Q3 s( y: B' K: y
   if(nClient==INADDR_NONE){
1 c! U! T* @2 {6 n1 v1 g      sprintf(szTmp,"Failed to obtain the local machine's IP!","Error",MB_OK+MB_ICONERROR);
1 P, ~1 v' R) y( ]/ V# `      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);+ J0 _- e/ |% w7 o; r  E; E' T  ?
      closesocket(m_Socket);6 ^% c  M8 M- T; m0 ^2 N
      ::WSACleanup();
5 J. K% h7 U- w0 t      return;  s3 }4 j9 d9 e. t, W* @0 Q+ g
   }
7 l4 x) ]" c8 ~   client.sin_family=AF_INET;
) j8 a& C7 Q9 `   client.sin_port=0;
. F+ ^! z9 R. u& m: c" h0 f8 @   client.sin_addr.S_un.S_addr=(int)nClient;! Y+ G6 `9 W5 g/ B, U4 v& s
   if(bind(m_Socket,(struct sockaddr*)&client,sizeof(struct sockaddr))){
+ V+ P! U% t" \      sprintf(szTmp,"Failed to bind socket!","Error",MB_OK+MB_ICONERROR);9 A# e: `2 y7 W* a  l5 W' \, q
      closesocket(m_Socket);1 {' v2 e0 Z4 x
      ::WSACleanup();1 @+ V& @5 {' }# v% r
      return;}
$ N/ h; I' a/ N( N0 G* ^   //connect socket6 p+ n- W. q* V2 G' X7 N% Z7 H
   struct sockaddr_in To;
8 `9 K- ?. w% X/ v; u+ _; }1 H/ m   To.sin_family=AF_INET;
& w+ _: K1 u  l   To.sin_port=htons(m_Port);7 [2 X" L7 y; B5 k3 C  T
   To.sin_addr.S_un.S_addr=(int)nAddr;
# T1 x! q3 r. U9 o   fd_set FDSET;
8 ~3 V+ W4 J$ D3 ]" l! D   FD_ZERO(&FDSET);
# b/ |$ l/ Y7 L# W" p9 A+ l* b   FD_SET(m_Socket,&FDSET);
' q& K' q$ Q7 x4 \5 h- }6 U( g2 z0 Z% R
' ]8 ]; R' w% _/ \: n
   if(m_Protocol==TCP){
. |( Q0 Z9 V8 l: w- {. T      if(connect(m_Socket,(struct sockaddr*)&To,sizeof(struct sockaddr))){
' N# R: F- d; u$ e, H7 W( K         sprintf(szTmp,"Failed to connect the object!,error no:%d",::WSAGetLastError());
  R" i! Q" b) d; F         ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);3 T# T) u% A0 l: N  ~4 k
         closesocket(m_Socket);9 I: a4 Y% }5 Y- x
         ::WSACleanup();4 j4 Y$ N7 t3 E: T, c
         return;
0 ~  [+ ?3 u& L' r+ W" j; L1 d      }) U" F: X$ T' p8 R) S
      int nError=select(1,0,&FDSET,0,0);, b2 X, l0 _' l% T. m* c
      if(nError<=0){
4 e# n! D6 ^% t% F      sprintf(szTmp,"Failed to select socket!,error no:%d",::WSAGetLastError());; j" E; `% W! E- m" F# A1 X
      closesocket(m_Socket);
! d+ L2 o' _) ~7 R( X( R$ r      ::WSACleanup();( s& G6 I  |' H! k7 n
      return;}% V. I7 e8 j4 l) i8 s& O
   }
% i- q+ i$ X. h- R0 v. f& e' o9 m   //Send data& h2 y* K* h( G! a0 m
   int nLen=TxtEdit->Text.Length();: L2 W( S% i9 z
   if(nLen>4096){: X; r, y( _+ b+ t( i
      sprintf(szTmp,"The buffer is too size to send,it shoud not be more than 4096 bytes!");9 a0 T& l1 v6 H  p$ G- r
      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);3 z" {. g3 E! w) e, _
      closesocket(m_Socket);; d4 U+ t$ d5 O5 {9 C  z3 Y
      ::WSACleanup();) g+ d9 l! }' U+ g+ z; h1 Z
      return;
6 _4 g/ h- Y+ I6 j   }
7 n; q7 ?! E1 o5 T3 m$ D  @- ?   strncpy(buf,TxtEdit->Text.c_str(),nLen);) D6 ?# c6 E: o0 L  I
   switch(m_Protocol)
# V( z) D3 G* G6 e7 l   {
0 i% z- W& E5 S5 W      case TCP:  J/ {0 P% V1 B8 Z1 W4 {. @+ d
         nSize=send(m_Socket,buf,nLen,0);
0 ]% m6 w2 q5 c         //ShowMessage(nSize);  {2 @6 E4 ?" A3 G2 Z3 [% D- J
         break;+ }. ]1 {& B+ w! n  C/ B
      case UDP:
6 f" y# [3 s/ D+ a. ~% X5 }( A         nSize=sendto(m_Socket,buf,nLen,0,(struct sockaddr*)&To,sizeof(struct sockaddr));
  A/ E- e9 m6 ]% t, }7 F0 S         //ShowMessage(nSize);! r5 i6 U2 P5 H1 f$ U/ Q( l/ |# i
         break;+ ^2 M, q  {( w2 z' D
% N' G: W4 w0 z2 G
   }* P  q; Z7 s$ I1 g
   if(::WSAAsyncSelect(m_Socket,Handle,WM_SOCK,FD_READ|FD_CLOSE)){& f! j5 \8 ~) {1 B" R1 a
      sprintf(szTmp,"Failed to register socket event!,error no:%d",::WSAGetLastError());
5 A1 V$ H5 ?% H8 c7 x      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);
& j/ T: ]8 q, H- q: b0 Z0 P' U0 Z: K      closesocket(m_Socket);
5 [' h- U. U" m5 ^6 i1 D2 }6 u' u      ::WSACleanup();) @( a/ b% s7 ?2 V$ I; c8 F
      return;}
8 q  t! Z# ^& C$ E}$ W8 @! w% i1 |7 B  C% y- R
void __fastcall TLANForm::FormDestroy(TObject *Sender), ]* M7 Z* T1 F! F; y* S* p* A
{' ?! P8 [8 g2 [3 @3 b6 ~
   closesocket(m_Socket);
& v5 z( ?9 G* A9 m   ::WSACleanup();% z! a7 M" M; r( [+ m& l0 M
}
; l- w9 R) [3 U# u$ d  {; U
8 h% ?+ {2 N' sSocket api Server:" h5 D$ O( `8 ^! E: `
.h File) L1 R  Z6 |! R6 m" a
#ifndef UDPServerH
' k) K2 R, D$ D) h* d" }/ H6 P#define UDPServerH1 S- ?% r, ~+ L3 a( s
#include <Classes.hpp>
3 X2 Z3 {  z0 h3 V#include <Controls.hpp>& j5 a' }! J1 ~
#include <StdCtrls.hpp>6 ~8 z" U: m  i; j- _( ^3 s) S. X
#include <Forms.hpp>
  q/ I4 e% i, x4 h#include <stdio.h>) g+ u. B9 B# P; I2 R3 C1 P0 C6 n) j
#include "WinSock.h"
6 O; a' m% ?5 Q  ^. x; S4 r" |/*#define WM_SOCKET WM_USER+1000
1 l' o/ y5 ]9 v/ N& b# N; ?5 M, C#define INITSOCKETSUCCESS 0
' h1 G$ V; n9 q#define INITSOCKETFAILURE 1, l" n6 T# y, U/ [$ L
#define CREATELISTENSOCKETSUCCESS 2
! d+ y6 Z8 `" l, b/ Y#define CREATELISTENSOCKETFAILURE 39 b6 ?$ S4 \3 k& n
#define SETLISTENSOCKETSUCCESS 42 g: O& p1 U& T/ D
#define SETLISTENSOCKETFAILURE 5
9 U7 c# }5 }  o" J4 d  W#define BINDLISTENSOCKETSUCCESS 6
. x5 o9 _: V1 J, p* T#define BINDLISTENSOCKETFAILURE 70 Q. n8 J/ x& Y; q' O0 P* @3 s: X
#define LISTENSOCKETSUCCESS 87 z( q3 Z" x  S% Q0 e* g
#define LISTENSOCKETFAILURE 9
, _5 p' T$ A* W" t; A#define ACCEPTSOCKETSUCCESS 10# U7 X5 p4 U# F
#define ACCEPTSOCKETFAILURE 11
8 F0 |- U% g  ?, k  A. ^8 h*/! ~  k- e8 T8 h* J+ _
class TPSTNForm : public TForm8 Z- L+ J; \5 B6 G6 B5 [
{
/ T8 ~5 [2 H( H! G9 q. r# I% R__published: // IDE-managed Components
9 f7 I- B% j! {7 v9 M2 D0 C   TEdit *Port;9 }* Q/ T' J: @
   TLabel *Label1;
" k+ ~9 r5 Q+ f/ ^   TMemo *Memo1;  M7 G/ A8 J" R' a! s- t& `: L2 ]
   TButton *Button1;' X# g3 r$ u( h
   TButton *Button2;# I6 z, }9 G1 S) A- y/ u- |' W
   TLabel *Label2;5 F8 c' s4 J: I* D/ Z% K
   TComboBox *Prot;
+ ~. L& O5 R8 W6 y8 T! S1 E   void __fastcall Button1Click(TObject *Sender);
  k( v" Y; h+ l6 E* e   void __fastcall Button2Click(TObject *Sender);
7 M+ |% v, H, Z" ]   void __fastcall FormCreate(TObject *Sender);6 Q+ |, G' A6 J. W. s
   void __fastcall FormDestroy(TObject *Sender);
' I# t( V& K. ]private: // User declarations5 k+ I4 ~3 }; U9 s% h, {
public:  // User declarations" S' j: q' @3 a! p
   __fastcall TPSTNForm(TComponent* Owner);
; A7 E. @5 v+ L, s# _* C8 R& A. D};- o8 B% G& b5 n! i: v* |! [
enum PROTO {TCP,UDP};7 k0 @8 N  J' [: z! V  w  n
class TCommunication:public TThread    //Communication Thread
0 u( W, }4 }0 f- ]5 O" q{
* Q' H+ C: y9 Y6 \private:7 l7 `  ~5 p: ]8 u3 @# o/ ]
   SOCKET m_AcceptSocket;
$ ^; l" |, f5 f% Q4 w$ I: X' j   char szTmp[256];//ERROR MESSAGE; c, X1 z. M& O  t: }
public:$ R( L+ d4 n5 j8 I2 a  Z+ V
   __fastcall TCommunication(SOCKET m_Socket,bool CreateSuspended);
8 q$ ^8 L, i& g# t# n$ A8 ~   __fastcall ~TCommunication();
0 G( H) _* j4 `2 S* a" ^protected:
1 j$ B0 ]( _4 m1 i2 v   virtual void __fastcall Execute();
5 i8 `# Z6 ?+ G- O- B};
  k- s- e3 l# R) r/ vclass TListenThread:public TThread //Listen Thread
' q1 z( ]9 U! z2 F+ n+ q" n* |{
4 T& U) Q: s2 `/ ^private:
$ y2 q' R- q1 w2 }- h, _! V- Q   WSAData wsaData;6 F9 Y& S% A) Q4 i! `) ~8 O
   struct sockaddr_in server;
2 D' g( i  R- `1 f3 y" \   fd_set FDS;
( Y% a4 J; e  I$ h! k   UINT m_Port;
2 a. ]: d& t) j( F9 w% v- T! a   PROTO m_Protocol;
6 X8 Z9 d$ ~* k% ^- I   char szTmp[256];//Error Message' R/ G1 o, Y7 [8 d% F
public:# n/ N, [& s' s: v! s0 Y
   SOCKET m_Socket;
& b8 J! }% b0 r& H. {6 I, D& N2 L) s" m   void __fastcall DoError();1 |* a" W, r3 F1 B9 x
   void __fastcall InitSocket();2 n2 X' x& V, }
   void __fastcall CreateListenSocket();( A6 S. g4 {5 B% R+ J- ^( Q# X
   void __fastcall SetListenSocket();
$ p2 h/ z1 R; b   void __fastcall BindListenSocket();
2 x! K$ y0 R1 L7 c  ]. x6 T8 g   void __fastcall ListenSocket();. M5 M: I0 P) X" G; o; ^8 F1 i: {
; H! }% X& U, \
public:
  b0 Q7 x) b, ^! `/ T1 F; l   __fastcall TListenThread(PROTO m_ProtocolA,UINT m_PortA,bool CreateSuspended);# h( b- L# C: _% e4 w# L) p1 @* k
   virtual __fastcall ~TListenThread();: `- U& l* U, n, D, e" f6 u
protected:8 {( U  v: d# x1 n, \2 c
   virtual void __fastcall Execute();
; k4 }% s/ n# l" H};
4 t3 e) C0 n7 g1 [" }$ oextern PACKAGE TPSTNForm *PSTNForm;
+ r9 U9 M9 h% Z0 Q# E: x#endif
% a# q" J, n; C1 M/ n.cpp File
2 a7 U' P  y& G4 {( v  r#include <vcl.h>6 z, K  t3 B5 a  j
#pragma hdrstop
3 E2 a9 i+ T1 R" V8 _#include "UDPServer.h"2 N- N: E4 t* c2 u
#pragma package(smart_init)
: i0 n0 s5 Q3 u4 Y#pragma resource "*.dfm". [# D" N# z. h  H
TPSTNForm *PSTNForm;
2 x- v1 ]' D8 X1 F7 R# X6 JTListenThread *pThread=0;
- p1 j) g* Q& I$ Q' y+ F! V+ a) e# \//******************************CLASS TCommunication For TCP****************************************************
) ]6 ?/ j; c$ Z6 r# Z( s. _' E__fastcall TCommunication::TCommunication(SOCKET m_Socket,bool CreateSuspended):TThread(FALSE)
, M& T6 T  H3 C{
7 J/ R: z' X6 Q- a3 w# w   m_AcceptSocket=m_Socket;
) A0 X. I+ [' N, Z   szTmp[0]='\0';- n" L& v8 g# y1 Y8 f
   FreeOnTerminate=true;
1 u: E4 _9 w2 i% u3 |}
, a4 W2 p$ C4 M; ^! @  U__fastcall TCommunication::~TCommunication()
" r/ E1 f1 |' H6 M: X% F6 Q{
) L  g; ?$ c0 x  B0 C5 i  // closesocket(m_AcceptSocket);( F- C. c/ a# N. p
}/ y( Z3 U& [% l
void __fastcall TCommunication::Execute()6 s8 G, d7 r( S7 u; N; Y
{) @' g6 O" [, J' I  h# [
   char buf[4096];* h" M; N  U/ w  N( q+ f' w5 ^
   int nSize=0;' L" K" N- T* v# |! J! q9 y* {
   nSize=recv(m_AcceptSocket,(char FAR*)buf,4096,0);, n$ P( o' g0 h6 w, g
   if(nSize>0)
; z# r: u4 K9 C6 o7 g' ~( O$ U$ u/ U   {
3 a0 i, z5 B4 `0 q! R4 l& T8 j      buf[nSize]='\0';
- Z4 }% S0 O* Y# y* n+ U      //Display% N, N: Y( ^6 Q& k
      PSTNForm->Memo1->Lines->Add("Received Length:"+String(nSize));1 `# n& }+ Z: t' ~1 \" |) M
      PSTNForm->Memo1->Lines->Add("Received:"+StrPas(buf));
! }0 \+ p1 [  }  h2 K      //Deliver
, C/ l1 U1 ~. k! Y      ::Sleep(100);% @9 I1 W) h3 R0 t6 b
      send(m_AcceptSocket,buf,nSize,0);
$ M( w* b& v" m3 _: d1 V8 C   }5 @  u0 a1 t/ k4 O( k# Y

: U- v/ z& |% K! Y2 Z4 e: k}
5 X  K9 L/ k/ E" a0 k$ ~8 O//******************************CLASS TListenThread*****************************************************$ ~6 d3 ~. v& v) b7 z) e% m4 f4 F1 s
__fastcall TListenThread::TListenThread(PROTO m_ProtocolA,UINT m_PortA,bool CreateSuspended):TThread(FALSE)! @3 g! D/ P. Q. M! T' Q
{
# k8 J+ Q/ h" a   m_Socket=INVALID_SOCKET;
3 p& ^" y5 s1 S+ d" C6 _. N   m_Port=m_PortA;4 }' p' [: c6 B5 @! U' M
   m_Protocol=m_ProtocolA;- l" F. y8 X) s6 k) m
   szTmp[0]='\0';8 v  C. i: }0 J: {! o! q
   ::ZeroMemory(&wsaData,sizeof(WSAData));
3 X$ \) M) c# I# C! Z& n* g   ::ZeroMemory(&server,sizeof(struct sockaddr_in));1 k+ {# }5 \# r! n" u$ C! Q$ ^  T
   FreeOnTerminate=TRUE;//Automatically delete while terminating.
3 Y) O) n) o2 `" I}
; r6 Z( \% G& p7 ^- N* ~3 U__fastcall TListenThread::~TListenThread()
* u1 M3 f2 B+ E9 }! l. M. Q: d8 ?{
8 m; q2 m# E4 ?) |   closesocket(m_Socket);# p2 Y& J4 a+ O& l# w# H5 X# N4 G
   ::WSACleanup();
9 y7 H6 I* V4 M, I   m_Socket=INVALID_SOCKET;
$ i5 Y0 F: d) g& J) i$ \7 J. g   m_Port=0;
- |% W4 g# v8 V; P3 m7 b) |$ r   m_Protocol=TCP;- |6 L9 O* X4 p8 i
   szTmp[0]='\0';+ {, c2 @( f4 t3 i) i
   ::ZeroMemory(&wsaData,sizeof(WSAData));
1 g8 R* Y' j0 \" |: q   ::ZeroMemory(&server,sizeof(struct sockaddr_in));0 t0 D6 M; G8 y' k6 g2 {
}
0 _& z- N" m: M: R: o  _void __fastcall TListenThread:oError()/ ]7 \1 }0 U  q' |# \1 p) |4 d
{
. Q+ R! M8 B. p& e8 |( F   if(m_Socket!=INVALID_SOCKET) closesocket(m_Socket);9 t) S0 A0 j; B3 o8 c
   WSACleanup();4 E" E( E& B6 f7 C* x( `
   return;
& h: w+ I  D* S; e" Z, w) i}
- u# X; }: i9 N4 F9 @9 rvoid __fastcall TListenThread::InitSocket()* d; y) w% M1 l) y
{
/ f- ^; x" f+ D& ^5 t& e   WORD version=MAKEWORD(2,0);/ ?8 |. }1 ^9 Z3 o" a) Q
   if(::WSAStartup(version,&wsaData)){
% T3 F3 F2 r, T5 t& l" y      sprintf(szTmp,"Failed to intiailize socket,error no:%d",::WSAGetLastError());
3 {8 {: U1 h6 K& W/ a7 f; j      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);
! a( v4 O6 @7 X) X! i, T8 r. I      DoError();
% c8 @1 [' E; h0 H2 k; w      return;- h& f& ~* `5 H8 L
   }
+ L  G7 U! V0 \8 o2 o}( e" v* t$ d8 u4 m
void __fastcall TListenThread::CreateListenSocket()
. }* g! Y8 H, |8 M3 f( `{
3 O3 }3 Q, W+ {" c) Z5 Z   switch(m_Protocol)8 T( c: n' H) p& E) [
   {( I* z+ h6 ]( j) t
      case UDP:
% p4 ?9 C. A1 |4 u5 V& d( [! A# D: s         m_Socket=socket(AF_INET,SOCK_DGRAM,0);
. |4 h1 R; c% [2 T2 U         break;
! v  i. d8 H5 z4 A. l      case TCP:
7 Z0 ]- U$ N( g; n* M         m_Socket=socket(AF_INET,SOCK_STREAM,0);
0 [) d9 Y2 d, e1 F  }4 n5 J5 K. z         break;
3 J) ^- b$ z! f      default:
* o% X  G) U& C  T! ~         sprintf(szTmp,"Error protocol!");
# y7 h; q* Q4 e% Q: r7 p         ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);
, B0 w" y9 B; Z$ @         DoError();" q  Y9 }' f. r' G: x6 u+ b: `+ j* W
         break;; F, ^9 x/ i  p  c7 f9 a( M5 X
   }
; e- m0 l5 m. e' }# J   if(m_Socket==INVALID_SOCKET){4 A$ B( I( H$ I3 `. a
      sprintf(szTmp,"Failed to create socket!");/ B  n0 N* O" q7 o) j$ j
      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);
! b+ x" p. c! ^2 l3 T      DoError();
5 ^/ ~: D" Q& w      return;
9 A1 n( f3 F& ~$ W   }! c" j/ l2 G: P5 w# ]
}3 v* r& L/ s- L6 I1 g2 Z; Q* h( K( P
void __fastcall TListenThread::SetListenSocket()
. d! P" f0 Y. f{2 |3 u$ Y" o: K9 h4 e( l0 a) d/ G/ {/ @
   server.sin_family=AF_INET;
, r! L* O) n4 q$ Z% R( T   server.sin_port=htons(m_Port);
; e$ T; X* k5 q: O( s# j* d   server.sin_addr.S_un.S_addr=INADDR_ANY;
4 w5 H+ ~. A, F! y   int NewOpenType=SO_SYNCHRONOUS_NONALERT;3 [/ L' l7 c5 \" o
   if(setsockopt(INVALID_SOCKET,SOL_SOCKET,SO_OPENTYPE,(char*)&NewOpenType,4)){* q* h7 H  U3 S/ O4 o% Y
      sprintf(szTmp,"Set socket option error,error no:%d",::WSAGetLastError());
. Q6 R0 K; L# x9 x      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);+ k' s+ C  N- S/ s; P+ x
      DoError();4 B& \* t& ~7 X0 `$ U6 x1 V* w4 A
      return;6 t: r# \  e5 `# e+ _* ]
   }* I) v. V) j6 v/ m* c
}/ d8 u7 G; V% r+ h. h
void __fastcall TListenThread::BindListenSocket(). ]- D: f( f! B, t; _2 G4 T
{# O. j& I: [8 z; D% f5 [
    if(bind(m_Socket,(sockaddr*)&server,sizeof(struct sockaddr_in))){
4 Y: }  B8 ^" @! ?6 ^* F7 k      sprintf(szTmp,"Failed to bind socket,error no:%d",::WSAGetLastError());
; D- t, m0 a& t) M7 N  I      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);
2 u4 u& F5 S- h/ q" M4 w# n      DoError();2 O  h- {3 H6 A& T% V$ Y4 B/ M9 R
      return;2 J" F4 d6 g- b1 h8 z# ]
   }
" o- p# [4 v" {, N4 q9 T% [5 V7 n
}7 [8 _# a6 J& ~  V6 `
void __fastcall TListenThread:istenSocket()1 K6 X; {8 ?2 F$ J- W9 K
{- r  L3 E  ]! z. F
  if(listen(m_Socket,SOMAXCONN)){& @9 L% q7 j& R; b# I! M% G7 R
     sprintf(szTmp,"listen error,error no:%d",::WSAGetLastError());: {$ B) j0 Q! g$ E0 [: N8 I* A* r
     ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);
/ Y6 T5 v, @; v- v5 T     DoError();
9 U" q: h. O2 P6 q$ E     return;! s+ C; Z9 P' k, F! O& {
  }
3 |  F- u2 W0 U* z  s& K0 }  //Determine whether there is any connection
& ?5 p2 l9 U! ]  FD_ZERO(&FDS);
) @6 x: N) _0 K" P1 Y: `% G  FD_SET(m_Socket,&FDS);0 H" L8 I' g( J9 t& d* ~
}$ S1 _/ P( ~& o- ~7 V: L7 X
void __fastcall TListenThread::Execute()" s" q% i; j; R7 W
{5 ?4 i% I% ]  I% e  s! D; z* R
   char buf[4096];. \3 b5 m8 x: x/ M8 ~3 `# K1 U) l
   struct sockaddr_in from; //for UDP
8 n% V+ f7 f8 ]2 l% L   int nLen=sizeof(from),nSize=0;  //for UDP
+ R) \; \% U6 b2 u- |6 t   InitSocket();
: w3 O: U( a; t- [  d9 W1 ]   CreateListenSocket();1 s  m, Z+ J; t5 L4 g* H
   SetListenSocket();
/ T$ v& F, s. O7 s  D   BindListenSocket();
( q! D% F& A$ ~* D7 M   if(m_Protocol==UDP){# T& S1 ^3 W& Y& `9 E% o2 B0 f
      while(!Terminated){
( J# p; D( k+ c6 A3 d         int nSize=recvfrom(m_Socket,buf,4096,0,(struct sockaddr*)&from,&nLen);
8 f3 I; q7 W# a+ \' R         if(nSize>0){; F0 t1 U5 l: V9 [; {/ l
            buf[nSize]='\0';
, x5 H" w8 Z( _& b            PSTNForm->Memo1->Lines->Add("Received Length:"+String(nSize));# K# f; v  h0 ~, c
            PSTNForm->Memo1->Lines->Add("Received:"+StrPas(buf));
2 I* u& R- t/ U/ A1 g. }' W" A, U3 N            ::Sleep(100);% r5 z- ]$ Q/ W4 ^( b' U% D
            sendto(m_Socket,buf,nSize,0,(struct sockaddr*)&from,sizeof(struct sockaddr_in));% c4 c7 G2 Z6 I
         }
, N+ }- s4 Q4 @$ ~% z* i. b. H         else return;. D% }: x9 b' K

7 G) o9 b  f  T9 v6 R, {      }
# j& d* n5 A5 i   }1 M8 ?; D; e9 t, ]9 ?1 w" @
   ListenSocket();
2 P3 N, p# T& W- A' z; j5 M   struct sockaddr_in client;
6 e% o. E; C. [& T( u% e& s   int nLength=sizeof(struct sockaddr_in);
: }6 W1 y: A' F6 t" t# w   while(!Terminated){! f) d3 y& [) N
      int nError=select(1,&FDS,0,0,0);3 B: {5 ?( Y3 J: A: W- i% _
      if(nError<=0) Terminate();  o4 M  O; s8 }4 {
      SOCKET m_AcceptSocket=accept(m_Socket,(struct sockaddr*)&client,&nLength);! }& [7 q$ G- q( v' ~+ o* V1 S- T4 G, r
      if(m_AcceptSocket==INVALID_SOCKET){
& {& _! ]; a  v  e         sprintf(szTmp,"Failed to execute accept,error no:%d",::WSAGetLastError());
0 x6 a2 g. s5 E3 @         ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);5 I9 S# L. b/ c% b, w/ N, M6 I
         DoError();' r, K( l+ I: J6 J" h5 F
         Terminate();
2 P+ V% @8 J! l         return;0 |' P8 b! m+ L- l0 M
      }
+ v/ h1 p: l$ r; q      TCommunication *pCThread=new TCommunication(m_AcceptSocket,FALSE);! T8 v* {9 ]8 g" ~. r8 J4 j
      pCThread->Terminate();
6 L5 D' b. H. \( B1 @& k      pCThread->WaitFor();
6 h& U( z$ Z7 ?; h, l+ Y/ }   }
0 k: N( l! k4 r# }3 e( f+ W, Q}* Q/ A" B9 E+ g
//************************PSTNForm*********************************************//) d+ [" |& q1 U' e4 Y8 m
__fastcall TPSTNForm::TPSTNForm(TComponent* Owner)9 Y& E* O7 a) o& C) d) K
   : TForm(Owner)
$ _6 u3 d" B6 l# ~" Q{
+ W/ Z! B- [/ f# E% Y' N6 P}5 t& h. Q- T; h% v. ^) }0 }, T
void __fastcall TPSTNForm::Button1Click(TObject *Sender)- v4 U/ ], G+ D, f% L  g
{; y; l" _; a+ U% [3 ~
   Close();  P* t/ b  @4 n  s& g4 U
}
0 P2 D2 q" ^, T2 Y  l, x0 `1 Vvoid __fastcall TPSTNForm::Button2Click(TObject *Sender)2 z& p, M8 d0 i) a
{
% Z' U. j# T' o   if(pThread){
$ \: _. s  {. k8 P' X! T( _; Z: @      pThread->Suspend();# S4 }: R; t# y- [: G6 i* P
      pThread->Terminate();
7 t0 V9 [! \3 o4 w* h      delete pThread;' t1 U1 T, a, W2 W
      pThread=0;- @3 ~# g* y- B! A
   }
( Y' P; o4 A( |' A; m( }$ r  T   UINT m_Port;
; `  o0 d* U; J5 I+ [% n   try
/ Z" ^5 Z9 f2 P   {  z7 G1 [" e6 S4 K: E6 p4 P; M
      m_Port=Port->Text.ToInt();4 L$ f; T0 z4 K+ Y1 \$ \
   }
1 O* W% ?& q. B1 L   catch(Exception &e)
2 a5 r( P/ `6 j/ k, t9 c3 Y   {
5 C2 f- Q) v/ r3 F* h* L3 z      ::MessageBox(0,e.Message.c_str(),"Error",MB_OK+MB_ICONERROR);
# w7 [2 S/ G8 `" r/ }      return;$ f8 O* Q# A1 z* F- Z; \; i
   }2 d$ ]" |% L. n9 c( |' Q- U7 V4 O
   PROTO m_Protocol;  \( |& x) @: J) G7 C2 p
   switch(Prot->ItemIndex)
9 i) J: b: g$ g4 H& j8 o1 v% F   {2 |: B- |# h; S9 }. G
      case 0:
6 m" c5 h4 u# T         m_Protocol=TCP;
. F6 g. u$ V0 A0 H         break;2 o3 c7 z2 M: q, M! i) \
      case 1:
$ C# s5 |) ]- ^/ R         m_Protocol=UDP;7 {3 k& O9 B% @, V
         break;
; Y5 _. @( c6 S( R/ w; P1 v      default:
. r. ~* Y: B, G  j8 O5 z) a$ W4 S         break;
  L3 c2 E, e8 U3 C, B9 v   }
& G8 T  J* h' Y/ P   pThread=new TListenThread(m_Protocol,m_Port,FALSE);
6 t  u! S* k* D9 O  a   //pThread->Terminate();$ e, P8 A; T6 X( n7 [
}. f. H9 }; W& }% e
void __fastcall TPSTNForm::FormCreate(TObject *Sender)
! E5 ~8 }* b8 {/ F% \8 j" Z$ v  c{$ J, Y- B' x9 U" [8 v) Z
   ::SendMessage(Prot->Handle,CB_SETCURSEL,0,1);" f  a+ U) T( q
}
: v  N+ S) _0 Z/ K) {
2 h! O- V9 [: O) {/ y% o; W1 g4 fvoid __fastcall TPSTNForm::FormDestroy(TObject *Sender)
" T) i3 q) J" h2 \& `; \4 U{0 K1 b# U+ f; q
   if(pThread){' ~# s% z' b1 N) K
      pThread->Suspend();
8 m/ _8 [9 o5 h# i7 l9 D' o- C      pThread->Terminate();}
  H$ p2 d/ C6 g6 i! W% A" K% a+ }7 T}9 u' Z; N8 h6 a) n. C+ [
上面的代码,各位可根据自已的需要和针对自已的应用,在数据处理方面加以改进就可以了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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