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

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

[复制链接]
发表于 2004-2-15 14:01:13 | 显示全部楼层 |阅读模式
在CB中用socket api来写网络通讯程序& E: b! X. k: w% T: f  i
作者: kingcaiyao ,如转载请保证本文档的完整性,并注明出处。) N; k9 d! G& }- T- V
欢迎光临 C++ Builder 研究,http://www.ccrun.com/doc/go.asp?id=569
5 \7 Y' L( O* i本文转自csdn,作者:kingcaiyao
. L7 F7 I5 ?" J" j! E1 D! i1 U" }2 H- ~原标题:在C++ Builder中用socket api来写网络通讯程序(同时支持TCP和UDP协议)
* K- Y- r& ^" U3 q原文:  http://www.csdn.net/develop/read_article.asp?id=19883
% u9 K0 E6 @& ^- n1 L) K# y" ?7 o4 I  b# a. t; F

: q5 r7 [* k: c7 W; B在7月4日看完sockcomp.pas后,我决定用socket api来写一个客户端和服务器并且同时支持TCP,UDP协议,于是我就去做,现将代码贴出来(已调试通过)
/ Z+ V0 R5 q6 L8 YSocket api Client:
8 C1 q% s1 S* i% E$ X4 e, G6 g3 s. o4 H* E. U" Y* w
#ifndef UDPClientH
- f! J+ y: o( B# v- {# v( ~6 ?3 l0 p#define UDPClientH
" D! o' V* i4 F#include <Classes.hpp>
4 s0 N4 L* @8 v, u% K9 M& w  Y#include <Controls.hpp>  z3 g4 A/ p0 [# {7 T9 E
#include <StdCtrls.hpp>
1 Z5 q3 n  G9 `3 b* n" s#include <Forms.hpp>! E; y' C7 ?: g* W1 ~
#include <stdio.h>3 X: ^6 x0 o3 Z8 G
#include "CCEdit.h"2 T. f4 }' a1 e* \' m
#define WM_SOCK WM_USER+1006 G1 h5 r4 N% h( H# k7 I
class TLANForm : public TForm1 N( D0 [6 L( a5 q" ^
{) a, H" q( G! x/ T9 Q
__published: // IDE-managed Components
  u* I( U+ P: c* |! N% Y   TEdit *Port;& Q4 A* X( t2 s; `
   TLabel *Label1;
! }' R$ j$ L; x8 d   TLabel *Label2;! V9 y* D' x- b" I- x+ A, ~9 _
   TComboBox *Prot;
  x0 a8 {( @/ m1 {   TButton *Button1;
% S9 d4 t0 o1 q" S6 i3 b4 T   TLabel *Label3;0 s; D6 D+ C) U  e6 t
   TEdit *Addr;
; j, A4 V' X6 e, f9 d   TCCEdit *TxtEdit;
7 S5 R6 K5 F9 d+ N   void __fastcall FormCreate(TObject *Sender);
$ U! m% Y4 m; G* a4 a   void __fastcall Button1Click(TObject *Sender);
3 H" x+ K! c6 j# f. \   void __fastcall FormDestroy(TObject *Sender);% i3 I! o( p& G% b4 c4 p  v
private: // User declarations
5 r: a' c- B$ z4 q% J4 `0 q   void __fastcall OnRecv(TMessage &Message);, l' A5 K8 w8 c1 @: _" h
public:  // User declarations. [2 d( w' a& Y2 c
   __fastcall TLANForm(TComponent* Owner);
6 m6 }  ?# b4 \7 l: t, S   BEGIN_MESSAGE_MAP
3 s! X! g. u3 c- t9 r3 J0 V      VCL_MESSAGE_HANDLER(WM_SOCK,TMessage,OnRecv);: g; _  @: f/ |! G7 `: G4 z
   END_MESSAGE_MAP(TForm);0 `! b) u: S# o' ^# x4 `3 v3 u/ V( B
};7 c3 u% L( ~" k+ ?* {( b& O3 g
extern PACKAGE TLANForm *LANForm;, ]6 b6 ?) e2 C, L* p; N" [
#endif
. L, y2 e+ p' k; F) p9 O+ ^; a  Y) H' j$ n) c, }( }
. T  V8 u4 c/ y8 P
.cpp File
5 G+ ]2 T6 A: O, [5 q9 s3 ]# N1 Z* i5 _, ?
#include <vcl.h>
7 O, |4 e9 A, k% A#pragma hdrstop1 G# R  }$ |8 k5 }: k
#include "UDPClient.h"
7 u$ S- c5 @' y( Q# N0 p4 G) H#include "WinSock.h"
* L3 x8 A" z& R/ A: T2 Y* P4 D* _#pragma package(smart_init)3 P2 W0 P( _3 O3 A* j. ]7 g- o( X
#pragma link "CCEdit"
9 e; C5 K5 L+ g#pragma resource "*.dfm"+ J8 N; b" L; {) q! a! q6 C$ t* |- V
TLANForm *LANForm;
! e0 Z( c5 F; f! _# senum PROTO {TCP=0,UDP=1};
% [' x# G% W. X8 j, s1 BSOCKET m_Socket=INVALID_SOCKET;
4 g, I, _5 g- RPROTO m_Protocol=TCP;" G) j! [: N4 Y- Y( O; _" D
__fastcall TLANForm::TLANForm(TComponent* Owner)& ]3 [, f  n  T# i& v9 G
   : TForm(Owner)
# ^% @6 \6 v+ ^) ?1 i, }: R{
4 r0 S% ]& n/ D# X! o! ^( M" |( T2 S' o( l3 e" q6 y
}* `8 _: `  M, L. |* l7 K
void __fastcall TLANForm::FormCreate(TObject *Sender)5 C0 }- p/ p1 x" X. e, d7 }# o+ p
{- m+ q/ T0 [6 ~+ S
   ::SendMessage(Prot->Handle,CB_SETCURSEL,0,0);- q! [9 F" d1 a4 M6 }8 |
}
4 x6 \6 T5 F9 y9 b9 A/ Xvoid __fastcall TLANForm::OnRecv(TMessage &Message)
/ e4 @. q3 u# Z: Z( K7 H" }{
1 G. V3 f* o! u+ n   char buf[4096];/ u6 k- k7 j5 T4 k% i2 E
   int nLen;
2 o% h' \: y# X  _; \7 Z; R# L   struct sockaddr_in from;0 e, \3 J0 T9 X. @5 [: t7 P
   int nLength=sizeof(struct sockaddr_in);0 k/ q) s) D7 |
   switch(WSAGETSELECTEVENT(Message.LParam))
" A: G9 ?, W' k! }: h  r  T5 [. V   {$ e/ p: w, c* S: u; ]+ K# q" b. \1 G
      case FD_READ:& p9 O' E& u, z9 h3 L# K
         switch(m_Protocol)0 S" s0 q3 @! i7 P: t1 K- w; t. I
         {6 C7 E$ S2 h$ u
            case TCP:+ j7 f" ~0 q* N( h& [6 S1 `
               nLen=recv(m_Socket,buf,4096,0);9 t# j2 Y0 B0 z- i
               if(nLen>0){, i& g0 S! q, Q- A1 n" k
                  buf[nLen]='\0';
0 y! {1 T7 d( P6 K6 Q; a8 I/ ?                  TxtEdit->Text="Received Length:"+String(nLen)+"\r\n"+StrPas(buf);, v4 _, J4 S# j$ r
               }
8 R4 j/ R" ^# @- K7 @3 s. f               break;
  P( O4 P% |- V5 @            case UDP:
/ r3 S. F" [9 S. h, f2 s" g& U. C6 v               nLen=recvfrom(m_Socket,buf,4096,0,(struct sockaddr*)&from,&nLength);3 h4 H2 z& ?; e0 M
               if(nLen>0){% F( z* b! h$ Y; k
                  buf[nLen]='\0';# [3 M1 W% n' s" o) g, `
                  TxtEdit->Text="Received Length:"+String(nLen)+"\r\n"+StrPas(buf);
0 O, _3 {1 i! m) @               }
% w- S" h$ l  H' L1 G# \               break;
2 z; p3 E1 Q5 i5 J7 E# {         }  T0 w6 Q9 h# p& D! i
         break;9 Z2 N# V; R- r- }
      case FD_CLOSE:% Z- y# o6 B( v3 I) [5 t0 e
         closesocket(m_Socket);# B! y  S, k% t2 {" W0 J
         break;$ v" P4 Q" R* s* B6 z2 S
   }
# w) I$ ?& V/ N% _+ c! P}4 Z6 l2 ^  W/ H5 d

& y  N7 B; Y6 ?/ m8 k( Ovoid __fastcall TLANForm::Button1Click(TObject *Sender)3 J! d4 n* U/ n' R! Z; i0 Q# J
{# T' q% e8 a  Z' Y& g
   char szTmp[256],buf[4096];
6 x) c6 I) |2 O   int nSize=0;
' {- r2 I2 V1 r: d( t   UINT m_Port;7 L2 w5 e2 k9 a  B  G6 p
   AnsiString addr;
9 e0 a3 O- x0 ^- T. |7 B   addr=Addr->Text.Trim();# ^0 z) N) x0 d) |( o4 o
   if(addr.IsEmpty()){
; L) }, x! I8 Y2 q9 g      ::MessageBox(0,"lease enter the server IP!","Error",MB_OK+MB_ICONERROR);. w4 D0 X2 b( d$ ^$ {6 ~
      return;7 t% Z5 A. {& u/ n; n1 m
   }; d% l3 I' B' K( U8 T) n
   unsigned long nAddr=inet_addr(addr.c_str());
0 A& l# a, s* a; ^   if(nAddr==INADDR_NONE){
3 i5 Z1 U5 k  o) s* [$ B3 ?      ::MessageBox(0,"Bad Internet IP!","Error",MB_OK+MB_ICONERROR);  ~, q) f5 S, [2 v9 V" ^
      return;}
2 c" g6 P2 P# `& T" B+ z5 H9 M5 D- @8 _6 A
   try  e) F% r; U+ A# t: A  B; x9 A
   {& v* A* @$ L  \6 t
      m_Port=Port->Text.ToInt();4 }- ~% o2 \7 [
   }1 i! K, d" A7 E# V$ C# T2 N
   catch(Exception &e)
" D( u/ E4 r$ z. n; G   {
9 S% x* ?" x" n& O. x5 B      ::MessageBox(0,e.Message.c_str(),"Error",MB_OK+MB_ICONERROR);
0 k: E9 P5 O* T- |2 G! m4 s7 Q9 ?1 p      return;' V  J# k( ^  C$ \" t/ F! }- e9 y
   }
7 g/ ~; g0 L  V5 {   switch(Prot->ItemIndex)
% d( F2 s# ]0 D; w: u+ z$ u   {
0 g! M1 i$ V- y1 g! w3 L  ^7 I      case 0:
7 L( L  s' L. K/ K1 p+ `6 Z% g+ f) g8 R         m_Protocol=TCP;
, ~# ?/ Q( p. t, B3 ]+ M         break;
# {, N9 N/ |* L  F- {8 ?' A      case 1:
% i7 @# L: V+ m( |8 d         m_Protocol=UDP;
3 a+ k% D% s! m% S& A         break;% W: _! G# }- ~9 m) _7 B
   }+ n8 u2 B+ v, h; w" U2 N/ `3 d
   if(TxtEdit->Text.IsEmpty()){
9 c0 h$ H- i5 v5 o! E, v6 Q      ::MessageBox(0,"lease enter the text you want to send!","Error",MB_OK+MB_ICONERROR);8 p! Q2 c) L4 I. ?* [) a+ ^2 X
      return;}
) W$ |$ Q1 W& J) [
) p7 Z9 ?5 N8 h4 U0 J   //Initialize Winsocket" z! h9 v/ U) A/ E
   WSAData wsaData;2 i) k: ~' `0 ^; `6 O
   ::ZeroMemory(&wsaData,sizeof(WSAData));
4 F$ F8 d8 @8 W* J   WORD version=MAKEWORD(2,0);) {4 H- j8 U7 m9 \% ~
   if(::WSAStartup(version,&wsaData)){, j0 ~! D# {. U6 _. h
      sprintf(szTmp,"Failed to initial winsock enviroment!,error no:%d",::WSAGetLastError());
- ~4 B; ?" ?4 a  |      return;}% V+ R8 n# `% E" ^" B0 V/ d

: a9 r7 l$ ]+ ?) ]5 {6 U- w   //Obtain the active connection
8 F1 T6 i/ O+ I; U   char ComputerName[255];
4 Q$ Q- W' x( Y6 A7 r   gethostname(ComputerName,255);* h% ~" l0 y$ Z6 t% X) Y
   struct hostent* he=gethostbyname(ComputerName);
6 p; u+ k+ z' r+ D% n# B   if(!he){0 w7 n/ M% a5 ^, t* ~9 E- X
      sprintf(szTmp,"Failed to get information to host!","Error",MB_OK+MB_ICONERROR);
; Y/ o5 H/ G: l2 w, V) w8 P' ?1 n      ::WSACleanup();
0 i3 G8 [; T- [3 i" r% v1 |      return;; j+ _* C7 A: D" f6 h' g
   }) U9 k. i: w) D/ a5 o
   //create new socket
) z  K+ V1 X+ `- }! F: U   m_Socket=INVALID_SOCKET;
+ n( `% F2 M9 _7 N   switch(m_Protocol)) z+ t+ a9 K6 M* l$ V
   {
2 G, W. d, [$ Z) D3 j. B1 v      case TCP:* _3 M5 Y5 g# G
         m_Socket=socket(AF_INET,SOCK_STREAM,0);- \) L. H: _7 h5 u
         break;
* Z9 u3 q9 ^4 y1 w      case UDP:9 m8 n, l( H6 P! g$ J' x/ A' X
         m_Socket=socket(AF_INET,SOCK_DGRAM,0);
+ c6 K9 X) Z% W         break;
7 ?+ w* z. {3 l   }
. o- m1 Q9 x. l7 O5 X+ i   if(m_Socket==INVALID_SOCKET){- A* N7 ^! ?& p" S7 o6 e/ X8 X% W
      sprintf(szTmp,"Failed to create a new socket!,error no:%d",::WSAGetLastError());5 g6 j( O# q, a- I
      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);
5 }3 |; ?* J/ U. F: p7 ^  J$ ~* ^      ::WSACleanup();
: e$ i2 b: m9 i6 l3 d      return;& V( f  b% j" E# K2 ?
   }2 O' Q' G( T! R/ K& e- d! M2 a
   //bind socket5 \; u. C) @2 o) e
   struct sockaddr_in client;; x) G: j6 Z( F+ u1 T5 n8 F: ~7 {
   unsigned long nClient;
1 P8 N  X4 B9 a   memcpy(&nClient,he->h_addr_list[0],sizeof(int));$ {* B, ]+ K* [0 I# C# S
   if(nClient==INADDR_NONE){$ O- _5 T' ^/ e) c' A
      sprintf(szTmp,"Failed to obtain the local machine's IP!","Error",MB_OK+MB_ICONERROR);
( Z3 X4 z* D7 \4 i2 ]3 d      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);- |8 P9 p* J6 y' T9 U6 X: W
      closesocket(m_Socket);
( j) p' ^- A3 [2 r' _9 s# y      ::WSACleanup();
: q; p0 w* i% a5 B; Q      return;
$ |' J5 o& p- V' d2 s* I; v: t   }
# Z9 a& p9 ~+ k  Z   client.sin_family=AF_INET;. X) n1 Y* ^7 L, q: K
   client.sin_port=0;
6 X3 q0 L0 M5 E: E2 j/ t   client.sin_addr.S_un.S_addr=(int)nClient;
, @( d+ y& z& M! F* u7 r" i+ R% K$ U   if(bind(m_Socket,(struct sockaddr*)&client,sizeof(struct sockaddr))){
! O% p3 k& |! O2 T      sprintf(szTmp,"Failed to bind socket!","Error",MB_OK+MB_ICONERROR);
1 r% a2 q9 |# E, b' o      closesocket(m_Socket);
5 k+ Y6 \% L8 h5 Z* Z      ::WSACleanup();  d4 n, R3 I& Z- j1 N0 u# s
      return;}
! S4 O( Y9 d) n7 B+ @9 ]   //connect socket/ J$ Q6 f: Y$ g7 M2 \2 v
   struct sockaddr_in To;5 i( \7 p) f: L( C
   To.sin_family=AF_INET;
% S# t! n& N, e: Y+ h; ]   To.sin_port=htons(m_Port);
" H0 B  H# H' o0 m  J+ S5 Q   To.sin_addr.S_un.S_addr=(int)nAddr;
0 e2 _& p2 V' e2 P$ @9 y   fd_set FDSET;3 y% J. ?: x" t
   FD_ZERO(&FDSET);
2 C0 `9 v' W3 s& `  t   FD_SET(m_Socket,&FDSET);
4 T6 L5 k* Q) t$ F0 [: i+ K6 j3 v& S' h1 k2 W; q- Z
$ h9 ^" C. i( o( J+ N. E
   if(m_Protocol==TCP){% q8 q# b0 X& @( V  G7 d! z
      if(connect(m_Socket,(struct sockaddr*)&To,sizeof(struct sockaddr))){9 H4 W. O( W. d/ h
         sprintf(szTmp,"Failed to connect the object!,error no:%d",::WSAGetLastError());  _/ E/ u- h( @$ F0 r) V, `  T
         ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);7 L; n8 w& V" n# |5 _7 S8 C5 ~
         closesocket(m_Socket);3 }, o( d) s  f' a
         ::WSACleanup();; |, X4 f7 q" V8 U+ d# J4 V. D
         return;! a" ?- p, |( ~! R9 L+ W
      }- n; w- N1 L) A
      int nError=select(1,0,&FDSET,0,0);; N' l8 j( N, ~0 L6 j
      if(nError<=0){/ R5 ]) e- }7 j4 k, c) [7 G
      sprintf(szTmp,"Failed to select socket!,error no:%d",::WSAGetLastError());* b+ N8 D8 y0 B  Z
      closesocket(m_Socket);
1 U* [* f6 u& x. y( R& d9 H: m- a      ::WSACleanup();
) ^" V6 [( {' ]! o      return;}1 m" D' o5 f' N, ^; t% \$ d
   }
' u# @! G' [5 u) v   //Send data: ^9 k( u( R1 q+ X
   int nLen=TxtEdit->Text.Length();. P. F7 k! f: [  c0 S
   if(nLen>4096){
- Y) @5 {+ x0 f( |( S; z" F      sprintf(szTmp,"The buffer is too size to send,it shoud not be more than 4096 bytes!");
+ ^& p/ D; e: m' O% p      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);. s, n2 B. \& a1 i2 h5 E! {
      closesocket(m_Socket);
. U1 L/ U$ ^' P1 S& t  }% p      ::WSACleanup();) h+ R! H1 `4 L- t8 [) a
      return;
) G( U" \/ v$ t   }
% s" [! `8 X. k, h. g   strncpy(buf,TxtEdit->Text.c_str(),nLen);
% Y) R  `8 h% a0 D% k! E   switch(m_Protocol)
! l* J+ q9 Q4 h+ `   {
3 x9 a* a* o' T      case TCP:8 d6 p# ~2 D' z( [' L$ }
         nSize=send(m_Socket,buf,nLen,0);
. t# i4 {& s0 Y( C  e) }         //ShowMessage(nSize);3 B5 ^( u% l- m" S6 o6 T
         break;
& Z/ K5 C) g; C& ~1 V& B      case UDP:
4 C! f% o! d, Y  C2 G7 f         nSize=sendto(m_Socket,buf,nLen,0,(struct sockaddr*)&To,sizeof(struct sockaddr));
. I4 J6 T: v. N* R  p         //ShowMessage(nSize);
6 Q* [1 Z! }) C6 z9 q         break;
1 {& s1 J# o" v1 q3 N& P9 }
9 B  `' u% o1 v# S; `8 w   }
9 a- ?9 M& V% e   if(::WSAAsyncSelect(m_Socket,Handle,WM_SOCK,FD_READ|FD_CLOSE)){
. l3 ]0 w* {( @: y      sprintf(szTmp,"Failed to register socket event!,error no:%d",::WSAGetLastError());* M* a4 [/ G5 s5 O2 P% R
      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);) @2 N4 W% d. S" g7 t- S* D
      closesocket(m_Socket);; Q0 g# X) ~$ e! [
      ::WSACleanup();1 M" u  }5 D0 y; h3 r& n+ W
      return;}/ W( I- p# ?/ S; w
}
* _' [  M% |# @. }2 S1 t* Ovoid __fastcall TLANForm::FormDestroy(TObject *Sender)9 R' U, c+ n# V& D4 B5 a# O, y
{  h: ^, L: w& v& R- k
   closesocket(m_Socket);% l, ?4 Q, ~6 x& e
   ::WSACleanup();
  x, J! j: `1 w* X}
2 X7 J( z5 \+ b  \9 d2 s) o- I& _& c7 _1 O
Socket api Server:5 j6 O  B4 P! Q
.h File
" U# o/ t4 ^; j/ [& i8 H#ifndef UDPServerH3 I  r% @8 {. m. O0 W" m" _
#define UDPServerH
( R" l" D0 ]) Q2 D#include <Classes.hpp>% w# u# r  \1 G
#include <Controls.hpp>, m' ~: V1 o* ]5 \
#include <StdCtrls.hpp>
. {3 w* W4 D4 U6 d#include <Forms.hpp>
! T% Z6 q4 U; i. Q4 K#include <stdio.h>2 w1 B8 C: \1 c
#include "WinSock.h"
4 s$ l: r$ l( |- q/*#define WM_SOCKET WM_USER+1000
0 u3 {! \5 `4 F* U- W$ j#define INITSOCKETSUCCESS 0
# |7 u* c6 \/ x5 i0 N/ w#define INITSOCKETFAILURE 1
- d7 E2 g3 L" V  p6 z& }/ ^: X: ^#define CREATELISTENSOCKETSUCCESS 2
/ S! \" y  L1 O( m; L#define CREATELISTENSOCKETFAILURE 3+ M% f( y8 n$ A0 V
#define SETLISTENSOCKETSUCCESS 43 h6 K, r% J. O) S5 I1 ^
#define SETLISTENSOCKETFAILURE 5$ B" s/ q5 y. l, v; o1 w
#define BINDLISTENSOCKETSUCCESS 6
) t+ ?6 q& x% Q#define BINDLISTENSOCKETFAILURE 7  p2 g/ R' u/ ~
#define LISTENSOCKETSUCCESS 8' [, ]' y3 M9 [' a8 L0 R
#define LISTENSOCKETFAILURE 9
. y! F/ m8 }' {#define ACCEPTSOCKETSUCCESS 10
$ d, o# \7 @+ M8 n9 C#define ACCEPTSOCKETFAILURE 11
8 e$ j$ S/ d8 r& c) N3 i9 F' A% o& y*/
- }' o7 [# L" c6 V$ n" b2 Fclass TPSTNForm : public TForm( {( q% X2 z# [% g$ W9 r  B
{
" V' ^6 p& N, x% ]# i__published: // IDE-managed Components# ?' ]/ `( ?+ V
   TEdit *Port;
$ Q" |$ ], Z8 v/ n8 }, ^   TLabel *Label1;% `4 A3 f7 e: i
   TMemo *Memo1;7 t+ m3 I& Z" z1 f- G
   TButton *Button1;7 F- c2 O0 l0 V: K# D
   TButton *Button2;
2 `6 c6 v0 r0 r) f2 b% ~& F- q   TLabel *Label2;
/ n1 }8 n. Q6 k" ~+ {5 j   TComboBox *Prot;$ g2 J5 U) r6 l/ u5 p
   void __fastcall Button1Click(TObject *Sender);
: d2 F; _4 n/ t1 x8 s5 {   void __fastcall Button2Click(TObject *Sender);7 f1 {8 b, Q" C1 r
   void __fastcall FormCreate(TObject *Sender);/ ]+ i+ ~# ?: r0 l, E
   void __fastcall FormDestroy(TObject *Sender);+ L! n+ g6 D2 g( z: a9 X3 w
private: // User declarations6 s( c8 y# G4 z+ e0 Q- m
public:  // User declarations" D* D- S* v) w) k
   __fastcall TPSTNForm(TComponent* Owner);" h) Q5 B2 z- U) h7 e4 y9 @
};/ g6 k: I% A% l. U4 G
enum PROTO {TCP,UDP};2 ?; b# v# a) c/ A/ R
class TCommunication:public TThread    //Communication Thread
% Z+ V2 p; U" u6 x7 }4 p* k{/ p7 L& ^1 `; [* U2 K
private:
" M7 \) \5 L5 v) A7 \   SOCKET m_AcceptSocket;- I) l  P6 n- [) {% |
   char szTmp[256];//ERROR MESSAGE
) k, W+ W) Z; }  ~0 o( {' C2 Cpublic:
2 h7 ^/ U/ l$ n+ p( B5 \' H+ |   __fastcall TCommunication(SOCKET m_Socket,bool CreateSuspended);
( b8 J: W; E7 [( y" S9 s/ B& l   __fastcall ~TCommunication();- i  ]+ B6 ^' N: Z4 p
protected:
6 L8 e: `8 C4 ^$ Z0 [8 P; u   virtual void __fastcall Execute();3 [2 b1 [. L* T0 a3 ?! U
};
" {  Q& x/ o: V; y- Zclass TListenThread:public TThread //Listen Thread
# S! I, ?& i4 E+ ^+ \; F7 o; f3 P{
* o' P# m+ ]' b! ~6 S* Aprivate:
' N' D5 R. H! B' Z0 L% h5 S# ?   WSAData wsaData;
! N5 p! X8 _; X# m   struct sockaddr_in server;
0 T+ f& e- v6 O, L5 z   fd_set FDS;1 F1 p" \% [0 @( Q* B! Q
   UINT m_Port;' l0 x3 x; U$ J( k' Z0 S; b0 k$ u
   PROTO m_Protocol;
& t- n; o  F* z   char szTmp[256];//Error Message
! d/ `) O; J# ~# A) y# fpublic:
3 D8 |; ]6 z# T! c+ b0 J/ l4 K! y; A1 p   SOCKET m_Socket;
5 X* ^$ F& M: j6 U* {   void __fastcall DoError();& }$ L4 E. p, B7 P/ P, ]1 {- t& a! I
   void __fastcall InitSocket();
, ?' `' n9 t6 T/ f   void __fastcall CreateListenSocket();
9 C/ f2 Y) u% b/ n! L% I0 `7 Q/ e   void __fastcall SetListenSocket();
& t5 z. N3 S  M4 U% N   void __fastcall BindListenSocket();  J; y7 n! k  M5 f9 ?6 M
   void __fastcall ListenSocket();( v3 }; B) O8 S6 t5 K

  M  N4 Y, z( M5 |# x5 Y+ r4 lpublic:& |9 x. x% P4 n$ n" y
   __fastcall TListenThread(PROTO m_ProtocolA,UINT m_PortA,bool CreateSuspended);; \" ^1 K0 f: j! d
   virtual __fastcall ~TListenThread();
3 S; q/ p# p  j' \# Mprotected:
# ~# ^% ^+ Y& B- E( _   virtual void __fastcall Execute();) p, l2 G* t% r: Z; o. Z
};
" }0 k. b! ^4 Bextern PACKAGE TPSTNForm *PSTNForm;3 [1 b) l$ Z; {0 c7 ]
#endif; y" c! m8 S; l1 w) u
.cpp File
  O0 {; ~" x! R#include <vcl.h>3 R+ d5 ~* y" |, ]; _
#pragma hdrstop" s: |3 {% M' V+ z
#include "UDPServer.h"5 ]9 v" X  y& D- B/ L9 e0 E
#pragma package(smart_init)
7 O8 ]# Z: f) `  k8 ]* N#pragma resource "*.dfm"- H/ a, v& ?# r
TPSTNForm *PSTNForm;
( |( x7 \3 z1 M- U$ T  XTListenThread *pThread=0;6 A5 r. S& k/ }
//******************************CLASS TCommunication For TCP****************************************************0 g5 t1 O2 O6 Z: }+ I0 ?- l
__fastcall TCommunication::TCommunication(SOCKET m_Socket,bool CreateSuspended):TThread(FALSE)( V8 k% k# F. |, R) }
{
: Y" W4 I1 Z& W1 l5 s/ t4 e   m_AcceptSocket=m_Socket;
  J- o; A. E' S! T  E7 h; {   szTmp[0]='\0';
3 l! F$ z9 B& |7 J% V* |5 ^3 _: @) c   FreeOnTerminate=true;+ R$ c) `1 Y3 e5 b1 A
}) q+ M) r: ?! e" |
__fastcall TCommunication::~TCommunication()% u% m4 {& y: l
{
% v! y+ p% P* l0 g, I3 L, N# ?9 n8 ]  // closesocket(m_AcceptSocket);
9 I# K! l) `% p. J9 C6 T. X}
2 b# @7 a2 m$ f; @4 Ivoid __fastcall TCommunication::Execute()" v3 f' r: q& W& i) d
{
1 v% ?1 `- @  Z4 w+ A" {. ~  E   char buf[4096];
5 T1 ~! Z5 L# N& E- L9 s7 b   int nSize=0;
0 E. m; G6 W: P3 H. y: H" O   nSize=recv(m_AcceptSocket,(char FAR*)buf,4096,0);7 t* |- s% W; I) |+ Q" A+ V
   if(nSize>0)& l) L2 v# E( G/ C
   {
, i- w, G- q4 A7 _! Y& n  H      buf[nSize]='\0';6 N4 h& u! {  _7 T5 @9 F  R
      //Display& l; r) y) U8 i  m4 Y
      PSTNForm->Memo1->Lines->Add("Received Length:"+String(nSize));
! x1 c& N) D) M: {% z+ z      PSTNForm->Memo1->Lines->Add("Received:"+StrPas(buf));
2 s; s- ~' D2 L2 ^. o9 c* S      //Deliver
  x' Q! E% I* f- P/ l      ::Sleep(100);
6 U' I8 P1 o5 r0 Z! g      send(m_AcceptSocket,buf,nSize,0);
. K* O' [7 l+ e0 k5 K   }
9 q3 x, o/ p# _2 t3 y: D- C
- @! K, ?! J& Y) b0 n; h, D* W}
+ a. w* x# }! q//******************************CLASS TListenThread*****************************************************8 P* ~2 e% b  G( ]- l, Z
__fastcall TListenThread::TListenThread(PROTO m_ProtocolA,UINT m_PortA,bool CreateSuspended):TThread(FALSE)
3 g. p, A5 n: L' F4 g% w{7 m! m/ J  y/ H; `  \0 p
   m_Socket=INVALID_SOCKET;) N! o+ ]) T/ ^. f3 a$ y" A
   m_Port=m_PortA;' u7 b, U! R# }. v
   m_Protocol=m_ProtocolA;5 d* L; C) Q) y
   szTmp[0]='\0';
: r7 D' b% _! A7 j   ::ZeroMemory(&wsaData,sizeof(WSAData));
+ Y' ?- e/ }/ N; u( |   ::ZeroMemory(&server,sizeof(struct sockaddr_in));# w; y. F; L: [* h) i. ]: A$ f
   FreeOnTerminate=TRUE;//Automatically delete while terminating.
' [/ S0 N2 k: g- I}
% Y2 {" ]. y. t8 N2 N__fastcall TListenThread::~TListenThread()
* v9 E, @2 j/ ?: U/ O" k{
, Q! v- M) s9 [+ f9 u. `' I   closesocket(m_Socket);; Q3 W3 `' n0 H5 N' l) R3 f6 E
   ::WSACleanup();
! p! D+ H, b3 [3 I. M7 r+ \   m_Socket=INVALID_SOCKET;  r' a' ], o& n* b3 ?+ s7 n3 Z) \: ^
   m_Port=0;
( H. w6 {+ h7 @, G( z   m_Protocol=TCP;# D. s. `! w1 s  X3 z7 f' s2 `
   szTmp[0]='\0';
4 H& z; o5 x- y5 h" @   ::ZeroMemory(&wsaData,sizeof(WSAData));% ?5 f" r% j3 v0 r9 D% u
   ::ZeroMemory(&server,sizeof(struct sockaddr_in));) ~5 p5 J6 \! j+ {0 ], |
}# _3 Z! B. d3 Z/ |
void __fastcall TListenThread:oError()
6 g- n) b% b3 p6 m( ?7 P) r! j7 @{$ p7 {4 K5 b7 U, C
   if(m_Socket!=INVALID_SOCKET) closesocket(m_Socket);+ |9 o! [3 a( J9 W
   WSACleanup();% f. y  T, \2 R7 c$ u" w
   return;) ?7 b5 h) d, C4 R$ L& x0 t
}
7 Y! t1 P( a1 ]3 Cvoid __fastcall TListenThread::InitSocket()) w3 m" D8 z. J9 C9 y
{
8 V$ B! F5 @$ q& p: d9 I. H- U   WORD version=MAKEWORD(2,0);
* k; r6 d+ J& N! t# d( V  t/ M   if(::WSAStartup(version,&wsaData)){1 Y' u/ E# Q" R2 f1 @/ N
      sprintf(szTmp,"Failed to intiailize socket,error no:%d",::WSAGetLastError());
+ R, j9 g$ q1 r7 A) C/ \      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);! L# r2 y1 |( o0 k8 F" {  u4 T6 R& ]
      DoError();
: p7 @0 A9 V. B( g5 e6 A$ l      return;% y; o! u. E* k6 m! `
   }
$ w$ A- K3 \1 b}# ^" ?3 H( `0 j* M' e
void __fastcall TListenThread::CreateListenSocket()0 C4 d7 g1 Z! s7 ~7 @' z$ S
{- U4 @2 z+ @, f6 p+ |# g7 }' n% c
   switch(m_Protocol)2 c1 _% c; O# s( l3 i
   {
3 T9 q$ ]+ c4 C* A3 a, ?3 U) L      case UDP:* K3 W9 u$ _/ d( r5 w" @" Q* |
         m_Socket=socket(AF_INET,SOCK_DGRAM,0);
; ?5 }) g. g/ `2 [- H. U( \         break;2 j2 y) s2 a% a. Z
      case TCP:/ V5 f& F3 f& A7 |- F
         m_Socket=socket(AF_INET,SOCK_STREAM,0);
/ i* |2 _6 V: d$ `  ~         break;
* `/ g3 O1 H: O7 }* Y      default:
1 A  l7 n; X1 C# h; U" V  j. n0 ]         sprintf(szTmp,"Error protocol!");" ]* }' Z; l5 z. X6 G$ ?
         ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);
' D. Y0 l+ z! |# N         DoError();
' ]3 p- n7 k, }. i         break;: O( n9 y& d0 \
   }& F& w8 a$ Z+ r! h& A
   if(m_Socket==INVALID_SOCKET){7 S  m% \& a* L) B) _
      sprintf(szTmp,"Failed to create socket!");4 Z! Q, Z/ M9 J( Z1 l
      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);' J% E" |  G" ]5 B+ X2 _2 t
      DoError();9 ?8 Q# ^, i* d" P6 b0 r% v
      return;0 R, l/ M# `) n
   }' b6 P  P* s5 n7 V
}
# j/ x3 L; j! s3 ~% mvoid __fastcall TListenThread::SetListenSocket()
$ X+ C& q& _2 P0 B{
8 t  s. p: V7 ]5 @3 D9 K& R   server.sin_family=AF_INET;) q# P4 n7 C0 q. Q- q: z) D# F9 p
   server.sin_port=htons(m_Port);
3 y5 u* a- x7 m& c   server.sin_addr.S_un.S_addr=INADDR_ANY;8 E( @' z" z# i
   int NewOpenType=SO_SYNCHRONOUS_NONALERT;
0 Z4 }. K- v5 w9 _8 A5 }$ L   if(setsockopt(INVALID_SOCKET,SOL_SOCKET,SO_OPENTYPE,(char*)&NewOpenType,4)){
- O- ~7 ~8 m, V: U( S      sprintf(szTmp,"Set socket option error,error no:%d",::WSAGetLastError());& H2 q0 m4 {. o3 V! T
      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);
, k( Q; j. r9 X      DoError();
& M- `3 |: |9 Y; X0 M      return;; {: q  b+ ^' d: {4 E5 X/ @
   }% F) o" V$ s2 T) ^
}
+ }9 r1 q4 D3 F% O2 E$ \void __fastcall TListenThread::BindListenSocket()
9 u' F; L) a* T4 b+ _{
0 b) \0 c# G+ v7 [, J2 A    if(bind(m_Socket,(sockaddr*)&server,sizeof(struct sockaddr_in))){9 k: H# |' X, }" R# P0 p- b$ c
      sprintf(szTmp,"Failed to bind socket,error no:%d",::WSAGetLastError());
. {6 M  j: H+ K4 v0 Q3 W3 I# K      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);) W2 ?! R- i- ]. w
      DoError();
% `1 q7 a- O2 _5 r. r5 A7 Q' l, D      return;3 s$ K2 R! V3 k! Z. ?7 C) W! L: x
   }
' e& c5 X( d5 P' N
5 M. R. ~% |' t, W9 K% j}. @2 b6 z( A! w* Y% i& v8 z, s2 w
void __fastcall TListenThread:istenSocket()
) ^  @6 G5 u3 u1 f+ K$ I{
  w% r. j0 o: i$ l: \$ l3 D  if(listen(m_Socket,SOMAXCONN)){
" r- t+ R* A7 p' E, ~- v0 y% r) n     sprintf(szTmp,"listen error,error no:%d",::WSAGetLastError());7 ]8 ?3 m2 B& h9 u( w
     ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);* S  ]! Z3 e3 H: _/ C+ s
     DoError();. p7 P$ a0 C" g7 H0 K# j3 r, E
     return;
; x4 W' S3 a8 ?  }
1 f0 U( I5 b! E5 b  [  //Determine whether there is any connection, t) {) p/ ~& z3 B8 O
  FD_ZERO(&FDS);3 F* J+ e4 Y/ u" m
  FD_SET(m_Socket,&FDS);
4 y1 z6 G; B' O; P}* N- ?% T* I1 B( {* S
void __fastcall TListenThread::Execute()
8 Y" N8 H+ \5 G% ^: `8 i- h0 ]{8 h: d0 _7 C, f9 E
   char buf[4096];5 K( b9 w) V# l3 t1 E0 u1 E8 K
   struct sockaddr_in from; //for UDP
* u- z, K) i: O. U; G9 O; b   int nLen=sizeof(from),nSize=0;  //for UDP+ ]( ]% \' s2 z- q5 y; Q
   InitSocket();5 j/ i$ K8 ]1 R* R# r
   CreateListenSocket();
/ o2 t$ a) D, `   SetListenSocket();. L1 \1 k9 u+ z2 s+ F: i
   BindListenSocket();$ Z# L$ I3 R5 u0 U
   if(m_Protocol==UDP){7 T) c3 s( r! s: N4 G8 c$ v
      while(!Terminated){
; S7 a* j. a' Q6 c7 P, Q% I         int nSize=recvfrom(m_Socket,buf,4096,0,(struct sockaddr*)&from,&nLen);' `9 r0 K' q& v# o+ T% B
         if(nSize>0){
( q, C0 K) p: i# J, J            buf[nSize]='\0';# T" t) t: g  F  M. M) p" `
            PSTNForm->Memo1->Lines->Add("Received Length:"+String(nSize));8 n* E# C% W2 R9 G6 s1 i: I0 L; o
            PSTNForm->Memo1->Lines->Add("Received:"+StrPas(buf));6 e  W- U0 z: T  J& {) c9 }
            ::Sleep(100);
5 w0 {7 ^$ h$ @" S  @4 T6 a            sendto(m_Socket,buf,nSize,0,(struct sockaddr*)&from,sizeof(struct sockaddr_in));. `" ^) Z% G7 R+ A1 h/ P% @& @* |
         }
0 z: a' }& g; P/ s6 z: L7 n         else return;6 n5 i$ a# s) H$ N: A2 Z9 z
3 X: \1 z3 b& `
      }
& Q1 r* t7 ]- f) ^   }
. n7 R6 t$ e* ?5 P+ {5 K# X   ListenSocket();
, t0 Z  _  n4 `# c8 \7 _   struct sockaddr_in client;
2 V9 e" N# \- R- r2 O8 `   int nLength=sizeof(struct sockaddr_in);1 R5 K8 A6 i9 h, K
   while(!Terminated){
0 Z1 @8 m2 f. Z" X0 D9 C; F3 r      int nError=select(1,&FDS,0,0,0);( Z9 ~5 z! j2 `4 p! O  Y
      if(nError<=0) Terminate();
- N" \5 b7 M2 \! G: V' x' X4 M      SOCKET m_AcceptSocket=accept(m_Socket,(struct sockaddr*)&client,&nLength);! N. U! T- y1 a
      if(m_AcceptSocket==INVALID_SOCKET){4 q% k$ @& N1 n! w5 k8 q, R4 y% ~
         sprintf(szTmp,"Failed to execute accept,error no:%d",::WSAGetLastError());
2 h2 u8 w# t4 Y% u4 J         ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);# G2 D/ d8 K7 j
         DoError();4 p( _: w2 \! H" }" i; e
         Terminate();: D3 v+ X4 t  T# B5 j  A1 c
         return;
0 C* C; E, X  k8 }+ H3 n2 E      }1 x/ Q) ]/ `. G7 q
      TCommunication *pCThread=new TCommunication(m_AcceptSocket,FALSE);( y% T' m9 g2 j$ b0 K: k) R
      pCThread->Terminate();  I/ q  B# w8 C9 O! |/ P
      pCThread->WaitFor();/ Y: L/ I" X& h0 g1 C3 k0 t' d
   }: D5 z& E3 u% d! I. u2 X
}
* k0 F% j0 G* j0 V- p//************************PSTNForm*********************************************//
" G# e) u4 V& U$ h__fastcall TPSTNForm::TPSTNForm(TComponent* Owner)
2 K! y, G9 o3 H- o3 {   : TForm(Owner)
2 e6 [2 g& [& }4 D3 M! G5 V{
9 j% u  X# Z% [}
# \3 a3 l4 s# K5 s9 t; S2 gvoid __fastcall TPSTNForm::Button1Click(TObject *Sender)
, V& K& \: H9 K, n" r' q8 C" A/ Z{
8 S0 ~1 y8 U7 _( }; D& t7 h1 ?) v   Close();
( H2 `2 q# [$ g  U, a+ v}& Y) y) m: c4 y6 S( g6 Z0 {
void __fastcall TPSTNForm::Button2Click(TObject *Sender)7 [% K) ^% A0 Z- Q0 {
{
6 A4 j( ]- r7 k% F; E  x   if(pThread){6 E* Z1 Z3 M# t4 X3 Z/ g; h
      pThread->Suspend();
  E" [. t3 E4 j      pThread->Terminate();
, F$ |# o" |, E8 d* D% J      delete pThread;; v; `% z$ z+ Z. q1 a" d
      pThread=0;
7 g( j. [- D; ]: n, H. N   }$ x$ ?$ z6 O& }( w1 o' U
   UINT m_Port;
% z" t3 u- ?1 Q" z" C8 a# U   try
' a! J( i; K' _) I   {, [' }/ v5 H; l2 {# X- M
      m_Port=Port->Text.ToInt();
% X7 i4 V/ q. j& H( W# @   }7 o7 T# \4 Z& l
   catch(Exception &e)( r; Q% t" V( c0 S/ G
   {
% L( l7 X- u; F: Z/ G$ V3 L, W  |      ::MessageBox(0,e.Message.c_str(),"Error",MB_OK+MB_ICONERROR);+ H7 p5 c6 b& ~8 v! N# S/ p% a
      return;
9 b; k- k$ t/ q5 |* y! d   }
+ I& T7 H2 z  [0 H   PROTO m_Protocol;
- k* V/ a' ]1 U3 Q' L   switch(Prot->ItemIndex)* u( Y- X8 R% d$ u3 Y6 S. a+ ~
   {2 f8 |/ k2 I  W+ Y2 q
      case 0:0 ~7 q5 I' p$ B3 B  h7 P. c
         m_Protocol=TCP;
1 c: u9 y9 \7 M2 p3 f/ Q" ~# ^7 {         break;
) M* |* q1 S+ ?0 x- T/ G) `      case 1:
8 p9 }: l( W. X# z         m_Protocol=UDP;
( L: L) g4 ~8 E; o         break;
5 o8 s- [+ V/ F      default:  B' R/ ]8 p, [6 P9 W# C, r1 M) K
         break;
  A# N3 ~( s: ]" [! p   }
4 v4 A' _+ h! b! ?   pThread=new TListenThread(m_Protocol,m_Port,FALSE);
$ Q# {9 Q; Y, o7 g/ J   //pThread->Terminate();
* f: a4 Z2 P! L: \}0 b" R# k; S7 v- u- V0 ~5 ~* M9 @
void __fastcall TPSTNForm::FormCreate(TObject *Sender)( W' b/ @  w. D9 E. X$ i0 Q6 r
{* i; x) ?- K1 q$ n
   ::SendMessage(Prot->Handle,CB_SETCURSEL,0,1);
' V" Q8 I$ v7 h8 g& {; {, z0 t}3 t# n$ m8 r( r  F6 {

* }0 f/ H1 B3 M1 [void __fastcall TPSTNForm::FormDestroy(TObject *Sender)
# ]9 z/ j: @1 d  i{1 N0 \0 x; H2 ^+ t. ?* O
   if(pThread){! G/ w0 v& g" C4 E4 D
      pThread->Suspend();3 A1 p  M# q: z! }# g# d8 V6 Q+ i
      pThread->Terminate();}
" n. C, S" }+ y}
/ n# O9 F! x# s0 r4 C上面的代码,各位可根据自已的需要和针对自已的应用,在数据处理方面加以改进就可以了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-5-2 10:34 , Processed in 0.022254 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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