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

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

[复制链接]
发表于 2004-2-15 14:01:13 | 显示全部楼层 |阅读模式
在CB中用socket api来写网络通讯程序
1 N) i9 O& Z; K; f& O作者: kingcaiyao ,如转载请保证本文档的完整性,并注明出处。
  C" E+ C4 D1 U. }欢迎光临 C++ Builder 研究,http://www.ccrun.com/doc/go.asp?id=569
; B$ C$ s7 B: {- n" T本文转自csdn,作者:kingcaiyao! ?. v  a3 w: z) g2 }! a
原标题:在C++ Builder中用socket api来写网络通讯程序(同时支持TCP和UDP协议)
) K3 g  k5 P7 F3 E6 `. H原文:  http://www.csdn.net/develop/read_article.asp?id=19883
# q$ ^1 p, L, [+ W/ n3 h: ^) L0 h5 i5 E4 a5 V
# m/ n, i( X# O
在7月4日看完sockcomp.pas后,我决定用socket api来写一个客户端和服务器并且同时支持TCP,UDP协议,于是我就去做,现将代码贴出来(已调试通过)
  x& b/ @; X4 @. }& ISocket api Client:" \- |, P# ]+ {# C. F2 y

, j" ~- _- `" B% n0 _' ^#ifndef UDPClientH( V: d* v$ V+ E2 G) `3 Q' J
#define UDPClientH
, u+ J5 ?4 S9 z& b. g! e# d#include <Classes.hpp>9 G, p: o! M7 D' v4 T) l* |
#include <Controls.hpp>* k0 Y0 E/ r5 \
#include <StdCtrls.hpp>4 g% U9 ]: ~! U% i$ |
#include <Forms.hpp>) z+ Z; n* t5 H' r( S
#include <stdio.h>
9 q/ L1 t, R7 j2 [, U#include "CCEdit.h"
- f$ t* q7 Q3 r$ a. v! x#define WM_SOCK WM_USER+100$ c7 y& O0 P0 ~* W+ i& L6 n4 y
class TLANForm : public TForm! r! c0 x1 o* v5 R! n
{: V0 G; J9 F2 ~
__published: // IDE-managed Components
7 n/ F9 J6 i% V) `3 w. L) ~% C0 a   TEdit *Port;
6 B" o4 ~1 k' c$ o   TLabel *Label1;! r( g& m# S2 o2 N# ~( v
   TLabel *Label2;
1 k* G" v( L0 N/ Z) E7 [   TComboBox *Prot;2 r( U8 w; h5 N) s! W" B
   TButton *Button1;
, I6 D! S7 d( \1 k   TLabel *Label3;& S/ X% R" R' h: r  A. F; V
   TEdit *Addr;
! F) b: [/ ^' Q: Z- ~   TCCEdit *TxtEdit;9 j$ Z9 L1 M7 m
   void __fastcall FormCreate(TObject *Sender);
) P2 @" g# G% S. I% P) h; Z   void __fastcall Button1Click(TObject *Sender);
4 w$ a+ R, m: J) c( a: [   void __fastcall FormDestroy(TObject *Sender);6 r6 R9 X* S- a" Y. o
private: // User declarations' x6 A' |3 e( B
   void __fastcall OnRecv(TMessage &Message);! @4 h: z3 e7 y: ]6 g
public:  // User declarations- e& L& c& U- F  p, |. [
   __fastcall TLANForm(TComponent* Owner);
/ _5 n( K; v9 s& F' \# G   BEGIN_MESSAGE_MAP) H$ a+ e. T) w# E( f
      VCL_MESSAGE_HANDLER(WM_SOCK,TMessage,OnRecv);
6 I0 c' z4 l) p5 @2 N4 b. E   END_MESSAGE_MAP(TForm);
9 W- E- ?9 J# \3 |) ]  C( }- l};
! f4 i! g- j2 u2 f6 M8 @extern PACKAGE TLANForm *LANForm;
4 |( O" d  c+ O0 S" B#endif
/ D+ w+ }) R! ~  F4 b) m& ^
8 d% g/ l  c7 `- N9 Y& {
; ?4 I  l/ C7 {! j% M1 q  N+ C9 m) H.cpp File
  X0 O( {/ j" \- ~" ^3 `
- k9 A) P- p% d) E, `#include <vcl.h>6 S3 U, [0 ]) ]* b. A8 |
#pragma hdrstop
. U1 i0 r' P. U# ^$ n% E#include "UDPClient.h"
9 R! w8 [! ]6 r; r* Y; P#include "WinSock.h"0 z& \0 ^# E5 l- \6 `6 i' x0 H
#pragma package(smart_init)
, j) S* d  T2 c. r: Q' w% k* c/ p#pragma link "CCEdit"
* p6 ~9 N6 b/ A4 i#pragma resource "*.dfm"
; l% ]  S$ K7 x& f4 Q# xTLANForm *LANForm;% ]" h9 ]* s/ U' r4 `9 G, D8 j
enum PROTO {TCP=0,UDP=1};
) T) v( i" V% D4 _) X3 v8 rSOCKET m_Socket=INVALID_SOCKET;
4 N3 m% a* u8 Y' M$ ^( j5 `) dPROTO m_Protocol=TCP;
$ ^$ O  c, B" \( i( P+ ~__fastcall TLANForm::TLANForm(TComponent* Owner)% _- |" v1 m, G- Q% Y( `+ V7 T
   : TForm(Owner)
* F6 `8 q5 m& I% ^. L# i{' o& p0 }5 A6 |

* M3 h, q0 D6 f& u) f$ s, J}
% C0 }( M4 R3 c+ |void __fastcall TLANForm::FormCreate(TObject *Sender)% ?, W( V3 Y( n; h
{1 t: s1 w; s" w8 p" @' q* }2 B
   ::SendMessage(Prot->Handle,CB_SETCURSEL,0,0);
  g2 |2 Q9 \  w1 Y}
1 A" j( Q# O( k7 a8 p* w- M. Pvoid __fastcall TLANForm::OnRecv(TMessage &Message)0 {# l9 z2 Y) H; \& Y; S8 f' H
{
- m- [+ ~) S1 O5 ]$ G   char buf[4096];; b3 k) E8 k3 W
   int nLen;
4 r6 j1 P' A2 `( S: Q. v   struct sockaddr_in from;" }0 d/ G) U) O, ]9 J: j! g! R
   int nLength=sizeof(struct sockaddr_in);% S7 Z6 \! ?* [! I1 j
   switch(WSAGETSELECTEVENT(Message.LParam))4 [" [7 f6 E2 j* y1 |6 N: e
   {+ @& K  {5 j7 T$ p+ C
      case FD_READ:/ x# ]# t9 q, n% z5 h: M( Y" y
         switch(m_Protocol)3 h9 ~, ]4 E) D" {* s
         {' L  e, x9 w# c0 N
            case TCP:
+ B0 S- Y! O1 t( \/ a2 Y# y               nLen=recv(m_Socket,buf,4096,0);
. L8 U; V& V# {) T" n8 w( x  |  s               if(nLen>0){2 P9 L, q/ B! T! f
                  buf[nLen]='\0';
0 d" n! b* P! [7 m4 a% i/ o* V                  TxtEdit->Text="Received Length:"+String(nLen)+"\r\n"+StrPas(buf);
" A! D  z4 `: e" I               }
  `$ F* a9 P3 |" z& L; T               break;
! J' N2 F6 ?% y  w. o0 E7 ~# b            case UDP:/ w/ v3 d% }" L
               nLen=recvfrom(m_Socket,buf,4096,0,(struct sockaddr*)&from,&nLength);
$ z0 U2 W# K0 B, F5 q1 M$ y7 `6 ?               if(nLen>0){) t) x/ q7 ]- Q" h4 t# N
                  buf[nLen]='\0';( l5 P/ q5 Z/ E; u
                  TxtEdit->Text="Received Length:"+String(nLen)+"\r\n"+StrPas(buf);
' N; x7 }6 n% X3 t; F$ n               }" T9 I9 }4 o0 t. X) X3 ~7 n
               break;
6 X5 h5 o3 o* E1 ^6 e  s, [: b         }" [8 [& X- B4 a6 H4 K& x$ q+ _
         break;
. i" H5 `* k6 c8 ^8 y5 ]- C) f' v& `      case FD_CLOSE:7 M" Y' o! ?5 h4 ~+ F) @0 r$ O
         closesocket(m_Socket);. B( D$ J: t8 n. r+ H
         break;
! v% V9 n. k- t& p1 A( c   }) K: v, I" Q% s3 u  X2 o
}3 n$ K) R3 m1 m/ R7 v2 X- }4 k
6 X" \3 g9 ]% {" q2 x. p, \. l
void __fastcall TLANForm::Button1Click(TObject *Sender)
# @& a2 g/ q: {" y2 U* e{
! ?6 z0 L' j1 ]0 z   char szTmp[256],buf[4096];
, c5 g. V) N# u* A( W$ k   int nSize=0;3 L) ^: ~* Q; o8 y& {
   UINT m_Port;4 m: l. k. e6 _6 {
   AnsiString addr;% x0 h( B6 ]" Y3 C' q6 d/ [
   addr=Addr->Text.Trim();
$ L9 m# j1 x: u* I/ Q7 ~   if(addr.IsEmpty()){2 {' P# o3 ^' |* K
      ::MessageBox(0,"lease enter the server IP!","Error",MB_OK+MB_ICONERROR);/ m; F4 Q$ \4 a* L4 ]9 ]3 K
      return;
- j( O3 I1 E: T1 r   }5 ]- l8 R. U1 U! Z$ }
   unsigned long nAddr=inet_addr(addr.c_str());8 D! ?9 m  i; ^* G! z% s; |
   if(nAddr==INADDR_NONE){! |; d- ~6 E7 V
      ::MessageBox(0,"Bad Internet IP!","Error",MB_OK+MB_ICONERROR);
- I. a( q8 P  k; {; ~7 z      return;}
2 U$ l$ |7 Y3 g3 G  L3 a% o8 T
: |7 H& v$ [, L0 V* R   try
9 F' n& v5 G: S* |$ S! d& \6 ~   {, `/ K- o5 f+ s9 b- `4 Q! A
      m_Port=Port->Text.ToInt();- I9 ]% l$ Q* Y. V" c- w  `, }% i
   }
9 c- o$ g6 D- w0 }( V% v   catch(Exception &e)) m% r! X+ d4 e' f/ A2 r' d
   {
, b* o, k8 y" ?- j4 i6 Z) {      ::MessageBox(0,e.Message.c_str(),"Error",MB_OK+MB_ICONERROR);
) O4 j. p, ~( X+ |2 e      return;7 w4 u+ E4 t2 y  p% k+ t
   }
3 D, q1 b5 O% g/ Y6 b   switch(Prot->ItemIndex)
9 ?! `# @3 m1 ]0 d' B9 R   {  `$ W- b6 F0 Q% X& [+ L
      case 0:4 t! ?/ h( z) T1 z0 L7 }$ J8 q7 F
         m_Protocol=TCP;
! g- U( x* i' x0 T+ t         break;" }. ?1 `& l, F& ~9 E9 O0 f1 g1 n
      case 1:
' G4 a* J  Q( |. n0 g* O         m_Protocol=UDP;3 ]5 }8 Y' g6 o  z1 j+ W& Q! U
         break;
6 u2 M2 ?; g1 i2 W: j, u0 D8 b( @   }
( S% m, E; V: W5 Z; z% G   if(TxtEdit->Text.IsEmpty()){
' p0 e# _/ T( Z: u      ::MessageBox(0,"lease enter the text you want to send!","Error",MB_OK+MB_ICONERROR);" R* x. T" N9 ?7 w: o4 q
      return;}1 V4 l# `) a8 q. e) R

% z& s" O* _) b$ o0 z+ y' v& K' K   //Initialize Winsocket
0 I" Z' \, i% @; L6 b5 ^' E   WSAData wsaData;
! |' w7 _6 K$ a! P; P$ b$ \& J   ::ZeroMemory(&wsaData,sizeof(WSAData));
# [1 y/ M1 k  t. O, H. ^" }% P   WORD version=MAKEWORD(2,0);0 I8 Y, Y$ ]8 s/ d0 @; e
   if(::WSAStartup(version,&wsaData)){% r# `1 X8 j/ h. q$ ^/ a
      sprintf(szTmp,"Failed to initial winsock enviroment!,error no:%d",::WSAGetLastError());
( b- E, k0 V  Q1 P; N9 |      return;}
, E7 _' t0 T! Z* \0 j* F
$ d& G1 I8 A8 _" L: B   //Obtain the active connection8 \8 o* G" {. j( J, ~. E  p
   char ComputerName[255];
; Q1 h1 ]2 l: I% z' M' y. E/ T   gethostname(ComputerName,255);
/ v8 L3 ]5 g: t# v( k   struct hostent* he=gethostbyname(ComputerName);
$ w7 r1 d- o: b. F, W   if(!he){
6 Z" i6 ?  \# A; ?3 z5 U      sprintf(szTmp,"Failed to get information to host!","Error",MB_OK+MB_ICONERROR);2 T' y& g  h. r  h. t. z) b% \* u
      ::WSACleanup();' D0 W8 K( `3 \/ U7 @
      return;
0 d5 C8 P" l6 D: e' v7 t, r, b! m   }# \2 F& C( N% m' j& p. s
   //create new socket
" _; z9 c/ V; l2 \6 ~   m_Socket=INVALID_SOCKET;
6 A+ e. u" P* H' u- G   switch(m_Protocol)
8 u( q# I( F( b, e. U8 w# R/ Y   {
( c, l" x' O: M' e      case TCP:
, p/ e% [9 X0 ~4 I         m_Socket=socket(AF_INET,SOCK_STREAM,0);) {8 r# t2 D- i: U/ N' t
         break;
4 _' n, ]) ?/ J1 x      case UDP:
( C( ^* N6 {0 y9 [- ~( o3 y         m_Socket=socket(AF_INET,SOCK_DGRAM,0);7 R; a6 z# D9 X1 V: D5 _
         break;: v% h+ v, H) }; l8 {# [% m  V
   }- k3 ~) f8 R0 l: A% t2 @
   if(m_Socket==INVALID_SOCKET){, Z5 a6 q3 `7 X2 E7 P. U
      sprintf(szTmp,"Failed to create a new socket!,error no:%d",::WSAGetLastError());5 T' m4 [' n2 d* i# H
      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);# c9 T4 m; X$ ^  T
      ::WSACleanup();4 B- P9 f* b# j4 `1 s
      return;) x& \1 K- \" e% ]
   }
  t+ f. x, e' i/ ~: u& s: Z5 Z   //bind socket
( E3 O+ p0 I& @$ r- n/ G   struct sockaddr_in client;
* K2 B3 ^" Z! h4 G+ \0 V   unsigned long nClient;
7 U: r# L) k$ G: n" N2 l# L% @9 w   memcpy(&nClient,he->h_addr_list[0],sizeof(int));
4 e0 j: \+ H4 S/ U' F; M) Q   if(nClient==INADDR_NONE){  e3 r+ x1 h* }8 W
      sprintf(szTmp,"Failed to obtain the local machine's IP!","Error",MB_OK+MB_ICONERROR);
. j$ C0 w/ Q. Q0 [- x2 V      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);
. n5 N6 i2 w: u2 g2 W) |6 k6 q      closesocket(m_Socket);
! M% f$ n. m% m: `, E6 B      ::WSACleanup();
# w  P, A- @. @6 W      return;# d; h" l6 j9 I2 b
   }
% u" G1 S* U4 o   client.sin_family=AF_INET;4 a; K7 I9 z4 p$ x
   client.sin_port=0;& {. O$ o) ]5 m" J
   client.sin_addr.S_un.S_addr=(int)nClient;' S! E' E$ I7 e1 n9 m( ]) w) V
   if(bind(m_Socket,(struct sockaddr*)&client,sizeof(struct sockaddr))){+ ~' N3 _' {* L; x9 h8 k$ F3 g
      sprintf(szTmp,"Failed to bind socket!","Error",MB_OK+MB_ICONERROR);& V" n" G7 {1 {1 d
      closesocket(m_Socket);. e- m7 |8 t( H% Z
      ::WSACleanup();
% ?! |# x/ z  t# {. Q/ M      return;}
9 V* w1 |1 @" [  r' y9 }, G   //connect socket4 x* y, \: k9 i1 `4 R! _  u7 ~; l
   struct sockaddr_in To;" _, k! L7 i) A) G
   To.sin_family=AF_INET;% M5 Z% e" q9 h, G1 n, O
   To.sin_port=htons(m_Port);4 k5 ~- p' S% H' o
   To.sin_addr.S_un.S_addr=(int)nAddr;
! c# B  f+ v' P# G   fd_set FDSET;- L2 ]' }- g+ s$ |5 t+ g
   FD_ZERO(&FDSET);% m2 C7 G# i: Q( M: H( R
   FD_SET(m_Socket,&FDSET);0 J  r1 H6 R4 H/ C
. K# K! n+ ^2 M. l% m# g) n+ O- ]
+ ~9 N( i/ I$ @: @2 L9 ?. e9 C
   if(m_Protocol==TCP){8 z1 T0 x& x, {% X0 l  P
      if(connect(m_Socket,(struct sockaddr*)&To,sizeof(struct sockaddr))){
- X) V" t9 }6 _) h9 p, j         sprintf(szTmp,"Failed to connect the object!,error no:%d",::WSAGetLastError());' |! Z) |6 J3 c& h; M
         ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);1 [9 H  T! U+ a
         closesocket(m_Socket);% Z1 c, @6 I0 R1 B% p+ ~" X
         ::WSACleanup();- q6 W0 I6 X3 u- V' y2 Z% \( x
         return;
4 L% t! p+ |" e6 \      }( |! A& j" h0 S' l: D/ E  [
      int nError=select(1,0,&FDSET,0,0);: f+ C/ E$ |# _) b# }2 M
      if(nError<=0){
5 m* E' a, R8 t( q  E: x+ E0 o) `      sprintf(szTmp,"Failed to select socket!,error no:%d",::WSAGetLastError());  M0 Z" i  |& t: S! q2 Q
      closesocket(m_Socket);
+ d& ?% [( y& }9 {4 X  b      ::WSACleanup();0 }  X7 K  L# H8 D, k& i, W2 \
      return;}
- u. K) ^4 Q! Q7 y$ O, C   }
) N; K( R' g6 K' P   //Send data
9 y% e0 E8 W6 Y% |   int nLen=TxtEdit->Text.Length();6 W+ K* L( q  G
   if(nLen>4096){2 ~9 h, h: j: s' S
      sprintf(szTmp,"The buffer is too size to send,it shoud not be more than 4096 bytes!");
0 U0 W- r  `( \+ T( T  Z      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);6 @! M- X% n0 P7 V3 i+ @
      closesocket(m_Socket);
0 w# v2 L/ {9 W% P1 X% ~7 @3 u9 C      ::WSACleanup();5 y4 f8 ~5 {" Z: X% T2 T& e
      return;
: Z2 X( g! o' m   }4 V; t" i2 c" I8 }( B/ q
   strncpy(buf,TxtEdit->Text.c_str(),nLen);+ |6 x( J0 U1 {, J$ m2 k
   switch(m_Protocol)
, v' ^  P4 `/ }2 s: I. X9 E   {  {- e1 v9 z# R
      case TCP:3 {) h- J+ ^5 j1 v
         nSize=send(m_Socket,buf,nLen,0);* ~. g2 y# t+ }1 P
         //ShowMessage(nSize);9 L+ N* [4 g, z, t/ I
         break;
0 j7 _5 ~2 l. g+ m+ A      case UDP:
9 R" C: T5 r! e! n; R) I# G4 p' S0 V         nSize=sendto(m_Socket,buf,nLen,0,(struct sockaddr*)&To,sizeof(struct sockaddr));5 o0 d; M: G# X/ x6 |; T
         //ShowMessage(nSize);  a- s' k; L$ k( L7 F
         break;" V+ }. B* |9 [. x5 i( e; `
( G7 z' s, X- z7 {7 c
   }
# c" Y5 M  m5 k* X  o3 F: Q   if(::WSAAsyncSelect(m_Socket,Handle,WM_SOCK,FD_READ|FD_CLOSE)){. ^: o, f8 ?1 N8 L2 ~
      sprintf(szTmp,"Failed to register socket event!,error no:%d",::WSAGetLastError());
0 h0 Q7 ~1 Z- U( M: j      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);9 p+ ?) q  x$ E2 Z+ K# |& f
      closesocket(m_Socket);
  D5 M: Y5 y& `* A: K! {      ::WSACleanup();/ }5 l1 s; F8 y4 n$ c( n7 N$ D
      return;}3 ^2 u3 q( U  w& t
}
8 d6 t* T- G* Vvoid __fastcall TLANForm::FormDestroy(TObject *Sender)
- m0 j! }' Z. J# }) S2 R  O{
9 ?' Q$ \/ q" s   closesocket(m_Socket);  b, p4 O6 c+ t) v! t
   ::WSACleanup();; s) d# K0 w) W
}8 R6 G& Y4 |- W) w. O
3 b% @5 x6 ]8 ?' B9 I8 b' k6 _
Socket api Server:! b% q- r1 T. J' s
.h File
9 j2 n- ~2 d8 B  m4 [- {7 A. ]+ L5 _#ifndef UDPServerH" x7 A  a; x" B2 Q7 L0 p
#define UDPServerH1 _. x* G  x1 a- m
#include <Classes.hpp>
  m5 g$ N+ p7 ^5 N#include <Controls.hpp>. F. ~0 p  {6 J" Q2 t
#include <StdCtrls.hpp>
3 k5 F  U1 m1 R! N: I- P. [" H#include <Forms.hpp>
! `, O8 c7 k  B$ c#include <stdio.h>! C: Z$ G5 l1 h: N* ?* V
#include "WinSock.h"
5 I8 X; o3 O; f+ ~" T  X/*#define WM_SOCKET WM_USER+1000
# \! E! p' O: D/ K: @* S#define INITSOCKETSUCCESS 0
: o% d& D+ J. t9 A& P: ^+ [#define INITSOCKETFAILURE 1
7 ^+ C( ]( M8 j( f& F2 t#define CREATELISTENSOCKETSUCCESS 28 D$ a$ g( v8 K1 [, e" E+ K
#define CREATELISTENSOCKETFAILURE 39 ^* s( E4 D8 T$ I  n4 t! \3 ^
#define SETLISTENSOCKETSUCCESS 4; r. o# G, ]4 d* j# `% u6 n+ B
#define SETLISTENSOCKETFAILURE 5# E7 `$ K4 s7 u" |* V& P; j- |
#define BINDLISTENSOCKETSUCCESS 6$ W) w, L# R$ n2 t/ `2 m) R, a
#define BINDLISTENSOCKETFAILURE 7
& E, q# L/ O9 @; g, L: a; S#define LISTENSOCKETSUCCESS 8
" f# A6 S' w+ |0 I# V) N#define LISTENSOCKETFAILURE 9
# Y$ n- \6 u+ \: j% N7 X5 b. K#define ACCEPTSOCKETSUCCESS 10
, O$ \! r  ]" `% A) W+ v. _5 z#define ACCEPTSOCKETFAILURE 11
% J0 T* H( W; y9 L0 c) D*/
4 \, H- P. F$ F! b  w# V0 gclass TPSTNForm : public TForm+ H% F4 R1 H$ {" J2 G6 D
{
& w3 k, x  P& l# N- q+ s__published: // IDE-managed Components
5 V, S% I3 p2 E( K% }2 p$ E; \   TEdit *Port;
) w0 I5 ]: j8 X4 C* @# V! R0 j' N   TLabel *Label1;7 J$ I* j1 V* u
   TMemo *Memo1;
6 a% h/ s1 O  U4 _   TButton *Button1;! C3 w: Q  [6 w2 l1 C) Y7 O
   TButton *Button2;8 c% d' n- S3 M3 s
   TLabel *Label2;
: B- v7 K5 v! K/ F2 M6 W   TComboBox *Prot;
2 G$ e$ ?! ]. G* L. B- _   void __fastcall Button1Click(TObject *Sender);
8 _& h4 i# P, `# P   void __fastcall Button2Click(TObject *Sender);2 b5 n+ F3 v( y' ^( k0 r" N
   void __fastcall FormCreate(TObject *Sender);
6 r) f  _1 \, z5 Z7 K   void __fastcall FormDestroy(TObject *Sender);! Z8 K. a) p/ m' H& ], C
private: // User declarations! `: v( T9 k3 O+ `* T4 {( `  u$ W
public:  // User declarations
, E- F; D3 O2 z- ^" e/ s. F+ M   __fastcall TPSTNForm(TComponent* Owner);
; N8 }& \4 l$ _5 L! W- U- A0 c};3 E9 G1 z! \7 a. n2 n
enum PROTO {TCP,UDP};
5 L& R6 f6 ]3 v! Gclass TCommunication:public TThread    //Communication Thread: S* ^- S' }, t4 E# {
{' ^( v( `: d2 M6 }0 F3 S# Y0 e. y
private:
* `" U" L6 L" W5 g* b) q7 Q/ R   SOCKET m_AcceptSocket;
; V: z$ ^0 v# P$ V: j1 P   char szTmp[256];//ERROR MESSAGE
& L# b0 b6 [: Z0 O$ B4 tpublic:8 x0 B9 J- @5 u, O2 i: d
   __fastcall TCommunication(SOCKET m_Socket,bool CreateSuspended);2 }5 N% e) D/ \
   __fastcall ~TCommunication();- i5 R; X. H2 j; c/ j: f- O
protected:
  P* j$ ~# R4 C" \( j! w   virtual void __fastcall Execute();
, u/ c" X' ?. ~0 L+ S% ^};
1 F) @/ C9 ?8 yclass TListenThread:public TThread //Listen Thread
3 q! E2 O6 Y% X+ Y& `3 E# H" ]{: O# R7 t. m6 H6 ?' {
private:. C' @  }* N- B# |( q/ B* j, I4 _
   WSAData wsaData;
1 T- w- ~% M! Y. g( [8 O# i   struct sockaddr_in server;
# N0 s% l3 a% U9 y   fd_set FDS;0 a& h; ?- Q2 M( e% E) O# ^+ R
   UINT m_Port;
1 R2 y5 r) K9 y  h  T   PROTO m_Protocol;4 J( h$ F/ o- v( w, R1 k2 D  b
   char szTmp[256];//Error Message
6 h7 s* @( O( \% dpublic:
! E& s/ i' W# T+ [0 S   SOCKET m_Socket;4 F6 Q; W3 C3 Y! Q
   void __fastcall DoError();% v/ ]$ w8 l1 e* s- [  |
   void __fastcall InitSocket();# q5 h3 C$ S0 [$ t
   void __fastcall CreateListenSocket();' u) J$ t. e  G
   void __fastcall SetListenSocket();
4 ]4 ^8 n$ e1 b( b   void __fastcall BindListenSocket();0 D2 ?5 n: ~8 \( a- m  ~# p
   void __fastcall ListenSocket();
& I2 }" _/ R* s6 b" c& W3 I+ S2 u3 B2 x8 g  l
public:
0 W: s% Y* E+ e" H+ h   __fastcall TListenThread(PROTO m_ProtocolA,UINT m_PortA,bool CreateSuspended);
1 K1 C  e0 ^$ Q4 H   virtual __fastcall ~TListenThread();
9 z& z* z' n2 p. Y& C. T3 Oprotected:  s2 M; M* H5 P
   virtual void __fastcall Execute();8 U: S5 V3 C1 R9 g- Q, p
};* I! Q4 B6 e# F: @* ~( x6 u
extern PACKAGE TPSTNForm *PSTNForm;
$ G; @4 Y. m) E1 T4 s6 H/ D#endif& R' b7 ]8 D/ a. H0 @2 E: ]+ P2 _
.cpp File' }  r2 x$ `# t* S, }4 B4 v5 i( ~
#include <vcl.h>$ [% J( N! O, g- j+ N
#pragma hdrstop7 [8 L3 v4 v+ E6 V3 j0 q& {" o
#include "UDPServer.h": F+ u3 N' a  }# D6 c
#pragma package(smart_init)
; M, |" G1 j, J( U#pragma resource "*.dfm"
8 c' |/ U( \( |5 i& t4 g, |4 Q. STPSTNForm *PSTNForm;: @, J& q: s( ^/ c  o
TListenThread *pThread=0;
# Q  U7 N! R  Z( [//******************************CLASS TCommunication For TCP****************************************************
9 H- b; O8 i; {. Q__fastcall TCommunication::TCommunication(SOCKET m_Socket,bool CreateSuspended):TThread(FALSE)
* a- J" {/ y& n; c) H: I& O+ d{* |0 q8 w& j# q& R5 J( e$ v
   m_AcceptSocket=m_Socket;1 k# P2 e8 z. d' U# @" V, W
   szTmp[0]='\0';
" M3 ~1 y4 `9 g) U# U% ]& F   FreeOnTerminate=true;( e& Z) s7 C( }; H
}/ C; r* d+ x8 j2 c+ |9 Q& }9 w
__fastcall TCommunication::~TCommunication()
( g: Z3 f5 O; `$ f/ P* ?$ n{
- n8 m9 o8 B* f' Z. H/ B  // closesocket(m_AcceptSocket);
: n. I3 e  `+ m# j$ p6 c: ^}" a# W6 x/ b' n6 t' N% a- A
void __fastcall TCommunication::Execute()3 g, r- R# \& N' y- V4 l
{% ?0 L, I6 K0 ^% Y; K
   char buf[4096];- f+ L$ n; ~/ m3 X. Z5 t- ]
   int nSize=0;
3 r, e$ R8 b0 B, v5 t7 t4 N0 s7 |   nSize=recv(m_AcceptSocket,(char FAR*)buf,4096,0);+ a2 Q1 ~2 Y/ R$ g" d2 R8 a
   if(nSize>0)/ X* |/ M4 n9 \0 e2 f$ u* a
   {6 S) e  ]" G6 m( R: J* w8 s  ?, V
      buf[nSize]='\0';" F1 c* I0 B& W& T& z3 L5 o5 n0 G7 }! i
      //Display3 p" ]  t" t7 k+ s0 i
      PSTNForm->Memo1->Lines->Add("Received Length:"+String(nSize));/ |- u# r5 p  b9 K5 M6 E1 t& ~2 Z
      PSTNForm->Memo1->Lines->Add("Received:"+StrPas(buf));
; z- R1 S* w% z! z( M$ t# L. f      //Deliver$ I2 u  z* G' s9 W1 P4 ?! ]
      ::Sleep(100);
: z5 s8 j, p, q      send(m_AcceptSocket,buf,nSize,0);9 ?- b! E% ]+ R; p; l1 z  J
   }( e' _3 N, l# e$ @* i) G

7 E) u( R  b& e}! N: {( j8 H5 m5 X. s
//******************************CLASS TListenThread*****************************************************
* ^2 O+ Z* L# W* p__fastcall TListenThread::TListenThread(PROTO m_ProtocolA,UINT m_PortA,bool CreateSuspended):TThread(FALSE)
5 y& M9 ?4 c2 E9 F4 U1 @{7 S) ~  \9 T0 \% X( B+ o$ J" p' C
   m_Socket=INVALID_SOCKET;
3 K  D4 S8 b( V7 P* _2 m$ z3 `! y   m_Port=m_PortA;2 N9 d; Q9 r4 t5 s) b" H3 U
   m_Protocol=m_ProtocolA;1 X+ h* I0 J. e; W3 t+ D" F; T
   szTmp[0]='\0';" p8 n+ D; M) Q' \0 J' p
   ::ZeroMemory(&wsaData,sizeof(WSAData));
& X' h, G1 F) \! t0 ]; K   ::ZeroMemory(&server,sizeof(struct sockaddr_in));
5 l$ A1 D: }$ |6 \$ T5 r   FreeOnTerminate=TRUE;//Automatically delete while terminating.$ c" o- G- n% M8 [. `3 o8 s1 f
}% K. j6 w0 D' x# c) h" J7 Q
__fastcall TListenThread::~TListenThread()+ [# [# N- Z) u) B. X: `- M
{
- u9 {5 j$ c: g. X   closesocket(m_Socket);' Z' L& {) P- h0 A8 G3 D
   ::WSACleanup();
. z$ e# o7 t' L; b/ q; v# P3 ]   m_Socket=INVALID_SOCKET;
( g" X! P. g( H: ~+ X' L% X# s   m_Port=0;
  F! T3 l/ O$ X* {; O3 {* L   m_Protocol=TCP;
  c2 P: f( [# n& }& t6 _4 o! f; |   szTmp[0]='\0';
: B5 C7 e! x5 z# p( h( |) ]6 e0 C# X  j# p   ::ZeroMemory(&wsaData,sizeof(WSAData));0 ?" G. ^" U9 v* D- {
   ::ZeroMemory(&server,sizeof(struct sockaddr_in));: |- o; \5 w; R7 A
}
: k1 R9 W0 _4 }" V# Q) ~& f! Cvoid __fastcall TListenThread:oError()/ q& W1 h/ V/ M6 c' y
{# |! C$ f! y% k) r! a9 Z
   if(m_Socket!=INVALID_SOCKET) closesocket(m_Socket);
7 b, L. t- g) x0 S. _1 k" m$ l   WSACleanup();3 Y0 {/ E! {2 Z, T; a
   return;/ F( r* ~1 f8 x3 D# R  ], i
}' Y" `' s6 v* o7 o' S
void __fastcall TListenThread::InitSocket()  s' F( _9 u( \) m* k+ i
{: f8 d! j2 N% p3 x; E- Z% ~- [
   WORD version=MAKEWORD(2,0);
- J( w5 W4 I3 D) J' o   if(::WSAStartup(version,&wsaData)){2 [& ?$ z; z. C, ~
      sprintf(szTmp,"Failed to intiailize socket,error no:%d",::WSAGetLastError());
$ T. b! v9 a* ?4 w* [, H) `      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);5 ?& t1 b1 H7 R2 h9 n
      DoError();3 I9 H2 L: {6 }" W4 O& @& N* p
      return;
( N& y) K7 S8 G. a   }+ R; P0 M% d- a) `* f; p2 j
}
6 P6 X$ z8 S6 v, f7 r6 U+ wvoid __fastcall TListenThread::CreateListenSocket()
" z( G5 v! e( \{! S1 F) j0 F! e/ N
   switch(m_Protocol)
# v! I9 u, y, G) g( k   {
( V% C, m2 {) A2 i) `2 `      case UDP:2 m5 E8 j' Y+ h. h0 H
         m_Socket=socket(AF_INET,SOCK_DGRAM,0);0 Q6 {% S$ p- V+ g: f
         break;% W* |' ]3 R- i8 P/ b
      case TCP:  S% F, f9 V- S
         m_Socket=socket(AF_INET,SOCK_STREAM,0);4 K3 [% [' a4 @7 k8 a( b* ~
         break;! n2 {8 y3 M) c) v. p" b6 ?( A/ D
      default:
( @/ @+ |+ O0 W# q9 L6 s         sprintf(szTmp,"Error protocol!");' m+ B4 W4 w1 O$ n' r3 P4 i4 D
         ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);
' u1 I/ n2 X# k+ h3 q1 Z         DoError();  j; b2 c; Q2 |, ~7 h
         break;
+ z6 v- l% _5 w* W   }
9 }, ]7 v" `" T   if(m_Socket==INVALID_SOCKET){
% L; a  A; {/ W      sprintf(szTmp,"Failed to create socket!");8 j  X8 m- i7 S
      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);
8 x( E# e- J6 G* r      DoError();
& P  u4 D7 _% r& N  L      return;
+ n# f- c  X8 I4 g0 u   }
: j; {! w3 n( a0 U& p2 ^* \+ R}
; X, J1 C  E& j: M( Z3 j/ yvoid __fastcall TListenThread::SetListenSocket()
  Y% x' U& h# N: i- V. u+ Z{
) g& r( E; h. H' x$ Q' Z) J   server.sin_family=AF_INET;
( K) t1 i! B$ P6 g' K5 B   server.sin_port=htons(m_Port);
4 P9 ~8 U2 V" W; {! K; I   server.sin_addr.S_un.S_addr=INADDR_ANY;
1 D# H3 O  s) y# u5 X$ P8 l. R   int NewOpenType=SO_SYNCHRONOUS_NONALERT;
0 t" a" \* v2 k: k   if(setsockopt(INVALID_SOCKET,SOL_SOCKET,SO_OPENTYPE,(char*)&NewOpenType,4)){& B6 M- j' z4 @+ z1 @) Y5 H+ d& \
      sprintf(szTmp,"Set socket option error,error no:%d",::WSAGetLastError());
7 j/ ?, R3 V) z      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);
( @* |2 ?! ]/ g& n( e+ `0 n8 V      DoError();
! m% z: c# _1 t- B& q      return;
8 R+ e9 Y3 C+ _: Z- |8 l, L0 q  \   }
2 s5 N9 y. z$ G}6 i% u, B0 g8 p7 \% D/ V
void __fastcall TListenThread::BindListenSocket()% `: L4 ?4 x, ?: y2 I
{
& O( J. A. f- `# O' P$ g# ~3 n    if(bind(m_Socket,(sockaddr*)&server,sizeof(struct sockaddr_in))){
3 b+ l, S/ `+ x' _/ A      sprintf(szTmp,"Failed to bind socket,error no:%d",::WSAGetLastError());) s/ C; O+ b& x" \+ a
      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);
5 F! `) I. B& x      DoError();" |/ S$ U# n9 m! K: U% g
      return;2 o+ X9 B! M0 j" Y4 K  [5 \
   }
' _( `, z' ]+ l# U3 B0 ?3 E$ v* @
/ s1 ]5 e: x7 q: k6 v& r: \}
% i( a! z" R' z+ g. z3 qvoid __fastcall TListenThread:istenSocket()
4 f% M8 @6 H) q( E4 ?{4 l9 c/ ~7 g- u5 ^- _& o
  if(listen(m_Socket,SOMAXCONN)){
0 {/ `9 v- q' f8 H5 t  R     sprintf(szTmp,"listen error,error no:%d",::WSAGetLastError());
2 b* z: T& ^' Q+ e) e  ?     ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);) _( h) ]% e" Q; w4 R8 p* B
     DoError();: g( Q7 A* s) {; Y6 ^
     return;1 @, R- M" p& L
  }& H* x) }2 x$ \6 K) w+ l& n
  //Determine whether there is any connection
2 X9 [( Q; d. I  FD_ZERO(&FDS);
4 s* E( g+ C( f8 o: Y" ~  FD_SET(m_Socket,&FDS);
/ K" x4 [# e- d2 Z( b4 ~$ j}
3 L: ?% p" m! @1 K/ Gvoid __fastcall TListenThread::Execute()
! U& |3 U% I. K+ o# |+ L{
4 T- U: H9 B! f. g' o   char buf[4096];
, _( I' L. x6 a! f   struct sockaddr_in from; //for UDP2 Y7 \. ^) N2 I* S0 T5 Z
   int nLen=sizeof(from),nSize=0;  //for UDP6 m, d  C& d# r8 t3 B. [+ |& s% ?
   InitSocket();' u, q9 R: F9 a9 M2 X0 m
   CreateListenSocket();) y: h0 n/ g" V, Y7 m/ s
   SetListenSocket();; ]2 }$ G+ Y1 p, F" ~% Z6 G
   BindListenSocket();3 `$ @, }* b* B# T  x
   if(m_Protocol==UDP){  F/ l. K  m& m
      while(!Terminated){' L1 ~9 @; j/ D" o9 ~
         int nSize=recvfrom(m_Socket,buf,4096,0,(struct sockaddr*)&from,&nLen);7 u: G, B+ {; g8 O# H4 @7 D- ]
         if(nSize>0){
1 R" {3 k: _, Y+ D$ c; h( i; b" J            buf[nSize]='\0';: d! n8 }! [* A' s; u; y) @$ o0 g
            PSTNForm->Memo1->Lines->Add("Received Length:"+String(nSize));
1 |* w9 v# x% h' }1 a# C            PSTNForm->Memo1->Lines->Add("Received:"+StrPas(buf));
+ X0 ^. V9 H5 R            ::Sleep(100);* b, x6 g; ~8 h; {) A5 Z% W5 A
            sendto(m_Socket,buf,nSize,0,(struct sockaddr*)&from,sizeof(struct sockaddr_in));
0 W2 j6 w+ i: Q* E- c         }
, _+ ?/ N% l- }" ?3 o4 M         else return;
6 Y1 H8 W- [  m% H! K* C; y
  M# g; A3 @$ C+ k* l8 N      }. M- Y# r) j& D8 N/ E! `8 z8 C
   }$ S& P5 ^5 b" }5 f' D+ U6 G# x
   ListenSocket();- P9 m5 c8 [" @
   struct sockaddr_in client;/ [8 t- n) e' ]# g' {, B( i
   int nLength=sizeof(struct sockaddr_in);
, T6 ?+ o6 M3 t& M   while(!Terminated){
& w. c8 ?; c! D- }& R2 o7 s      int nError=select(1,&FDS,0,0,0);" b+ |5 Y4 Q- Q/ z  {
      if(nError<=0) Terminate();( A! z+ \$ M& E; W
      SOCKET m_AcceptSocket=accept(m_Socket,(struct sockaddr*)&client,&nLength);
5 `5 n0 N4 ]9 ]; V      if(m_AcceptSocket==INVALID_SOCKET){
# w  t* [5 |- V' P6 u         sprintf(szTmp,"Failed to execute accept,error no:%d",::WSAGetLastError());! o) z8 r9 d. }. \6 [) Z
         ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);
$ ?2 y7 U# m7 w- ]5 M* p         DoError();
9 y2 k- `- O1 m0 h0 Y+ F         Terminate();
  o1 o/ I" n* W% T( c: x; l         return;
/ m+ l) H& \9 M. M      }5 s# W$ v$ U- V" ]
      TCommunication *pCThread=new TCommunication(m_AcceptSocket,FALSE);
* t3 e6 b$ q* G1 U. x      pCThread->Terminate();9 c& Q; Y0 i% f* `4 v, ~# j7 v! F* ~
      pCThread->WaitFor();# a$ B, ^2 B& i& G- B
   }' ?; W+ [: o6 u. u
}3 R1 U9 c. i* ~3 i9 L) l
//************************PSTNForm*********************************************//; Y' P) O9 _6 e
__fastcall TPSTNForm::TPSTNForm(TComponent* Owner)
* U, R) L9 v9 t7 g$ M# f   : TForm(Owner)1 {- f: t8 c9 d1 R9 E$ s5 N
{8 i, w8 R0 v( E& S6 H$ V( R5 {1 E
}" z: w2 i  r1 c7 _  D/ F0 d
void __fastcall TPSTNForm::Button1Click(TObject *Sender)
9 |& o+ T5 i7 F. {. G. }' o% r/ h2 T; k' d{
0 S2 [: M4 a0 o1 d6 A   Close();
9 F+ R# E! y, t$ N}
* z/ i, b" @1 [: cvoid __fastcall TPSTNForm::Button2Click(TObject *Sender)
; T1 N0 }9 ^; V9 c{
6 B' _) S$ T3 f5 S9 k5 S9 V   if(pThread){
+ ?$ G$ ?6 X% a3 L      pThread->Suspend();/ A7 ~; q3 V% q0 j, r# M
      pThread->Terminate();" u2 [7 f1 g8 a0 @' G1 X
      delete pThread;
) v, g5 E, b) T8 \9 p8 k0 w      pThread=0;( C& }* X. J4 q
   }3 ^0 q5 Y, d: e' z. Q3 r9 ]6 B
   UINT m_Port;* P& t  f1 R9 ?5 I, I5 Y3 [
   try
3 I9 W( {; ^! w: \4 M   {5 @( t: v3 L$ e, R  z( ^! f) ^
      m_Port=Port->Text.ToInt();
6 ?; @! V, {% X! V- C+ p1 [0 L   }  g# X! `3 _6 p
   catch(Exception &e)- u8 V" {- p' V  n: k
   {" ^/ F9 g2 |; l
      ::MessageBox(0,e.Message.c_str(),"Error",MB_OK+MB_ICONERROR);
. j. H7 X3 m0 O$ x* |; @$ s      return;! Q& C+ m8 q7 ]4 E* ~
   }
- l: ~! D! z" q3 g" e   PROTO m_Protocol;/ p1 I- F8 s3 f! K
   switch(Prot->ItemIndex)
' X& @# `& D- @1 y9 c5 n2 H: V   {& {+ w4 T  y: O$ t) P
      case 0:9 P0 N0 M2 h" f, P2 Z5 v
         m_Protocol=TCP;: ^6 e8 \& j- J8 I1 ~8 U4 x
         break;# \, q, i4 i7 S0 v6 q0 v1 i
      case 1:
" j0 P7 W, p( F% |# Q9 ^         m_Protocol=UDP;
3 `" q' _3 O) U6 [, K         break;2 r: w9 D. B/ P3 T) c) s
      default:
: i8 ~$ _3 F" m( H5 V1 _/ ^# j9 C         break;
! D2 W9 X' V2 ~% ]7 e( m   }
: i' A( P2 C% W9 E   pThread=new TListenThread(m_Protocol,m_Port,FALSE);
  j. O' B, `" c$ T) m9 m3 O   //pThread->Terminate();) P8 Z$ j& {) B0 j: M$ K3 E! z" N
}# \: X9 A4 x# y7 ~! V4 @
void __fastcall TPSTNForm::FormCreate(TObject *Sender)
9 U" G, \1 H& r, W9 C3 w$ d{
8 ~) x5 L- c9 k: s2 X& L   ::SendMessage(Prot->Handle,CB_SETCURSEL,0,1);" q+ p  }: \# V$ j0 |- t* K
}  X) g' ]5 \$ v& n& i- K# H; K0 x

; Z: o- [  N- v8 ?3 P/ z6 ivoid __fastcall TPSTNForm::FormDestroy(TObject *Sender)- W3 D; b9 T; g2 B' U: T. e
{
- J5 P: B' d- x% q# I+ S% Z$ s9 a   if(pThread){6 H- _, `: q- d1 o0 P. s+ l
      pThread->Suspend();2 s5 r  g& I4 I, H" k) d
      pThread->Terminate();}9 o& A8 ?# _, o# u
}
: Z5 v- j3 E1 B6 x' p7 s/ {上面的代码,各位可根据自已的需要和针对自已的应用,在数据处理方面加以改进就可以了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-8-9 01:43 , Processed in 0.035302 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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