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

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

[复制链接]
发表于 2004-2-15 14:01:13 | 显示全部楼层 |阅读模式
在CB中用socket api来写网络通讯程序
( E/ c/ N6 V: I6 y+ g; G9 s) i; ?作者: kingcaiyao ,如转载请保证本文档的完整性,并注明出处。
" W2 O* C0 n3 e: Z1 j% ~欢迎光临 C++ Builder 研究,http://www.ccrun.com/doc/go.asp?id=569
* F$ r7 E, S% A, a+ T* t2 P5 x* q/ V本文转自csdn,作者:kingcaiyao& n" j- M8 C* V6 c9 Z7 z& t1 {
原标题:在C++ Builder中用socket api来写网络通讯程序(同时支持TCP和UDP协议)  C# j% `. x" ]
原文:  http://www.csdn.net/develop/read_article.asp?id=19883
+ B/ f3 e4 d- V# n+ s' u5 \+ P- J6 X1 d: K* |9 L9 n3 P6 |

' n" M! l% Y: N; C, M" X* j& W在7月4日看完sockcomp.pas后,我决定用socket api来写一个客户端和服务器并且同时支持TCP,UDP协议,于是我就去做,现将代码贴出来(已调试通过)7 W6 j* L% C: R5 I/ W
Socket api Client:
$ f& U. b; x- a. k% v2 l' U8 z/ ]
, B4 c/ a$ V  R! S" j#ifndef UDPClientH7 z4 ?9 H1 l1 _, V' b
#define UDPClientH/ f9 p5 d" E; ~4 ?6 R3 H5 o
#include <Classes.hpp>
4 c7 s; `% @7 o8 e3 W#include <Controls.hpp>
1 {8 ]! t* O- X  u1 J. h#include <StdCtrls.hpp>9 \# L3 Z- z0 ?. i
#include <Forms.hpp>8 Y. Q  ]( U2 f- l, g5 p& ~
#include <stdio.h>! K  w2 @2 U2 N/ d, `8 ~
#include "CCEdit.h": ?/ p. n; B' x3 h0 R
#define WM_SOCK WM_USER+100- I; @& R0 O& E3 x8 v  H( K4 E
class TLANForm : public TForm7 I8 z& m6 `  }& @9 {
{' A# w# Y3 t' N) m; D, U
__published: // IDE-managed Components
0 l" y9 x9 T# I1 S( ^   TEdit *Port;
$ d+ F. U. J& m2 q   TLabel *Label1;5 G! v8 \! u1 m$ e) A& ~4 M- _$ ~* ]
   TLabel *Label2;
* O6 C# I* G: @# Y4 W# a) |   TComboBox *Prot;
+ @# J8 K, B( F) m   TButton *Button1;  v  [; ?# B/ \! `& B
   TLabel *Label3;
$ f$ y& Q6 X; s% s0 h! u   TEdit *Addr;7 Y% D7 Q, u+ c; K7 T& Q
   TCCEdit *TxtEdit;
. Y/ n/ ?$ |" `( X3 t   void __fastcall FormCreate(TObject *Sender);+ ?/ U% z% J8 H" u2 p
   void __fastcall Button1Click(TObject *Sender);4 a  q/ a% K8 z
   void __fastcall FormDestroy(TObject *Sender);
# |; a# b! C* j6 tprivate: // User declarations; Q' ?$ h& x  }/ f( f
   void __fastcall OnRecv(TMessage &Message);
" |3 j' m4 G* }9 m; Spublic:  // User declarations  F; J- ~" k9 |; w: @
   __fastcall TLANForm(TComponent* Owner);" e9 x4 G1 i- u8 W) P0 s
   BEGIN_MESSAGE_MAP: f, L3 T. @# m
      VCL_MESSAGE_HANDLER(WM_SOCK,TMessage,OnRecv);
, T3 h! I5 }4 M& P9 i   END_MESSAGE_MAP(TForm);
" O6 q' k' _% Z" [. ?( Q};
+ q1 |. X$ |/ O5 f0 H7 s& q+ ]extern PACKAGE TLANForm *LANForm;) H; X3 x7 k. z: v
#endif, Y$ Q8 y" K+ B7 F# V

) N3 O/ d* {7 z! A& F4 z( K) A) a. g, x2 B+ P/ p: T
.cpp File9 _) ?  c3 h. n) L, T$ `* l

/ `) I" N* q; E& c( }! h#include <vcl.h># @+ S6 c# }$ M/ E( s8 z6 @: S
#pragma hdrstop
3 f* D- L8 l8 H  S#include "UDPClient.h"
7 B) e( k9 Y- K6 r* m#include "WinSock.h"
& B) Y7 q7 ^. I8 f( N  s; D; y#pragma package(smart_init)
8 @$ l, W$ Y: e: q, _. J% w0 w#pragma link "CCEdit"6 p/ f" ]9 f* O3 e" w3 P
#pragma resource "*.dfm"
* ?0 V( }. ^0 Y( t. {7 K& ?TLANForm *LANForm;
' _+ V0 _( x; f! Xenum PROTO {TCP=0,UDP=1};
# l3 M5 S8 R. q% iSOCKET m_Socket=INVALID_SOCKET;
9 @$ e; j9 w- YPROTO m_Protocol=TCP;
6 W; P+ _* Y1 ]__fastcall TLANForm::TLANForm(TComponent* Owner)1 L/ m9 Z2 b6 A' P
   : TForm(Owner)$ ?+ ?* g9 i3 m
{
8 w/ d* [0 [" Z7 b4 _( _- i0 x$ F2 g# c, l/ y% i4 K
}5 v! Y6 }8 T# |7 |, l6 U; u
void __fastcall TLANForm::FormCreate(TObject *Sender)  b! q7 o. w% U8 I# k! A2 B
{
+ y% R  M) @: e% h. U! Y   ::SendMessage(Prot->Handle,CB_SETCURSEL,0,0);
4 i; i2 a  [" T4 g5 `8 u; Q}
7 b6 l8 e1 A7 N  ~9 W2 Fvoid __fastcall TLANForm::OnRecv(TMessage &Message)
# t; w8 T3 P1 G5 y, J{) q3 V! H$ R+ J. e
   char buf[4096];) {) f  l  _; e/ V, ?0 A  b7 ^+ {
   int nLen;& ^$ r8 |. e& [7 e7 b% o
   struct sockaddr_in from;+ {) w- k! h9 _. q2 R
   int nLength=sizeof(struct sockaddr_in);& _9 R* R( U! g% f7 y
   switch(WSAGETSELECTEVENT(Message.LParam))
! Z4 f1 b! I1 X) r# S& H$ ^0 W: ~" B   {5 [" E5 S2 [# k# B3 E9 d
      case FD_READ:
: [% W' a  E, ^# d& g         switch(m_Protocol)% m+ P1 C& j9 n' y
         {9 a2 B: F# z4 S$ v
            case TCP:
, i, n9 w7 f% B' ]/ z. a5 G0 c. w, v5 H               nLen=recv(m_Socket,buf,4096,0);
" M, T; t7 B0 b               if(nLen>0){
2 V5 X9 m7 _+ o/ A                  buf[nLen]='\0';
) |0 V+ @/ K9 E$ `( X& M                  TxtEdit->Text="Received Length:"+String(nLen)+"\r\n"+StrPas(buf);
/ O6 e, z8 |+ X: l               }
, M8 N0 h5 {, t8 Z: c  a3 Z* g" t               break;
0 i+ m5 ?  s. m            case UDP:
2 Q/ P+ _) C$ N& k% J6 w               nLen=recvfrom(m_Socket,buf,4096,0,(struct sockaddr*)&from,&nLength);' F1 U% o3 G" x* D1 y
               if(nLen>0){8 Z2 d6 I' Z) s
                  buf[nLen]='\0';
, C' h5 ^: R+ y0 b5 W                  TxtEdit->Text="Received Length:"+String(nLen)+"\r\n"+StrPas(buf);& k, N" q4 f/ n: ~) q9 Z6 @$ ]: `3 b5 T
               }  H6 u- n- y( l9 i8 A( B
               break;
& Z. h: n6 Y- R         }
! T; G. g( Z7 U/ x* C: S; n         break;
& p! h# w* n% n# Z  O6 ]& z      case FD_CLOSE:& `0 r4 T0 o: f( p! a
         closesocket(m_Socket);
7 G8 ^; U, ~% ?         break;4 F. k0 C4 M, z+ C# ^1 r
   }
9 Y$ I7 s7 H. A& P/ `1 L1 n" e' b}1 m6 L% v, |3 T& ?! V4 X4 G3 n

) A8 e: j/ M$ ?. C3 K! vvoid __fastcall TLANForm::Button1Click(TObject *Sender)
2 j- _) r, d% t7 g% n7 I{0 Y/ F4 U' K( V) o8 K" B
   char szTmp[256],buf[4096];! `% Y$ e7 j4 w$ p8 N) Q& U
   int nSize=0;* ~% p2 F( B8 x" I( J8 ~1 p1 p
   UINT m_Port;
$ [) d" E5 D$ ]- W) f: i( Q   AnsiString addr;
0 ]/ R  _: n7 o' ?  ^. T" B   addr=Addr->Text.Trim();
/ U8 J$ ]0 r" w# j   if(addr.IsEmpty()){# ]$ w9 k0 |0 j) h# @$ z+ E
      ::MessageBox(0,"lease enter the server IP!","Error",MB_OK+MB_ICONERROR);
- A, Q$ f. `0 C      return;
5 O7 m+ t2 Y, S2 C  ^: N( n   }* m+ T/ d7 I9 |) v0 U
   unsigned long nAddr=inet_addr(addr.c_str());$ |( a3 V/ S3 W, ~8 k
   if(nAddr==INADDR_NONE){* Y# m# U; ~; T. q9 R
      ::MessageBox(0,"Bad Internet IP!","Error",MB_OK+MB_ICONERROR);  A4 I0 }8 O+ q  K" _  L
      return;}
: h- I$ s; o/ Z% S! B3 w* _1 E, Z  d, |) ?" S/ A' ^1 r
   try
1 ?3 K1 ]" o1 @+ u6 ~   {
( k, w% P' R/ v# Z/ ]/ s      m_Port=Port->Text.ToInt();  V+ h5 d4 W# i7 n
   }
9 K  L1 ^4 u$ {( e& |% ^+ j   catch(Exception &e)  D( O2 q) I# f5 I5 [* `) M- j% Z
   {
  S# e1 ~" `9 f  m      ::MessageBox(0,e.Message.c_str(),"Error",MB_OK+MB_ICONERROR);
8 i* q0 g2 l) ]. ?1 Y, ^      return;5 [; n# _8 g* B9 I' p6 P6 S
   }8 T, \$ |1 ^' g
   switch(Prot->ItemIndex)
( B7 G+ {) |4 t4 R% b) I   {. ~8 X  O6 y0 H! ?. C: h
      case 0:' m- e5 L3 g7 @1 H
         m_Protocol=TCP;# ?" G8 \- o' U7 R7 e8 F3 {" [
         break;" B" B# O) q6 u7 I  @) D
      case 1:  l/ |, K1 }, |' d
         m_Protocol=UDP;; c$ f% Q2 Q. r0 T
         break;
6 v; M! C# g* W   }  J, h8 ~4 |3 @$ V: g
   if(TxtEdit->Text.IsEmpty()){1 h; X2 J2 \) [% w6 W2 q1 O
      ::MessageBox(0,"lease enter the text you want to send!","Error",MB_OK+MB_ICONERROR);3 y) ^* l4 X9 Y3 A3 I
      return;}7 H9 q5 X6 _. ^6 h, @) a) N- ^
$ }. U, R) v( H. q: K
   //Initialize Winsocket
7 g  b1 f0 U. f. y" A5 w/ r   WSAData wsaData;
8 H; [* a, g; e1 R   ::ZeroMemory(&wsaData,sizeof(WSAData));
7 l( Y: t+ `* a, @, v) E* W   WORD version=MAKEWORD(2,0);5 y: a& |2 e* m  a8 U5 r" j
   if(::WSAStartup(version,&wsaData)){
, C- c1 v( ]4 L/ t/ x6 F      sprintf(szTmp,"Failed to initial winsock enviroment!,error no:%d",::WSAGetLastError());9 J+ X* g" m; I; B3 c
      return;}) p4 @* N% `3 X9 a

! ~* ~& I, o0 u1 S   //Obtain the active connection
9 j2 W! x6 C$ g2 {; W   char ComputerName[255];0 ]* ~) ~; h0 {6 s! w) M3 X* R! J
   gethostname(ComputerName,255);7 r. U3 {. }1 U
   struct hostent* he=gethostbyname(ComputerName);
$ t* e8 Q8 l8 Q3 e2 V& m   if(!he){
, q' O/ b2 u$ g: o5 }1 g/ ^      sprintf(szTmp,"Failed to get information to host!","Error",MB_OK+MB_ICONERROR);! m1 @, W* G+ r1 g
      ::WSACleanup();
$ \* `/ l; Q& O0 S" ]' t! O      return;. b7 N' J% L8 D0 _9 W7 W
   }( A1 A8 I! j3 Y2 f' @* x# N
   //create new socket9 m2 S* Y( N* ~. K
   m_Socket=INVALID_SOCKET;3 h4 l. `% {. q
   switch(m_Protocol), |) x5 e3 {$ b3 k
   {: G* P( K+ W% k2 M/ X
      case TCP:, y* t6 U4 R) h, L
         m_Socket=socket(AF_INET,SOCK_STREAM,0);
% V" T8 {" G/ _. X$ e  P4 u         break;& x, r, ~6 q& C& ]" B4 B. L1 o) V# ^
      case UDP:
; A) G  n- b- D         m_Socket=socket(AF_INET,SOCK_DGRAM,0);2 s. `5 Z* L# B' i/ w% v
         break;" c* q7 p* e) i! L% G
   }
2 y4 h  x6 ~) F$ f   if(m_Socket==INVALID_SOCKET){
, |0 y; D9 `) B$ h) H% X      sprintf(szTmp,"Failed to create a new socket!,error no:%d",::WSAGetLastError());
, u& ^0 E* [% @      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);
4 ^  @2 H& R1 U! t* y; G9 }( {; S      ::WSACleanup();
+ B: h/ t& \0 Y- y      return;7 X9 l9 r4 e: j. ]0 y$ b8 {) p# \$ ~
   }
: t7 {1 E/ A6 V) e- W- D   //bind socket3 p& o- X# E! [& M) E
   struct sockaddr_in client;
. M) o! Q; B7 b2 O/ Y, R7 R   unsigned long nClient;
3 `+ [. x- Q* t+ n0 `) e  h   memcpy(&nClient,he->h_addr_list[0],sizeof(int));3 Z2 i6 p1 _; ]* i; D4 t2 d( \
   if(nClient==INADDR_NONE){& ~1 {8 i+ K8 P! q/ `
      sprintf(szTmp,"Failed to obtain the local machine's IP!","Error",MB_OK+MB_ICONERROR);
) j1 l  |' S) P      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);& S, j, _6 d! P
      closesocket(m_Socket);! [# N4 c. s7 m+ a' q9 ~
      ::WSACleanup();
+ ^) x+ u( a2 T. |' g, ~' {      return;
9 [0 @& E4 G5 }4 I" D. i   }- m& ?1 N0 ]- O, U
   client.sin_family=AF_INET;! \- c0 c  M5 M4 F; n( c( P) G8 o
   client.sin_port=0;. D+ y/ }' m/ ?
   client.sin_addr.S_un.S_addr=(int)nClient;
% h5 f$ g2 @. y6 c   if(bind(m_Socket,(struct sockaddr*)&client,sizeof(struct sockaddr))){
2 t- B  H3 J1 L0 d0 P      sprintf(szTmp,"Failed to bind socket!","Error",MB_OK+MB_ICONERROR);, M; U) o1 J! \1 o+ T! T/ I4 D
      closesocket(m_Socket);0 y, Z5 x  Y6 H/ C
      ::WSACleanup();
. ?; j- @' H4 b, Q' Q( ?1 t      return;}/ E  A' w% ]7 B, R5 F
   //connect socket
. q0 _% |9 O" [! _8 E' y8 S. E. N. j   struct sockaddr_in To;  X# d0 G8 l( l8 x! _
   To.sin_family=AF_INET;
: d- {8 l# v$ W) R   To.sin_port=htons(m_Port);
0 M9 d2 L# X8 O1 i7 ?% B0 M   To.sin_addr.S_un.S_addr=(int)nAddr;3 C, p3 K$ F1 H4 ^- P
   fd_set FDSET;2 E" W- {- m- \2 r6 s5 G
   FD_ZERO(&FDSET);
# H6 B$ |6 H/ ?+ u5 n! E, Y+ a   FD_SET(m_Socket,&FDSET);  d, l: f2 f$ `6 H% s5 A3 e7 Q: R) N

2 w4 p8 E% ]5 I/ e! L
( x8 X9 I# P' k& h8 C+ y   if(m_Protocol==TCP){
8 D. X' ]6 D0 X# t6 }6 [: Q- |      if(connect(m_Socket,(struct sockaddr*)&To,sizeof(struct sockaddr))){  }2 u" }7 T) N( |/ e
         sprintf(szTmp,"Failed to connect the object!,error no:%d",::WSAGetLastError());$ L# Q! y7 {* \5 C0 O5 ]/ q6 ~9 a) g
         ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);
! W. O0 o0 C$ C4 ?) W5 |         closesocket(m_Socket);
. P( C& P% \( ]# m5 p( A( i         ::WSACleanup();/ A! Y' V0 f. H( @% v
         return;
4 }9 G: u9 C' \# {: g! E      }6 Y0 x, [# G# M9 G1 K  V
      int nError=select(1,0,&FDSET,0,0);' U% k4 i4 P5 Y, D6 `& T: w
      if(nError<=0){
: o. R2 i! G! M4 h      sprintf(szTmp,"Failed to select socket!,error no:%d",::WSAGetLastError());
+ ~/ B+ p: D# @! J      closesocket(m_Socket);
7 ]/ H& q8 r, {3 T- y' j& Y      ::WSACleanup();! s% |9 W5 _7 p
      return;}
- V+ ~4 k$ G7 _2 s5 {   }
5 R) K8 w$ i3 j$ n6 b: y   //Send data
; {) f! d' Q5 z! ?3 o/ i6 |- {   int nLen=TxtEdit->Text.Length();( m7 }) ?  Z# m8 }
   if(nLen>4096){$ q6 u+ D0 Y( i5 ?+ n& V+ E* e
      sprintf(szTmp,"The buffer is too size to send,it shoud not be more than 4096 bytes!");
. g3 J, j% X  c$ J( U6 s, \( r4 p4 M      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);3 t; B3 ~; Z. p2 e- C! M, Y0 k  ^
      closesocket(m_Socket);
; K5 f+ M- o. Q% `. |# ^& l5 H3 N      ::WSACleanup();
7 l+ V7 J5 u2 O; [      return;. G3 Q" e& d! m% h
   }- {) {( t5 I" d2 g
   strncpy(buf,TxtEdit->Text.c_str(),nLen);/ _4 s: ], ~7 F
   switch(m_Protocol)  \7 }3 {' F6 Y
   {- Y0 ^1 F& R1 v# Y6 B. g
      case TCP:" c5 I4 i3 F0 B2 `6 O( \- i# t
         nSize=send(m_Socket,buf,nLen,0);8 n3 j6 u9 F4 Z0 `- l+ Z
         //ShowMessage(nSize);) C. y) r8 Z. C$ [# Z0 W
         break;( v1 v9 u) B9 R3 \& n  \4 W7 X. l
      case UDP:" s* n, q5 J8 b- O/ I
         nSize=sendto(m_Socket,buf,nLen,0,(struct sockaddr*)&To,sizeof(struct sockaddr));
4 {, T' x* Y  U% |: N         //ShowMessage(nSize);
7 b& _( l. r: g         break;( D! [; r. J* L* k
: m0 T/ ?) ~( r" j
   }
1 b# p- M4 _  `/ {9 R/ P   if(::WSAAsyncSelect(m_Socket,Handle,WM_SOCK,FD_READ|FD_CLOSE)){1 C- ^% D( F7 F
      sprintf(szTmp,"Failed to register socket event!,error no:%d",::WSAGetLastError());2 Z0 c5 a/ V- S" x
      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);
$ J7 U- }9 O4 }. q4 o      closesocket(m_Socket);
) ]5 p" T! M$ o: y$ z2 {      ::WSACleanup();
" O8 D2 ], P  \8 d      return;}. F2 T9 m. T7 e( D
}! V) V3 z. f; }+ A1 x5 f
void __fastcall TLANForm::FormDestroy(TObject *Sender)+ W: j  K2 k) B# S
{
: a2 A) x( M' F' X' V1 F3 ~  X   closesocket(m_Socket);
1 x& C$ x$ C) w, {- P. m  j+ w   ::WSACleanup();
5 U8 D" o. U! i  ^}$ e5 i% S. L& Y% M- k( T5 u' @' r1 {

" k9 S3 z9 R( F% H9 M2 z- k7 h9 `9 bSocket api Server:
4 X- [& Q% k( h2 W' h4 B% p.h File
. G5 T5 A: ^: q+ ~" y) R#ifndef UDPServerH5 T6 i* h' p" \$ H
#define UDPServerH
8 A( a4 N. V; h7 X#include <Classes.hpp># ?2 q, j2 w4 N2 A+ v3 y
#include <Controls.hpp>! }( P: H$ m. e! b" [
#include <StdCtrls.hpp>
6 y. f+ [0 H, o. T" M* l#include <Forms.hpp>
+ s/ L9 q: t* x2 N2 I#include <stdio.h>6 o9 ~9 Z* v- a+ r9 K5 G$ J
#include "WinSock.h") h; U9 w8 h; E9 J" ?3 P! J
/*#define WM_SOCKET WM_USER+1000
1 C/ `- k. m1 G5 I% ~/ j! g#define INITSOCKETSUCCESS 0
9 R  u8 E; B4 p) B2 K#define INITSOCKETFAILURE 1
4 l2 n4 ~+ k) l: h, Q4 B#define CREATELISTENSOCKETSUCCESS 2
$ Q2 w8 y5 {( j7 ~1 H' A& |0 h#define CREATELISTENSOCKETFAILURE 3
+ q" y; ]0 ]$ H. K% k4 T#define SETLISTENSOCKETSUCCESS 43 l2 s; W9 e3 e% i9 P) R
#define SETLISTENSOCKETFAILURE 5
0 e0 Q, v3 `$ ?* E. U& E7 s#define BINDLISTENSOCKETSUCCESS 6
& V" m7 v0 ^2 ^  i5 k3 w: a  ~#define BINDLISTENSOCKETFAILURE 75 L" U+ n! z8 e2 g! E3 {3 {
#define LISTENSOCKETSUCCESS 8
9 B5 W, G' g* G: [$ @0 v- P#define LISTENSOCKETFAILURE 9' I0 D% c  g- q0 w& S
#define ACCEPTSOCKETSUCCESS 10
$ \8 ]; J+ Q' Z/ _#define ACCEPTSOCKETFAILURE 11
# y0 H, X8 j. I) f*/0 f& F# |( A; b3 t0 N
class TPSTNForm : public TForm
( v0 `; J2 |! E' g/ S. `{( Z: h* X! m1 g# D# h0 l( D: Y% v
__published: // IDE-managed Components
. X6 s$ P  E  E7 d; h2 T   TEdit *Port;+ `1 T# k) ~) P! i+ x, `
   TLabel *Label1;
. c9 P4 J/ s- B/ p; I   TMemo *Memo1;
% T, b% I4 N" T+ X6 i7 d+ O% T   TButton *Button1;2 W6 ]4 ?6 V% X& ~8 r; {
   TButton *Button2;6 A4 I1 s$ R1 c5 F1 p3 \" Q
   TLabel *Label2;
- d# b" ~7 W* D: I   TComboBox *Prot;5 f( C8 \6 |* V5 M+ f
   void __fastcall Button1Click(TObject *Sender);8 j: z& ?/ t. U
   void __fastcall Button2Click(TObject *Sender);
/ h1 a0 x6 l7 \! n  U   void __fastcall FormCreate(TObject *Sender);. `9 ~* ~4 o- p; Z! l) M% Q! O
   void __fastcall FormDestroy(TObject *Sender);, H. n( {- G6 ]: K1 Z" B, s8 C# M1 O
private: // User declarations
4 g( t2 E  T$ V) z1 N5 T# _5 zpublic:  // User declarations
$ f/ y# }) ~' d6 k4 L   __fastcall TPSTNForm(TComponent* Owner);$ x  P1 Q2 |/ e) L  F) Q
};! H3 @! F% m5 l: f  Z( U. ]  k* p
enum PROTO {TCP,UDP};
/ @- I  u; i$ Sclass TCommunication:public TThread    //Communication Thread0 b# G* i9 T1 G* s
{
) c+ ^: x3 P2 C& j. G& Zprivate:
" g7 M- V1 H! k7 F) y* K   SOCKET m_AcceptSocket;0 W- [0 y  V3 Q3 Z' M, O
   char szTmp[256];//ERROR MESSAGE
: o  f' `" i* R% fpublic:7 |+ \% D6 v6 }% M
   __fastcall TCommunication(SOCKET m_Socket,bool CreateSuspended);
5 n& g1 k! i* G1 Z  c4 N4 P3 M   __fastcall ~TCommunication();
% B$ h- _- D+ ^# ], `protected:
0 [3 j% y0 P7 ]2 N. i+ r; n   virtual void __fastcall Execute();
+ I4 ~0 b' M' }, ~. F: m};+ ^- B# i7 @8 u( \
class TListenThread:public TThread //Listen Thread5 Y4 ]% B" ]! O/ b3 ^1 ~
{
1 [* Z; z: K  h/ Jprivate:& t# l: U! _$ O
   WSAData wsaData;2 T7 p% e# N/ v* o# ]! w0 e
   struct sockaddr_in server;7 B. Q7 @  d- ?1 S% _- F# d
   fd_set FDS;
, k6 _( h7 p/ H* M1 V8 y   UINT m_Port;
3 Y2 ?& J. o1 `4 L   PROTO m_Protocol;- ~( ~  ~  Q6 W+ Y
   char szTmp[256];//Error Message
4 v6 [& x2 _  V: x& N, G5 Mpublic:9 B/ E- l" e& q1 Z0 h5 o* D
   SOCKET m_Socket;* Q. V" t# I) P- A, }  J" _
   void __fastcall DoError();. v) g) p  C! a2 [& x3 m! K4 B7 h
   void __fastcall InitSocket();
, E5 ]8 v$ e  x$ a% c0 a* {5 Y   void __fastcall CreateListenSocket();
6 j) L" y7 ^! x% [: T6 Y   void __fastcall SetListenSocket();
  J. I1 t2 o& j  y   void __fastcall BindListenSocket();  k- z  m) H: |
   void __fastcall ListenSocket();5 D( p! t) Z" z# _

# S6 f6 _; i5 q- V! i; C* spublic:/ k( \' k; a: u6 M1 g8 Q
   __fastcall TListenThread(PROTO m_ProtocolA,UINT m_PortA,bool CreateSuspended);8 m3 Z- e% J( a4 w6 w
   virtual __fastcall ~TListenThread();0 p, J! d& S7 u7 w! y$ j0 n# o. U0 p
protected:
* R' }% e; Q4 z' ?   virtual void __fastcall Execute();$ f1 ~$ F% H3 ]  p+ V
};1 X+ w, W. V$ m, E1 F: N
extern PACKAGE TPSTNForm *PSTNForm;
: g( V! j( M$ U9 Q" t#endif1 U' Y7 Y! b- x7 K! O
.cpp File
: p( s" v& }  \  S5 v9 Z#include <vcl.h>
$ g% c% X1 u  {( W#pragma hdrstop2 M6 O- Y( @. L/ ]! z) F! D
#include "UDPServer.h"
; e" G+ {! t8 O' e4 n2 j: a#pragma package(smart_init); Y2 j  l" W( m# Z' I- ^. p
#pragma resource "*.dfm"4 y  ]: M8 c" ]# {" J
TPSTNForm *PSTNForm;; ^+ B4 V6 Z/ h9 d  E9 b7 v
TListenThread *pThread=0;0 l% h! v" R6 K4 B5 w
//******************************CLASS TCommunication For TCP****************************************************& |0 u# U- ~, v
__fastcall TCommunication::TCommunication(SOCKET m_Socket,bool CreateSuspended):TThread(FALSE)
8 Z/ d# [6 Y+ U7 U{
* g8 ^, [8 X9 \   m_AcceptSocket=m_Socket;4 W2 g# ]; s1 Y3 ]3 H
   szTmp[0]='\0';
5 l& x( G" V0 j! E6 j   FreeOnTerminate=true;
7 V* q, v& }5 F$ O) z2 h. P7 Y# E}
5 E+ n% H4 A7 P: Q5 h: A0 H__fastcall TCommunication::~TCommunication()* `0 B0 N& @% f0 m
{
. Q3 o8 _6 |* \- j" l! s  // closesocket(m_AcceptSocket);
& I! [3 h; A# j6 m3 Q}
# \* d& L! n, G1 E% X$ b' Mvoid __fastcall TCommunication::Execute()
1 @* s3 D% ~! F7 A  l{
5 y) o; m1 L$ r   char buf[4096];: m. w4 v: G7 {/ _1 v! m
   int nSize=0;6 K* E( w4 z/ ]! P! U
   nSize=recv(m_AcceptSocket,(char FAR*)buf,4096,0);5 L$ C3 f4 ^- J, C  C$ z) _9 V
   if(nSize>0)
0 H5 R8 {1 ]  T, h0 j3 W   {) O2 e7 f% ?9 J
      buf[nSize]='\0';
2 w( ~+ W: S' R. l      //Display$ @* t- N. t+ s+ e
      PSTNForm->Memo1->Lines->Add("Received Length:"+String(nSize));5 d/ W$ o7 O( d3 T! i# Q
      PSTNForm->Memo1->Lines->Add("Received:"+StrPas(buf));
8 }$ x/ J: g# r- a' J! R      //Deliver
4 ^- C! L$ Q" e      ::Sleep(100);1 X7 G  Y3 F) ~( m/ \: I/ ~, d5 l
      send(m_AcceptSocket,buf,nSize,0);
/ [% ?5 h6 \' }+ H+ d7 f1 m8 i- H   }
: u0 r' a$ {, p) @& t. Z
. B! A+ Z! N6 Y7 c! v}, I4 J* f, Z) g" r
//******************************CLASS TListenThread*****************************************************
$ y& @5 }. L: W5 c% P__fastcall TListenThread::TListenThread(PROTO m_ProtocolA,UINT m_PortA,bool CreateSuspended):TThread(FALSE)
/ U- A. f9 o7 v" Z4 V1 |/ A; |& Q' S{" U* m  K. `1 s: n4 s! ]
   m_Socket=INVALID_SOCKET;+ ?6 C: O9 W6 e; V9 N. {5 Q
   m_Port=m_PortA;% D# V: ~) O: l& ?" C
   m_Protocol=m_ProtocolA;
0 v8 \, S9 ?: k% i   szTmp[0]='\0';: H0 p8 r4 l) ^
   ::ZeroMemory(&wsaData,sizeof(WSAData));
2 [6 O0 t3 b! t; y  e   ::ZeroMemory(&server,sizeof(struct sockaddr_in));
0 a" E" _$ k5 o4 T' b9 y5 a   FreeOnTerminate=TRUE;//Automatically delete while terminating.( v/ h$ D- s) G( K  [
}
6 R( t: J" H, C' U# z__fastcall TListenThread::~TListenThread()2 N% f4 J4 X9 f% ]! J+ ?# f% z
{' R6 q- \, K+ h' e$ A# s
   closesocket(m_Socket);; g5 X. h+ l, Y* v) o2 p
   ::WSACleanup();4 U8 O/ U* |6 R7 ?& X  a: c# B
   m_Socket=INVALID_SOCKET;  ^, n1 B5 E6 E7 S6 E
   m_Port=0;) z0 W6 z% ?$ P
   m_Protocol=TCP;
2 B* M3 C$ h; G   szTmp[0]='\0';( |$ O. k0 v' D# j; N% Z
   ::ZeroMemory(&wsaData,sizeof(WSAData));$ }. T5 E2 p" U. W/ N- L
   ::ZeroMemory(&server,sizeof(struct sockaddr_in));. H* O: z% L: L
}
! i! \$ c9 a; _# M. u( d; f; Kvoid __fastcall TListenThread:oError()
! b5 k' u' V2 M2 m$ A{
% w, N+ K; q% u0 M. R   if(m_Socket!=INVALID_SOCKET) closesocket(m_Socket);% Q0 G; _  X, i6 t4 f, L- g
   WSACleanup();3 t, {& f" ^0 _& E! R; B
   return;
3 j( O2 F7 P6 p( j1 e}
7 F9 J6 J/ O  {7 f6 qvoid __fastcall TListenThread::InitSocket()
( m- P! b. `3 ?6 k- X9 @{, I/ X2 p% l# L: R: ~, ~
   WORD version=MAKEWORD(2,0);
/ z+ O# y* u; x. q3 @   if(::WSAStartup(version,&wsaData)){: v) ]" b/ @! F
      sprintf(szTmp,"Failed to intiailize socket,error no:%d",::WSAGetLastError());/ `3 p, O6 L! c
      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);
+ d0 W; X/ z9 P6 W  V3 ~5 k+ k4 R$ z      DoError();) U9 c* X- Y4 J
      return;
/ r9 A- c) e" x. [8 Q) X. ^   }0 |& c4 T$ U. f, A  I
}
" y, ?+ P+ ?) N% u# ~, K6 r# bvoid __fastcall TListenThread::CreateListenSocket()
- w7 J" s' [% m# n5 ~: u{
+ c! W/ ~6 b% [$ `5 |; Y) Z   switch(m_Protocol)
2 K. l$ M% a7 A+ e( Y# U/ w   {$ J( @* {6 Q8 r% }# ]3 q
      case UDP:
+ b) Z+ y( z2 V: r% W         m_Socket=socket(AF_INET,SOCK_DGRAM,0);
+ q+ p% l$ M' e6 d8 I         break;4 l$ r3 R7 ~* `* Z
      case TCP:
! [2 }' |* X& A         m_Socket=socket(AF_INET,SOCK_STREAM,0);
+ u  ~; A. X0 Z" i- b3 P# p         break;# m* y+ A7 y! L5 v
      default:- o, o( s* M0 |/ @+ f
         sprintf(szTmp,"Error protocol!");
" S2 g# y: Z* B, S4 @$ K( ^         ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);
7 D7 J0 s2 ?, I1 }1 r' B         DoError();
4 I  |. K* f0 c( j8 c. w6 D9 F. g3 E         break;/ C0 c) L2 h! }) C
   }
3 Q+ M. {+ `  X0 C  D" U   if(m_Socket==INVALID_SOCKET){) b3 D0 u7 _0 K* [" ]# D0 p" t( \1 O
      sprintf(szTmp,"Failed to create socket!");/ ~! u, r$ |: E
      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);0 U6 O5 h0 z! H) G3 C7 C! @
      DoError();8 X4 T7 o' K! P* t
      return;% D+ C9 q# J/ ^4 {5 s4 i
   }
& ?9 W# k$ g; c" _& N( K1 R% c}
% m: C( U9 d6 P; }# C5 Zvoid __fastcall TListenThread::SetListenSocket()
* B* M) W; J. p! V6 D* S8 F* w{, t" W3 X' [9 a7 \) }- F  C& g
   server.sin_family=AF_INET;8 g5 D& g3 ~# D5 q* B! F
   server.sin_port=htons(m_Port);( k4 ~, g, y& f" {/ T/ q
   server.sin_addr.S_un.S_addr=INADDR_ANY;' Z: h( _8 n% c+ r3 j, x4 g5 ^' J; r
   int NewOpenType=SO_SYNCHRONOUS_NONALERT;
, j- q1 j- v; B2 L  o# [   if(setsockopt(INVALID_SOCKET,SOL_SOCKET,SO_OPENTYPE,(char*)&NewOpenType,4)){
8 A8 q: o0 _, I% ~& u7 p% m: v7 d      sprintf(szTmp,"Set socket option error,error no:%d",::WSAGetLastError());
/ X* @  I, ~, Z; a1 N      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);1 s* X. F% r. `# ^" L+ h1 L2 y! c% u
      DoError();$ R2 U3 u! W% e& K: b/ `  ?
      return;8 R4 Z3 ]$ e9 m; _
   }
7 S# M& M, B: r* m: P9 e}
' Z) Z1 Z1 M9 t( ]" l, ^4 j$ Rvoid __fastcall TListenThread::BindListenSocket()  C8 @5 [$ M" h, a
{  \% B0 Q! f6 K% X1 N* y, z4 H
    if(bind(m_Socket,(sockaddr*)&server,sizeof(struct sockaddr_in))){. E& T+ Q2 w+ c* m4 d
      sprintf(szTmp,"Failed to bind socket,error no:%d",::WSAGetLastError());
2 m% F* o3 l3 x: C& {      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);
( Y! @  H9 w5 y, g, d: S+ q8 c      DoError();, j* J  K: b8 h: l* k/ E  G- \0 M4 U
      return;, {1 w9 M! c, T! h7 Y
   }+ t3 {' s9 F$ O+ A

* \" b5 a, S5 I2 d}
" {& U% s3 K9 l( F; @% ~void __fastcall TListenThread:istenSocket()* ?/ l- m) J" ]9 w
{* @2 I  j& }* r; l
  if(listen(m_Socket,SOMAXCONN)){" K& w6 h1 p- L3 H
     sprintf(szTmp,"listen error,error no:%d",::WSAGetLastError());- J/ H; J7 B2 t9 h6 _# }& Y: L6 U
     ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);
+ k; Y% Y% y* c% C, `/ X     DoError();
- E# o& u( X2 `. x0 n     return;; Z1 R4 z5 Q$ _/ ~
  }
( V) K. r7 t. H: L  ^  //Determine whether there is any connection
% Q4 q) _+ k# M; y3 Q  FD_ZERO(&FDS);
. d. s0 g: y5 ^0 F, r( p) M7 P  FD_SET(m_Socket,&FDS);
+ R9 ], l( r8 F% u  F' r# j9 O3 i}
9 g& F3 d/ O9 bvoid __fastcall TListenThread::Execute()! l0 e, b, X1 W) s
{
, d/ v1 L! S6 y, V, T* j& j   char buf[4096];' W# n; e+ h' k0 u
   struct sockaddr_in from; //for UDP
$ u0 G9 h) O" ~$ x5 g! K   int nLen=sizeof(from),nSize=0;  //for UDP. g$ u" _/ F1 t) C
   InitSocket();
) G5 G: w' T" Y/ l- u- W   CreateListenSocket();
6 O: j9 Z4 d0 x2 G   SetListenSocket();4 Q. P9 `$ G7 ~3 T# i# j& N' O" l
   BindListenSocket();
1 T6 N' P7 S( L   if(m_Protocol==UDP){
2 v. V4 N' E& f/ G9 _8 B      while(!Terminated){; a, y0 E& g1 Y" e9 D
         int nSize=recvfrom(m_Socket,buf,4096,0,(struct sockaddr*)&from,&nLen);0 y) X3 P/ {; w% U7 X0 K
         if(nSize>0){
; O9 y; m, k" X6 ?            buf[nSize]='\0';
1 }% h) G" m) q+ t+ S0 O0 Q            PSTNForm->Memo1->Lines->Add("Received Length:"+String(nSize));
. I6 Z+ i, O9 ?, r            PSTNForm->Memo1->Lines->Add("Received:"+StrPas(buf));
" b/ S. A) C" `3 f) R            ::Sleep(100);. Y2 U) N7 ^) [/ g7 g% l
            sendto(m_Socket,buf,nSize,0,(struct sockaddr*)&from,sizeof(struct sockaddr_in));
+ M5 f. h# p, Q6 R" e, n         }$ A/ t* k0 {. q* n8 P+ |; T
         else return;; e% h" i$ j& y  O* Y# d! M* ?
8 s/ Y0 M  Z" X
      }- _7 n) l; {$ z" j1 J! c
   }0 Z! H, Z% H" `. D0 e
   ListenSocket();
3 N; R4 q8 ~2 e) P3 q. o/ u. ?  ^   struct sockaddr_in client;
8 e" {$ p, ?  j5 O) R/ [2 d4 G. Q4 b   int nLength=sizeof(struct sockaddr_in);
- b6 J0 w4 X' `   while(!Terminated){
& x- N3 \% ]- Q. r! ~% @% T/ N      int nError=select(1,&FDS,0,0,0);. u3 G3 R" R2 t! v9 r
      if(nError<=0) Terminate();& l6 h7 o  N( c3 C
      SOCKET m_AcceptSocket=accept(m_Socket,(struct sockaddr*)&client,&nLength);/ A% E4 ]2 P, E1 I$ d: n
      if(m_AcceptSocket==INVALID_SOCKET){* T% ~3 X4 K% }1 T5 ~
         sprintf(szTmp,"Failed to execute accept,error no:%d",::WSAGetLastError());
8 z' \! h; g" [( U         ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);
, V; r( g/ H' F) _. {/ G* S# F         DoError();" d& _% B* z+ m6 a# w
         Terminate();& v( S3 Z1 P, F7 i) N" ~, H
         return;! T9 O) E( C% `: g
      }
6 |4 C- i2 u$ n  Z, H3 r" Y# B      TCommunication *pCThread=new TCommunication(m_AcceptSocket,FALSE);, w; P8 K) R) `
      pCThread->Terminate();$ R5 E, j( h  W* G
      pCThread->WaitFor();7 d- s5 N3 B  m- V0 l  c2 Y
   }
$ P" {# S3 K6 i( F}: b: i4 C8 E* {
//************************PSTNForm*********************************************//1 v- O3 P. {% M3 H& l; g
__fastcall TPSTNForm::TPSTNForm(TComponent* Owner)
) g1 P% i; C0 i, U% E+ i   : TForm(Owner)
4 v) I8 D4 [5 v% U5 ~{% r5 L6 w3 W" Y  v* H1 `( A+ M
}/ d5 H# @2 n, u, `% b- h$ i
void __fastcall TPSTNForm::Button1Click(TObject *Sender)0 R  z2 F( P* G, Q3 G3 `
{
& {+ I7 L9 R& d; D8 X   Close();4 `% ^& o# m6 d2 @7 M  j  e6 Q1 B
}% M1 n& D$ G& F9 Y; T. g* t
void __fastcall TPSTNForm::Button2Click(TObject *Sender)
& N3 S* m5 m3 ~, T) r{
& }1 c& q4 D# K" p. D! c( G1 j. G   if(pThread){2 d5 p+ |) ?/ B' s8 R
      pThread->Suspend();
6 w/ B1 X9 p. ^4 X/ D9 d2 `      pThread->Terminate();
- d, R& Q% C9 V7 _4 O) M, U      delete pThread;8 ?% v$ @: x% U, I, k* l1 J
      pThread=0;
6 g  V; K" Z  N4 f; p. N1 H   }/ B# O7 m$ j" j/ y
   UINT m_Port;
- f; l3 e  q. ^; F9 ]6 c+ C- {5 P3 ^   try8 F2 O# k! Y  f, ]; q& L7 M: L9 \( z
   {, P5 N0 x) d8 ~8 L
      m_Port=Port->Text.ToInt();
& g) U# e3 d; T6 r$ g' s% ?   }
# T& z# {$ @8 F: Z' q0 w   catch(Exception &e)* H/ @- J" I3 e$ J7 W- u3 c
   {
2 R5 b- Z+ D  I( F7 e) c      ::MessageBox(0,e.Message.c_str(),"Error",MB_OK+MB_ICONERROR);/ G! `4 m- a) ~9 j- e) l, I
      return;
# S9 \6 z1 _5 a& a2 h. s   }; ~& v# i% {& b  I
   PROTO m_Protocol;
7 H! V! [# l1 x6 t0 F   switch(Prot->ItemIndex)0 [" m" C8 k+ d# z( T3 d( G' j# W
   {
, i6 i+ [) I( a( f. |! r8 W) F      case 0:
3 F9 ?6 ?8 ~* t! k, Y8 o         m_Protocol=TCP;8 o% H/ j; _6 w( v7 i' O
         break;
7 [, A4 L7 n( W. i      case 1:
2 r" B- y" |7 {8 ?( n         m_Protocol=UDP;& r8 ]3 I8 C0 T; z' ~
         break;
, }5 U! ?8 G: t1 ^& u      default:* r0 d* h' N0 ?0 P/ Q
         break;
4 l7 C! c( D; t; P1 A   }. R% W' d) y& l, Y" `: [5 R
   pThread=new TListenThread(m_Protocol,m_Port,FALSE);- x; ]9 X1 C  X; Q
   //pThread->Terminate();
0 I: E* L& q5 a% B( u5 `* [" O}
% Y6 d9 [0 e# f+ Y" y& K; ~void __fastcall TPSTNForm::FormCreate(TObject *Sender)0 c. ^7 {- [8 H  r4 D. t
{. B& V1 N. H- A( R
   ::SendMessage(Prot->Handle,CB_SETCURSEL,0,1);! @# O! N# @  K) b2 J' V
}
4 o( x3 g8 a; N/ h. l! }# G
% ~) i5 H' H5 @9 u7 |- k4 F& U% wvoid __fastcall TPSTNForm::FormDestroy(TObject *Sender)5 {3 H- v3 T. ?  `% A' {
{
8 j- s% u6 l' }4 T& u5 n   if(pThread){
' n7 T# }: e: H      pThread->Suspend();
7 P7 ^+ e$ J( o  W( E      pThread->Terminate();}% k( Y+ S+ V- N2 `. h3 n0 O
}5 s, o- h9 Y, L$ G# D" R2 U
上面的代码,各位可根据自已的需要和针对自已的应用,在数据处理方面加以改进就可以了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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