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

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

[复制链接]
发表于 2004-2-15 14:01:13 | 显示全部楼层 |阅读模式
在CB中用socket api来写网络通讯程序
& V9 r, L: Q) v+ M% W( l4 j# a作者: kingcaiyao ,如转载请保证本文档的完整性,并注明出处。" k' W# n0 F  U. X& Y" O3 X' M
欢迎光临 C++ Builder 研究,http://www.ccrun.com/doc/go.asp?id=569# C5 v6 I$ i# c8 S
本文转自csdn,作者:kingcaiyao9 R; {4 B. a, @% ]8 P9 L: H8 _/ k
原标题:在C++ Builder中用socket api来写网络通讯程序(同时支持TCP和UDP协议)
/ m6 P$ Z) X& w3 w9 _) D原文:  http://www.csdn.net/develop/read_article.asp?id=198839 {# {5 g  U/ k/ V8 e5 k

0 h8 K* ]6 m2 ]  T5 t
/ ^% Q, `2 W, c2 \# R8 o在7月4日看完sockcomp.pas后,我决定用socket api来写一个客户端和服务器并且同时支持TCP,UDP协议,于是我就去做,现将代码贴出来(已调试通过)4 V: |5 E3 V& f2 |: F( U0 }& g
Socket api Client:
- ?5 y) r: f  ~$ I  U$ o# T3 L  H0 G/ ]7 E" N* P6 u) l
#ifndef UDPClientH
, h5 ~/ u+ `: A+ u#define UDPClientH
( ~- D" A. X& I6 r0 X#include <Classes.hpp>
5 k' k( V1 E1 N/ H! H( v#include <Controls.hpp>! f, t( x) t3 U' N+ [
#include <StdCtrls.hpp>
* \& M) x/ @+ x#include <Forms.hpp>. S" Y2 m5 f, y% D& M  s' B# K0 O
#include <stdio.h>
9 A% z7 Q  i& S) A#include "CCEdit.h"  v$ n+ {: G% [
#define WM_SOCK WM_USER+1000 H0 Q: ^6 `2 v8 C0 X$ N
class TLANForm : public TForm
( d5 Z* ]  m* T7 c/ k{" ~) ~1 r4 |- M7 ~2 N( M& G' O  U5 L
__published: // IDE-managed Components
: H& Y6 u1 F7 g. L/ G7 H, d& q   TEdit *Port;+ |4 y0 K( A, N) y3 Z
   TLabel *Label1;
  _$ m( ]: H! ^7 y, X   TLabel *Label2;
! _4 ?- l4 d9 V6 q   TComboBox *Prot;/ ^) g, V0 ^  P
   TButton *Button1;$ R# h7 a' g3 _6 [% @) x
   TLabel *Label3;8 U: T& o+ S- l* h1 T
   TEdit *Addr;
6 e7 J8 V# r7 [2 d   TCCEdit *TxtEdit;
9 p& {% p3 n( x1 g9 R   void __fastcall FormCreate(TObject *Sender);) {% g* F/ \$ U7 q
   void __fastcall Button1Click(TObject *Sender);; u6 l3 G- z; V3 u$ N7 Y
   void __fastcall FormDestroy(TObject *Sender);
0 l$ A( d/ }, l" ?0 b; pprivate: // User declarations
$ {: C8 j7 w7 O( C2 R   void __fastcall OnRecv(TMessage &Message);
9 {3 `* [' r$ [7 E/ L' [, Tpublic:  // User declarations% U; T! T5 C$ c0 O2 D0 X
   __fastcall TLANForm(TComponent* Owner);7 v  F: l2 K+ c
   BEGIN_MESSAGE_MAP
+ D" G: d# Z. I      VCL_MESSAGE_HANDLER(WM_SOCK,TMessage,OnRecv);0 G* @9 d- W1 F0 ?# [0 v+ ]8 ~
   END_MESSAGE_MAP(TForm);, n* k( g. B9 }/ s
};
. V+ p. Q0 O3 H" Y) T- dextern PACKAGE TLANForm *LANForm;
- L6 X/ t& J5 D* E$ g, c% ]#endif. _; Z2 ~0 u: p! h
3 d) b3 X* j, d3 H5 l3 l
5 A* B' p5 J' {- @. a% }
.cpp File
1 m2 y/ D* U9 [: D# Z, v6 d1 q2 l9 E$ Y6 S
#include <vcl.h>/ l! Z! i1 m5 _/ G$ h
#pragma hdrstop  y0 z  r3 Z) w; i2 P
#include "UDPClient.h"
' x6 [4 d4 ~3 e( g#include "WinSock.h"1 E- \3 B0 e0 i
#pragma package(smart_init)5 x  ~! H! K" R5 T
#pragma link "CCEdit"
: Q5 A2 z* H4 b. Y' O/ o/ y#pragma resource "*.dfm"
( w1 d; _: B0 e4 i! ATLANForm *LANForm;5 f, R* _, H4 C% R* O# N  b4 K
enum PROTO {TCP=0,UDP=1};! \; a+ I& j1 D6 s; _4 Q7 s
SOCKET m_Socket=INVALID_SOCKET;
. L5 \5 |0 y( n! |. CPROTO m_Protocol=TCP;7 Q' y) p/ t0 S* u0 U, _
__fastcall TLANForm::TLANForm(TComponent* Owner)0 J0 Z; u( b' t; B1 h
   : TForm(Owner)  L' I' l6 z! V8 ?6 D: N
{
- O" N' D8 r# ~( h
; J" A2 n2 N2 l}
: W: g; a! h. u( U( f0 rvoid __fastcall TLANForm::FormCreate(TObject *Sender)
4 s2 f' ?  n1 y% d! m" e# I$ G  r. [" r{$ n& w$ f- ]: G1 l9 W) Z8 x
   ::SendMessage(Prot->Handle,CB_SETCURSEL,0,0);
. b( h2 T5 k( n# ?$ I4 Z1 f}
9 @. J3 c) H) g9 d# f, K3 e" M1 C! bvoid __fastcall TLANForm::OnRecv(TMessage &Message)
/ C1 B) x, D6 f) r9 ?9 `% n{$ U- E/ m$ q5 g. T6 {% c, X! v
   char buf[4096];5 x. ]/ z9 u$ `, z
   int nLen;
8 J7 K. s& L" K8 S& X; R   struct sockaddr_in from;
/ ]0 [; T' [# [9 N+ d0 e   int nLength=sizeof(struct sockaddr_in);
" P- F3 i/ e4 q& Y3 p8 r* X   switch(WSAGETSELECTEVENT(Message.LParam))# {7 L( W# Z, I/ @- n1 o
   {
& N" ?2 a8 P' a0 ^9 \      case FD_READ:
9 Y+ L4 z- t7 E+ q3 c8 B         switch(m_Protocol)
/ `0 @( w/ O. Z. x! n; z% F         {
* n* ~4 ^% S0 Q$ D0 @) E* |            case TCP:& h$ m. a" O2 i6 {2 x" _
               nLen=recv(m_Socket,buf,4096,0);
: {* C# {3 d$ g9 G+ N/ ^% {7 J               if(nLen>0){
+ I0 {( x( Q1 A4 x6 j1 @+ P                  buf[nLen]='\0';
% s: D8 I6 E- W8 k$ z1 C* h                  TxtEdit->Text="Received Length:"+String(nLen)+"\r\n"+StrPas(buf);0 G( f& H1 c: w0 s( L7 F7 E1 `
               }
' K' G0 L7 c6 q4 M. X8 R6 Z               break;
' K1 ~) m) M9 d9 A' o( @0 s            case UDP:; z3 g  d/ Z4 e; C/ q* H
               nLen=recvfrom(m_Socket,buf,4096,0,(struct sockaddr*)&from,&nLength);
8 f- ~6 ^* O5 P               if(nLen>0){: d0 g0 e% A$ v
                  buf[nLen]='\0';3 @' g, v; G* e5 s, _' n
                  TxtEdit->Text="Received Length:"+String(nLen)+"\r\n"+StrPas(buf);. T2 S: b# i- j$ j1 b, t
               }/ l7 ?! b5 m) F8 m; B5 t
               break;
+ ]8 w( C7 r; b, j         }
8 Y0 b, L. @) i8 d) l) C# L         break;- K8 J+ L' m6 N8 q7 V: _$ D
      case FD_CLOSE:, |4 b' F+ W9 X' V3 ?
         closesocket(m_Socket);7 K8 l5 u: Z9 K
         break;+ V" q! J3 F+ k6 y- x. L. ~
   }
* s5 G0 [: ^* i* p( u}
% i2 q% w. c( y$ v* }. B9 G. P; n0 h  s1 |2 c3 ~- L, [, X
void __fastcall TLANForm::Button1Click(TObject *Sender)
. N2 k# Q2 W) s/ c{
1 K* x; Q9 r6 u2 A; y   char szTmp[256],buf[4096];& v  \9 u( J' t, I. L
   int nSize=0;( y: E1 [/ n1 |
   UINT m_Port;6 v. Q+ }0 q8 x: d+ J, }$ `3 d; b9 w
   AnsiString addr;
7 e# h7 z! l% G0 h; v1 `1 P$ f   addr=Addr->Text.Trim();/ k: ]5 a8 Z1 R4 F' ^3 O9 f6 p
   if(addr.IsEmpty()){1 T8 d6 Z1 V, b) s* q6 {' ]" g
      ::MessageBox(0,"lease enter the server IP!","Error",MB_OK+MB_ICONERROR);
- ^0 V3 \/ j6 m  y' h9 e      return;# X& S8 d  f8 q4 |: w- [0 P3 \/ X
   }
5 b! T- \$ C9 r* _1 p6 c$ Q' k   unsigned long nAddr=inet_addr(addr.c_str());0 W- w' o+ Z6 G3 c7 }6 l0 ?
   if(nAddr==INADDR_NONE){: V% R/ U, W! n/ D% q+ }+ Q
      ::MessageBox(0,"Bad Internet IP!","Error",MB_OK+MB_ICONERROR);/ F( M, I6 [; b6 ?& A
      return;}1 N! H; A1 F# R0 b6 V

" H/ P/ b$ g3 F2 P   try
8 S% ~; a& X, ^$ S   {- G. a7 Y: a: T9 }
      m_Port=Port->Text.ToInt();6 ]6 X% V# g# q5 l: @8 E0 ]( M
   }! X( {# p8 B! Y) N+ F2 i
   catch(Exception &e)
' W1 R* r4 p% m8 s, G/ Y2 v   {
9 ~0 [3 U7 P4 R      ::MessageBox(0,e.Message.c_str(),"Error",MB_OK+MB_ICONERROR);- m( ]4 r: u: b  t* i
      return;4 p/ @# r9 g) Y. Z
   }6 j/ a; m& ~; H& t
   switch(Prot->ItemIndex)
* h/ i& @1 ]8 Q   {6 t6 H' H$ o4 ~
      case 0:
* E/ G4 [! j$ U- z         m_Protocol=TCP;
8 a2 ~) T! F: r+ h' K+ i         break;
: w: q0 r, @+ _3 d      case 1:
4 C) z) ]* q5 i6 s. b         m_Protocol=UDP;
- p$ _/ K* f) o         break;. ?9 n9 r+ e4 h9 y7 z9 V
   }* q8 m( X: R) E1 y
   if(TxtEdit->Text.IsEmpty()){7 u6 b3 y6 q. o% Q% }6 k3 [
      ::MessageBox(0,"lease enter the text you want to send!","Error",MB_OK+MB_ICONERROR);3 }' z. P) I! I1 R7 n( N; r" e5 b, h
      return;}
" g$ S5 r+ b: t9 V4 i- t$ }
- N/ j  y+ b4 z  l0 `& {% D9 P4 M   //Initialize Winsocket
$ l" |; q, r- N7 }5 z   WSAData wsaData;! B% K3 Z6 [" i; @4 |* y
   ::ZeroMemory(&wsaData,sizeof(WSAData));
: q7 Z8 B5 ^& X" C" j   WORD version=MAKEWORD(2,0);
& Z9 D% `$ _7 d; t3 Q, i/ \   if(::WSAStartup(version,&wsaData)){
* |, ^" e+ g6 F  g0 c- \      sprintf(szTmp,"Failed to initial winsock enviroment!,error no:%d",::WSAGetLastError());
$ j! V  G4 x" t! }; t      return;}
9 `9 w7 t( Z6 d7 z; L
. d+ Y. K- X4 ~3 o" t   //Obtain the active connection
- R+ ?5 ]+ W' a5 u7 t6 e* S   char ComputerName[255];" s- H5 T! R# L/ @( r
   gethostname(ComputerName,255);6 ?  K$ U2 P! T$ |2 t
   struct hostent* he=gethostbyname(ComputerName);
* r$ J) b4 R0 V   if(!he){7 m+ J4 W1 Q% X" g; Z
      sprintf(szTmp,"Failed to get information to host!","Error",MB_OK+MB_ICONERROR);
, x8 A0 V  U9 D4 q      ::WSACleanup();3 k. j: I. }* U9 w1 \  u* }5 \/ `
      return;# C* ^2 A/ X7 K
   }  l+ B1 |! u  z! e' e- x" N; [
   //create new socket
. ]6 L7 S$ e. e   m_Socket=INVALID_SOCKET;6 B6 A4 C, x4 k" B7 d8 h. M
   switch(m_Protocol)
% m. T; W6 U% G   {
$ D7 K- D9 [$ j6 I      case TCP:
+ q& i6 h2 K% }& y         m_Socket=socket(AF_INET,SOCK_STREAM,0);9 @! H6 Z& G/ N% R
         break;3 t9 j5 H/ X- i& e% b# Y
      case UDP:
: u" z2 Z" B- t) ~- L; s& r         m_Socket=socket(AF_INET,SOCK_DGRAM,0);
# ?1 [$ Z& f: r2 Y& l% c; i* H: W& P         break;
( U" Z; x  T! B% b( n   }
; U0 T- w  m1 b  |. c& w/ g) _8 j   if(m_Socket==INVALID_SOCKET){: e, D1 `" h  R9 y6 x
      sprintf(szTmp,"Failed to create a new socket!,error no:%d",::WSAGetLastError());: U7 ~$ c# X5 T4 s& Z+ u
      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);- B/ W7 W2 F/ ~5 S, e
      ::WSACleanup();  j1 |( X7 Z, [% N
      return;' q5 `" g. |' g8 M: Z
   }
: \" F  Z' l3 z. |' R   //bind socket
( u# v' P3 P( y* p4 m" t: Q! T. k   struct sockaddr_in client;3 X1 \0 M6 L6 b! G% [2 D9 V0 S
   unsigned long nClient;
3 E1 p* f% p1 F2 [+ x$ S4 k. G. R' M   memcpy(&nClient,he->h_addr_list[0],sizeof(int));  C7 e9 E+ [# l# Y
   if(nClient==INADDR_NONE){
" d! [( u: s7 N. n2 h( H% o      sprintf(szTmp,"Failed to obtain the local machine's IP!","Error",MB_OK+MB_ICONERROR);
0 m( K# I" V" R; X4 ]      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);9 u& m. k) ~. F: h, m: _
      closesocket(m_Socket);( c2 ^9 A, p4 _" d. _9 E; P
      ::WSACleanup();# \9 l, n* l4 y% G# J; H; I
      return;
( z: i0 f# N- M! {( X# T# t/ t1 s   }
3 i4 F, r# y8 x% I* i/ _- t8 e   client.sin_family=AF_INET;
+ H7 d2 P9 P* z; t3 ]   client.sin_port=0;4 p  v% N5 `3 r$ ]# ]
   client.sin_addr.S_un.S_addr=(int)nClient;2 G) ^$ `. a2 ?
   if(bind(m_Socket,(struct sockaddr*)&client,sizeof(struct sockaddr))){& o* O4 N. x! d. s# O8 I! X% ~$ G
      sprintf(szTmp,"Failed to bind socket!","Error",MB_OK+MB_ICONERROR);
4 a% }4 g5 w$ s1 s      closesocket(m_Socket);& f# g: G: L/ p, e2 b$ }
      ::WSACleanup();
1 l% ~# S" O) F1 o- A+ |      return;}
  f- X6 \2 \5 O- ^+ y& B3 ^0 n* J   //connect socket) N1 }& _( X3 e2 C
   struct sockaddr_in To;
! c1 w. J! k+ f" `8 W0 P8 v  r$ h   To.sin_family=AF_INET;4 r* n" W! o: c$ ~! r
   To.sin_port=htons(m_Port);
. m. ?; G; q( U* J5 x: e   To.sin_addr.S_un.S_addr=(int)nAddr;
# O& u7 }/ }0 B& k  u5 f; e5 o( h   fd_set FDSET;
0 ?" Y. m2 {5 f" H; R& j7 c: p   FD_ZERO(&FDSET);2 \1 c* E7 F7 }0 W9 M) l( j' v7 P5 [
   FD_SET(m_Socket,&FDSET);
$ \0 B# p# K& L( o+ p
9 t" e( V/ n: ?
2 `* d0 T' Q# k+ |   if(m_Protocol==TCP){
& f& g9 m5 |+ U, U( U      if(connect(m_Socket,(struct sockaddr*)&To,sizeof(struct sockaddr))){
2 o7 ]6 k8 x( R6 L. e, P+ r         sprintf(szTmp,"Failed to connect the object!,error no:%d",::WSAGetLastError());. \4 Q& p# e( I7 {- J! p. l* e$ g
         ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);
' x+ R2 ?- f8 n, l9 [& }         closesocket(m_Socket);
& K: O6 w& r% r- G         ::WSACleanup();
- [+ N6 m$ Y! ^2 m( x         return;
) \, s* q% N. ^$ X4 U- f) F; c      }) [- T) N3 q9 C$ v
      int nError=select(1,0,&FDSET,0,0);( R1 D/ ~1 {/ |9 G
      if(nError<=0){
# _3 y+ P% w8 r2 U$ L% \: n      sprintf(szTmp,"Failed to select socket!,error no:%d",::WSAGetLastError());
4 I9 Z$ u+ _2 u0 P1 a/ P      closesocket(m_Socket);
) x! I/ t% Y$ f* _2 m      ::WSACleanup();
& n. x! _* \2 G9 |# H      return;}
! r* c2 X7 b5 b/ Q9 x   }( n0 t9 }' A  q, F1 R2 t0 h
   //Send data
9 d4 N2 B/ v, @8 X3 i! j# L! e- w   int nLen=TxtEdit->Text.Length();, \# N: x; }; w7 ^: n
   if(nLen>4096){
9 R" z( x# ]- j9 ^; Z" t9 ^      sprintf(szTmp,"The buffer is too size to send,it shoud not be more than 4096 bytes!");7 `$ f7 j. T& E4 A
      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);( q  L. i' z' v
      closesocket(m_Socket);+ E7 ]" s6 G6 l  N
      ::WSACleanup();
  w8 T! v* v6 q  @3 h4 L$ e  M( n      return;) R3 P0 w) a) a3 n* r- L5 U" I
   }
; t9 v9 F' D6 [+ v% u  f2 `   strncpy(buf,TxtEdit->Text.c_str(),nLen);
+ F8 j; q* M% n. n$ t0 t0 v- k   switch(m_Protocol)5 G3 j  V+ r, z; Q9 w
   {' h, w) ^, G" e8 R, x" K
      case TCP:) H7 v; P: k0 l- r. E) t
         nSize=send(m_Socket,buf,nLen,0);
; E+ ^1 B( Q. l$ \7 d$ J2 i# n         //ShowMessage(nSize);
% j8 |! Y. m+ w+ Q- x- L         break;
# B; O, V7 g# ]+ z) ~% d      case UDP:/ D8 V8 Y5 F! z7 l" O. F, `0 u3 |; e
         nSize=sendto(m_Socket,buf,nLen,0,(struct sockaddr*)&To,sizeof(struct sockaddr));
& W. |: u+ E. D         //ShowMessage(nSize);, S; [# |# l  P. u$ T/ Q
         break;4 m$ s; o( g) m( Q2 B* ?( M
2 ?- Y3 G* Z3 T  A
   }
1 z7 q( r/ A% f   if(::WSAAsyncSelect(m_Socket,Handle,WM_SOCK,FD_READ|FD_CLOSE)){% M# k3 L5 r( s5 f7 q
      sprintf(szTmp,"Failed to register socket event!,error no:%d",::WSAGetLastError());
! r8 X3 e) p) ?; a5 m( G      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);0 @, H  \! _: v9 p
      closesocket(m_Socket);
7 v  |; e$ h0 v6 h; Z) K      ::WSACleanup();
3 {! D1 G# q1 e4 g4 F& ~9 {      return;}  C. X* ]6 [( h0 r* c3 b+ F& ~% b7 i
}- F7 B5 V/ @- t3 \$ E
void __fastcall TLANForm::FormDestroy(TObject *Sender)
/ g# I* D3 E0 X, h" E! P/ y{
% T; u7 h; V3 ~+ J( P* N   closesocket(m_Socket);
+ w. W' d4 v0 x4 s9 V6 \   ::WSACleanup();9 L5 J- n* q3 M# ^+ _$ ~
}4 L+ o$ M' H, Q/ t

) ^, B) Y+ \6 Q0 \Socket api Server:+ p3 I) f, S: s% T' n5 ~, O
.h File
$ x. T2 U9 k& q- j" b$ `' Z. `( H( e8 Z#ifndef UDPServerH$ P/ T6 }: z; m! M' N) Z, m
#define UDPServerH* \# j3 C8 x! f5 Z1 A) u* v
#include <Classes.hpp>1 n1 v2 m$ g8 o. `7 ^4 q  ]
#include <Controls.hpp>
# R5 h; d0 O6 N) M" b! `  m#include <StdCtrls.hpp>
3 m9 W$ L) i) U2 q- r+ F#include <Forms.hpp>, }+ O+ k; P* }# p2 R, r
#include <stdio.h>
$ j1 k" x$ U9 x#include "WinSock.h": A3 M) j5 ^* `& y6 e0 U
/*#define WM_SOCKET WM_USER+1000
7 R' a" L; A. L. X#define INITSOCKETSUCCESS 0
( R  o5 X$ q% d  U) Q% ^+ I% r#define INITSOCKETFAILURE 1
- |+ ?, w0 n! ?#define CREATELISTENSOCKETSUCCESS 2, h. K6 n2 y0 o) X
#define CREATELISTENSOCKETFAILURE 3" k! q( j7 Q- ?! S
#define SETLISTENSOCKETSUCCESS 4
) p7 C+ s. w  V, a9 Y% r#define SETLISTENSOCKETFAILURE 5
& }% N6 R' m6 H1 ?" H. b1 ~#define BINDLISTENSOCKETSUCCESS 6
$ Q9 N7 s$ p$ I% B: `#define BINDLISTENSOCKETFAILURE 7
5 a) }$ k* I) t+ T2 M" ^! r  J#define LISTENSOCKETSUCCESS 8
: \' S: ^, s3 a4 N1 o#define LISTENSOCKETFAILURE 9
4 S+ H  }' V0 a9 p* e: P#define ACCEPTSOCKETSUCCESS 106 B: o' A- k; i+ R% t1 o- S
#define ACCEPTSOCKETFAILURE 11
* `% @6 G" p1 Z2 m  b*/
* U" K/ Y9 y- p$ P) ~class TPSTNForm : public TForm5 R: W' d$ g! z8 V2 _, h, W
{( t; D! ^9 }  T
__published: // IDE-managed Components
' d5 _5 `9 f. r  P   TEdit *Port;
+ S" E$ B+ r  J+ r  T# x3 o   TLabel *Label1;5 |7 u9 S- S1 Q4 L4 ?0 `
   TMemo *Memo1;
3 v/ V" X! S; z   TButton *Button1;
; o, y- U7 q' _7 y   TButton *Button2;" \3 W( Y3 I+ x4 \+ L
   TLabel *Label2;. m' d) M% }, i1 O
   TComboBox *Prot;* b, T* J1 i+ s7 j  A9 {  r" a
   void __fastcall Button1Click(TObject *Sender);3 O: o. n2 h/ v. g
   void __fastcall Button2Click(TObject *Sender);: `4 a' o; t6 P& d% e& n4 \" A- X
   void __fastcall FormCreate(TObject *Sender);7 d7 ]# r) M" n
   void __fastcall FormDestroy(TObject *Sender);
3 y- O! |& @3 r7 bprivate: // User declarations+ r% W# [% Y$ D1 n
public:  // User declarations
& b) F* f+ p4 P   __fastcall TPSTNForm(TComponent* Owner);
7 F9 M! G( y: h6 q! z};
1 X; H* ~2 ?3 Z# wenum PROTO {TCP,UDP};! B+ ~8 i5 x' M( Z8 J  z
class TCommunication:public TThread    //Communication Thread
5 Q* u: I  A% ~/ \# Z2 m{; ?; P, {6 X, q5 d! t
private:
* `3 f' e- p6 j* g$ N; ^4 B   SOCKET m_AcceptSocket;
4 M* _- Y2 q% e   char szTmp[256];//ERROR MESSAGE
" R3 A  U0 E. q1 H* K# upublic:5 s% `/ k# R! j# }" T  C6 ]
   __fastcall TCommunication(SOCKET m_Socket,bool CreateSuspended);
+ Q# a; d  c& F. K   __fastcall ~TCommunication();
# G9 l, l; p7 P, g( Gprotected:; g9 c( t* c6 e1 Z, G6 L
   virtual void __fastcall Execute();
$ D7 _0 \1 c4 K4 R3 |- P$ p! Q};* p& @; T7 j: }3 i5 l  X3 R! w* `4 p
class TListenThread:public TThread //Listen Thread
; R& M  i9 P7 Q{
( s2 `8 b% |4 ~: j- Xprivate:
! W: l; j5 b5 G, l5 H9 G   WSAData wsaData;( f% W6 k: r/ Q
   struct sockaddr_in server;- E) v6 `5 P4 W
   fd_set FDS;
$ C1 I4 _- ]' r- R- B+ k2 K/ s4 ~( C   UINT m_Port;
8 _' i( L- U# i# x; C0 U4 r   PROTO m_Protocol;$ q2 h. ^8 U& Q0 ~1 @
   char szTmp[256];//Error Message7 s4 K  ~/ y/ V4 ]. E% q
public:
: G. `% j8 S. F2 e) o   SOCKET m_Socket;
( V7 D# t- m1 B2 o   void __fastcall DoError();
0 [9 b( D/ D/ O3 u" R   void __fastcall InitSocket();
* N. K8 F+ D( i$ i" [$ `2 f- l   void __fastcall CreateListenSocket();
2 y) j2 \+ J5 E$ a" T  ^7 Z   void __fastcall SetListenSocket();
( s$ b; W' N; D/ m& O- s1 E; C   void __fastcall BindListenSocket();
+ |/ v9 D, |  p# H9 z* L$ D   void __fastcall ListenSocket();
$ v, g( j. f  x7 f1 w" Y" |
$ |# Y1 b" s8 q+ v  W$ W4 H7 wpublic:
, }7 J. _* r$ \3 Z! N; o1 T3 f: z   __fastcall TListenThread(PROTO m_ProtocolA,UINT m_PortA,bool CreateSuspended);6 t' `$ Z6 M$ o2 q7 ?1 Z
   virtual __fastcall ~TListenThread();8 m/ z# U3 V1 d
protected:
9 \2 |7 R# V1 z) ^5 H: V   virtual void __fastcall Execute();
4 J/ ^" [- V2 g) _; s) X};
+ K" q. s1 l: lextern PACKAGE TPSTNForm *PSTNForm;, x) s5 ~+ S$ {- s! k7 U/ _3 E! s
#endif
+ E* A9 D2 g2 A6 D) w4 t% \.cpp File' v* K: D/ M8 a% X! p) i  u! O- g
#include <vcl.h>. `2 D6 |6 `, y! |: T8 _1 s0 `
#pragma hdrstop
' c: b4 x  T+ n0 }/ o# \! {6 m6 C! L& u0 K#include "UDPServer.h"
  B' `+ r9 l3 q  s# A4 F( Y2 ]#pragma package(smart_init)
- i3 c8 ~% I0 i#pragma resource "*.dfm"1 l4 ^$ E6 f4 a8 F
TPSTNForm *PSTNForm;
' p* t- \+ U1 j0 ~  O) g. o3 STListenThread *pThread=0;0 D5 T0 s; K4 n
//******************************CLASS TCommunication For TCP****************************************************
$ Y( J1 [! b8 X6 m__fastcall TCommunication::TCommunication(SOCKET m_Socket,bool CreateSuspended):TThread(FALSE)% ?% j2 n$ k3 n" |# t, |- k
{- H8 N. P1 X5 G- n9 C
   m_AcceptSocket=m_Socket;
; ~$ j& {0 K5 _1 \+ M+ f   szTmp[0]='\0';
& n- i! l9 q+ q: r+ F3 A, ^. r   FreeOnTerminate=true;/ Q+ o, U: G% y+ M* U# U( h* L1 q
}
, U  p' k) {0 r! C; {3 e__fastcall TCommunication::~TCommunication()
! @) _4 w" K& K; ~3 ~* U% H{
$ v9 p, B( ^8 }1 y1 m  // closesocket(m_AcceptSocket);
1 t+ d/ H5 k! H7 x0 ]8 c}* \) d1 p6 x3 v0 q1 i. L
void __fastcall TCommunication::Execute()$ v5 }) @+ H  `; Z0 F6 j( f9 O
{
$ S. @: K5 i: B5 i  l   char buf[4096];0 g- Y6 Z- x6 X- F* w' x
   int nSize=0;% R2 E+ G! x* f$ t8 ~% e( V
   nSize=recv(m_AcceptSocket,(char FAR*)buf,4096,0);9 y/ C! K- H. h% c& N4 G% `* s
   if(nSize>0)
- G7 N4 O4 \; v$ Q1 M9 w! b   {$ \" r( P! D, L0 F6 R
      buf[nSize]='\0';
8 G$ P6 }2 D/ A3 D      //Display! L2 Z8 b  [! Y; I3 }8 i! G
      PSTNForm->Memo1->Lines->Add("Received Length:"+String(nSize));
7 Z9 m' T# }( x" \      PSTNForm->Memo1->Lines->Add("Received:"+StrPas(buf));
. R* r8 c! t8 E      //Deliver4 q! K3 f+ m/ ?, h
      ::Sleep(100);
% A" t2 H& J5 f      send(m_AcceptSocket,buf,nSize,0);" e: ~* }1 z" o  a
   }
/ ]! _! _: ?4 R3 t* u" i! g! B
3 z( A1 S* s% i% P: \+ o}
- h2 q# d- u/ X; j/ M7 x) l% s: e2 d//******************************CLASS TListenThread*****************************************************
$ b# l+ P% i9 E! Z3 C7 k__fastcall TListenThread::TListenThread(PROTO m_ProtocolA,UINT m_PortA,bool CreateSuspended):TThread(FALSE)' M% k4 M+ }, B; U
{% l6 G5 L1 e7 O! q: U) [+ C5 [( Z
   m_Socket=INVALID_SOCKET;
% k/ r  A2 u/ ]) c  c, h  Y   m_Port=m_PortA;
$ j- w* b' s3 s! ?! g: ], N   m_Protocol=m_ProtocolA;& h; L9 U# _1 a% g5 V0 q
   szTmp[0]='\0';- a) n& H+ z3 C  X; G2 k
   ::ZeroMemory(&wsaData,sizeof(WSAData));2 u$ |& ^" }5 ?3 K, a8 i
   ::ZeroMemory(&server,sizeof(struct sockaddr_in));7 M; a5 K& U. K7 l  W7 s
   FreeOnTerminate=TRUE;//Automatically delete while terminating.* g3 w8 d) \5 M, k( G6 G8 J" P
}  p5 d- i! l8 z1 {6 F! b
__fastcall TListenThread::~TListenThread()) U! E$ Y# _- ]: ^2 q4 t" u% h( R
{
/ U' n7 T* W2 C2 O   closesocket(m_Socket);
5 [2 s9 v5 W. h; r) s+ n0 x6 n' w   ::WSACleanup();
' d) z7 s" b8 l   m_Socket=INVALID_SOCKET;) |* d& D7 A& S4 u' h' s
   m_Port=0;
: j9 ]7 o. z* n% |   m_Protocol=TCP;
7 c0 C6 @$ {7 o5 i' E/ n) [, r) X   szTmp[0]='\0';( q4 G. n0 s# _. Y
   ::ZeroMemory(&wsaData,sizeof(WSAData));9 ]* N, S8 N# N; @
   ::ZeroMemory(&server,sizeof(struct sockaddr_in));
' |! r9 Z1 g+ @% Y}
0 v* E: }: I6 Nvoid __fastcall TListenThread:oError()
% a1 G% ^: C% y6 c( o; Q3 o{1 H  l5 x* b: z8 c) b$ E
   if(m_Socket!=INVALID_SOCKET) closesocket(m_Socket);
$ m( v8 t/ O' `1 ]0 w   WSACleanup();
" g+ A4 |: ]; [+ C) S0 o   return;5 C* A4 e$ Z- Q4 J9 x( B# I% i
}7 l: p8 E3 b# p3 m" a
void __fastcall TListenThread::InitSocket()
3 V+ Z! U, j& X0 {6 R$ k{) \' `: l# V: x0 K
   WORD version=MAKEWORD(2,0);  F& o$ N  t* ^
   if(::WSAStartup(version,&wsaData)){
( t) D2 V0 ]9 C( k  N' U- o. l      sprintf(szTmp,"Failed to intiailize socket,error no:%d",::WSAGetLastError());3 b& o* D' w6 V6 n
      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);
; W5 E: b# B. C$ \      DoError();
' W; o; p$ z# Q  t+ E      return;  v$ z1 D+ H6 F
   }# a1 C( Y7 `7 `3 c3 U( H
}9 A" m. r! Q; [
void __fastcall TListenThread::CreateListenSocket()# @& T2 a4 v! ^- S& u: U
{
% o2 g( P+ I0 z5 E   switch(m_Protocol)7 o% g+ B/ a" c" P$ ~3 ]; h: T! O0 ^: m
   {9 M' a1 y: ]" J2 d( K* |5 {9 d! P
      case UDP:9 n# F. l* ?3 M
         m_Socket=socket(AF_INET,SOCK_DGRAM,0);
  y" g9 y" `( p4 m         break;
. w: {/ J4 n% U$ e+ X6 {0 Z      case TCP:
/ c+ B6 ~: n$ `# _9 Z         m_Socket=socket(AF_INET,SOCK_STREAM,0);5 V$ q: A8 P& R  M( X
         break;
( y% H3 _5 m/ G* Z$ m      default:; X# f6 Q) R# q) P& W8 w9 \. h
         sprintf(szTmp,"Error protocol!");
9 t7 X% G( w& g$ O         ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);) G" A9 Y5 I; {9 e5 a. b( t
         DoError();8 x* q% M, W& ~' y' D
         break;( x! f6 E5 r3 L" a' o: E7 ]; j
   }
9 J+ v& j' e; D/ J   if(m_Socket==INVALID_SOCKET){, L% [# ^- V& @* u% u! Y+ P# C
      sprintf(szTmp,"Failed to create socket!");' `5 ^9 c9 N& b) u+ `2 i
      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);' Y( P( S% a7 M3 E& u7 \
      DoError();, e9 ]' |, G/ w" g* U2 b
      return;) l) Q9 ]  ^+ K
   }: {8 h3 e) M$ G: S" R
}) W; ], y- z. J; I) o
void __fastcall TListenThread::SetListenSocket()
  ^- Q0 f1 O; h{
6 V5 k# c- l; Y   server.sin_family=AF_INET;
5 _& @' X3 n( G! x  Q5 I* H   server.sin_port=htons(m_Port);
* {9 Q$ _) ^% y# Q   server.sin_addr.S_un.S_addr=INADDR_ANY;7 m7 Z1 H- o( e
   int NewOpenType=SO_SYNCHRONOUS_NONALERT;- `; n# m# o/ ~; V# q# _4 K
   if(setsockopt(INVALID_SOCKET,SOL_SOCKET,SO_OPENTYPE,(char*)&NewOpenType,4)){
6 e0 w$ j$ A1 e4 C; s      sprintf(szTmp,"Set socket option error,error no:%d",::WSAGetLastError());
; |& j, c4 F# y      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);! C* j0 f# B3 ~3 [/ _& d+ u
      DoError();/ m0 l8 \+ b! ~7 r# U
      return;
. V) n3 R9 g) Y: r# r& a4 \$ o   }
! o5 [2 S, V% |7 Q, S6 y}6 \- a' U+ L+ I% F: D
void __fastcall TListenThread::BindListenSocket(), L& Q8 \7 i; o
{
# ~) v6 S" ^+ k& D    if(bind(m_Socket,(sockaddr*)&server,sizeof(struct sockaddr_in))){
/ H' e, U4 v4 \& t( n' i      sprintf(szTmp,"Failed to bind socket,error no:%d",::WSAGetLastError());5 R" O, ]3 s- |6 e; a
      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);
1 P5 a/ f5 f& `8 w5 Z! k      DoError();2 v6 F2 T. ?- V- n9 b1 n4 ]
      return;, q$ T) Y3 E7 D  _2 d% s
   }! L- `, L7 `. T# k9 }& E' R
9 _+ U( U! l  L3 M9 B: x
}
* W8 d8 R+ U% T9 bvoid __fastcall TListenThread:istenSocket()/ ~) p9 W* D9 h
{+ }, X& q; F% l+ u
  if(listen(m_Socket,SOMAXCONN)){
; S8 \8 C+ w2 d6 l6 v' @2 G+ A     sprintf(szTmp,"listen error,error no:%d",::WSAGetLastError());2 W/ y. {4 e7 z7 W/ e: F
     ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);/ _$ Y" H9 d, \7 O! ]( z# n
     DoError();
  ?2 i0 L3 c0 W- f     return;) J' U+ s" c3 p( n
  }( T, S" _* H* t' c' c0 l: N6 [5 S! R
  //Determine whether there is any connection; N. F* ]0 H7 I* a9 G
  FD_ZERO(&FDS);# z$ j$ `! i2 e' ]. h
  FD_SET(m_Socket,&FDS);
+ `6 W/ {, }& `" r}
5 X( O! F. ^& _" Ovoid __fastcall TListenThread::Execute()
: B, D+ F, x8 B# x8 k3 T. x+ i{0 v" s) a* M3 e5 R; ^% n$ a
   char buf[4096];1 @% q3 ]6 w2 E: T1 n
   struct sockaddr_in from; //for UDP# r% t, N! I7 {- E, Q1 E* R
   int nLen=sizeof(from),nSize=0;  //for UDP' [. K8 U" D& k
   InitSocket();5 y* B$ f  r0 ^: W/ p4 _  p: M7 k8 R
   CreateListenSocket();+ c( ~( q# {6 U
   SetListenSocket();( H9 t" |. t' _- s
   BindListenSocket();% F* z7 L+ L& t, u% m. O( @  y4 M
   if(m_Protocol==UDP){
1 }: Y+ o; ~9 j5 \  w      while(!Terminated){0 L% W* U2 X5 V$ C
         int nSize=recvfrom(m_Socket,buf,4096,0,(struct sockaddr*)&from,&nLen);! O+ x! U/ ~0 @& j! u0 g
         if(nSize>0){- N/ N- o0 I- g" V6 Q
            buf[nSize]='\0';
. D" _% x3 G: D! t9 A( C            PSTNForm->Memo1->Lines->Add("Received Length:"+String(nSize));
4 H2 ^# Z+ _. m) C9 v6 i            PSTNForm->Memo1->Lines->Add("Received:"+StrPas(buf));
3 K% r( V4 A# A1 G) w" [            ::Sleep(100);
7 n) C% D* K6 W1 M4 g0 m            sendto(m_Socket,buf,nSize,0,(struct sockaddr*)&from,sizeof(struct sockaddr_in));0 d/ F1 Q5 K7 E4 C0 w
         }' T# L& [* e6 k" E: O
         else return;+ @" f: g! A8 d2 E+ [7 b

3 g) F3 s' i1 C      }& M% ]9 W" r2 V, e
   }7 U" H+ Y" y) h0 H& h
   ListenSocket();
( k$ A9 |7 i& m   struct sockaddr_in client;- v9 v  x. b8 N. l& h
   int nLength=sizeof(struct sockaddr_in);
( o+ h' W1 r- M, |" [3 _& e   while(!Terminated){9 c% F+ X3 f6 j0 N/ q& F& g. o
      int nError=select(1,&FDS,0,0,0);
. o6 t) @: u" ~+ S      if(nError<=0) Terminate();
6 R& {7 m0 ]( ~; n. r. \      SOCKET m_AcceptSocket=accept(m_Socket,(struct sockaddr*)&client,&nLength);  A0 s* ^3 v8 K7 b/ {
      if(m_AcceptSocket==INVALID_SOCKET){$ Z; O3 g3 I$ T& r. @
         sprintf(szTmp,"Failed to execute accept,error no:%d",::WSAGetLastError());+ X# W$ a) `8 `! k  r0 r! W! J7 F. f
         ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);6 W' _9 f. j: m: {: `$ E
         DoError();& l" T7 m" A( X
         Terminate();( b* i( v: B/ e! u+ N
         return;0 ?( @; @; k9 e. l# e
      }
  n( S. ^( F$ V+ F3 H! E      TCommunication *pCThread=new TCommunication(m_AcceptSocket,FALSE);4 E. W. k# c+ u7 E, c
      pCThread->Terminate();$ @, \$ G- P8 I+ Y, I, X4 w
      pCThread->WaitFor();5 r, `. Q& E' F& {5 M
   }
  {; e" P+ g- e}
0 e4 T* h- B6 Q. L; k5 ^+ t9 U% [) B//************************PSTNForm*********************************************//6 c( {& t6 j5 k, z# R) u
__fastcall TPSTNForm::TPSTNForm(TComponent* Owner)7 |& u9 a% ?9 \3 j/ _
   : TForm(Owner)
) a& ^( J9 j9 b! D0 w8 h8 P4 u{5 m' s8 m, D$ |
}4 a4 X5 @- o. X$ x6 H5 ^+ @
void __fastcall TPSTNForm::Button1Click(TObject *Sender)! {% g' m$ c% v8 t3 U% x
{1 q* |: G% |" t1 W9 V2 G
   Close();& t! V: c: o$ G* m/ S  n
}/ d6 Y* [6 Q. S. n( p0 {  a5 D
void __fastcall TPSTNForm::Button2Click(TObject *Sender)
0 {/ M6 _5 [9 [8 w+ G{% a4 L4 A$ [% u2 B+ L' @8 C
   if(pThread){
7 H. \0 m: {) A# \5 K* B, S      pThread->Suspend();( m5 _& Y+ T; K; K- w- x4 L
      pThread->Terminate();
$ u7 T  t* l# ~# g. ~      delete pThread;
+ L, |1 r! ?0 |! j3 s      pThread=0;
( Y2 ]5 C" ?) J# t0 ^6 @   }0 \' w3 c8 S3 _' H4 ?
   UINT m_Port;
0 A2 [' f, f. u6 T  _" H4 F7 G$ [   try
( t; E: O# K$ J- B- u5 y6 @   {( T# D' v1 s0 n4 T1 H* a/ q) Z
      m_Port=Port->Text.ToInt();
! J, R! V0 I, D& G* n+ X" K  e$ ], }   }0 s+ W8 _$ {% x+ ^0 Y" j
   catch(Exception &e)# d& W3 X0 a2 E
   {+ Q/ Y0 Y, h$ O7 Q& J
      ::MessageBox(0,e.Message.c_str(),"Error",MB_OK+MB_ICONERROR);
9 H, m3 c$ D7 s, ?      return;
* y8 {4 \2 a/ O9 U% I/ R' T   }' S# `. t9 J, \# p2 j! t
   PROTO m_Protocol;
" Y9 i" L  a! @+ ?8 `$ K* D   switch(Prot->ItemIndex)
) Z4 t# P, B8 X1 ]7 r# y) ]' ]   {
/ ~4 }# s. b1 [4 g/ z( ^      case 0:
& w8 |5 f! T& A7 K, L+ }         m_Protocol=TCP;
. R; l( u! }. s& k( w) q         break;
3 J6 ]/ c2 J% I9 i8 x; t7 l" M+ J      case 1:- Y1 A+ I; n' i8 w7 h6 g+ \* d* J
         m_Protocol=UDP;. o( O  z# ~7 F+ n
         break;
7 E9 \0 K2 a% ~" q) B      default:
3 P- g* @2 d0 O3 O7 h         break;
& _: Y- E! m$ C6 i; n. q( K/ L! C   }
% I6 ]- S% m6 t" V7 R! s% F6 {   pThread=new TListenThread(m_Protocol,m_Port,FALSE);3 ]1 d0 t# V8 s: a; G/ t8 ~
   //pThread->Terminate();+ V" G5 I8 s' y& C9 q* f
}
8 ^4 D, |5 U: P( @void __fastcall TPSTNForm::FormCreate(TObject *Sender)/ P6 P+ {, |/ _7 f
{
4 H$ n) m; j. u( s   ::SendMessage(Prot->Handle,CB_SETCURSEL,0,1);$ m5 ?5 A8 S- U" `" O. h7 J2 q
}
( D+ M( o) O4 A  ?; A, c
5 F4 X1 T% q' {& D5 V0 J0 _* J: uvoid __fastcall TPSTNForm::FormDestroy(TObject *Sender)! w5 ~% ^  N7 J. j# _; j
{1 p( X! z) b, Y9 W. ^) [6 x9 C
   if(pThread){" O( k5 W: O1 C( J9 ^, x+ Y
      pThread->Suspend();
  c) Y" n0 U& V* s5 V      pThread->Terminate();}
8 q4 O! ~% c2 P& A* b8 |, G}0 g! _- [% @5 z: _; z7 ~9 U( D/ ~
上面的代码,各位可根据自已的需要和针对自已的应用,在数据处理方面加以改进就可以了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-10-2 06:53 , Processed in 0.018473 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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