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

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

[复制链接]
发表于 2004-2-15 14:01:13 | 显示全部楼层 |阅读模式
在CB中用socket api来写网络通讯程序
+ ?3 _% I7 u- O- L: C作者: kingcaiyao ,如转载请保证本文档的完整性,并注明出处。+ |, Q9 b2 O3 ~2 B
欢迎光临 C++ Builder 研究,http://www.ccrun.com/doc/go.asp?id=569  B% o$ \" [8 }  c
本文转自csdn,作者:kingcaiyao& D* w( L. r4 T0 I4 J( M$ n; A2 ]
原标题:在C++ Builder中用socket api来写网络通讯程序(同时支持TCP和UDP协议)
" E# {4 O4 F: b6 f( e7 H+ {% R2 x5 m8 p原文:  http://www.csdn.net/develop/read_article.asp?id=198838 @* b7 c1 `& \$ {$ z
- t5 o2 b9 l  s
" y. c: h/ n" l/ S" u# E0 [4 ^! j
在7月4日看完sockcomp.pas后,我决定用socket api来写一个客户端和服务器并且同时支持TCP,UDP协议,于是我就去做,现将代码贴出来(已调试通过)
2 f  M1 {: x$ a5 @. C. ^* XSocket api Client:
0 ^- X6 J. ?7 @+ Q$ k# H% b* ?9 \
#ifndef UDPClientH+ P  o8 I6 B& x5 p' E
#define UDPClientH
4 A* V; B1 R7 f1 n4 c  y3 k7 v. }+ Y#include <Classes.hpp>
7 s  Y: k& }  E- B) s; B0 ^! \#include <Controls.hpp>
" K# I8 s. j) f3 V#include <StdCtrls.hpp>3 Z  I. H: r1 v
#include <Forms.hpp>( |- \0 p1 Y6 J3 T/ H& v
#include <stdio.h>
0 y0 a7 |) _$ [. O+ [#include "CCEdit.h") h$ b/ F# u- x$ \- E: b. ?
#define WM_SOCK WM_USER+1006 [: i0 v4 Q3 p. n5 R$ o+ F6 P4 f
class TLANForm : public TForm
6 c8 W6 h' e1 ~% G4 s- n{
7 l' h( T; y, k( F# f6 a__published: // IDE-managed Components
% Z6 j9 V: Q' \   TEdit *Port;
5 ]( z  |- F$ D, |, J/ D. H   TLabel *Label1;' A) X6 h: V% a7 r
   TLabel *Label2;
  c  o: I8 m  l" P* F, K   TComboBox *Prot;
, x; Q* S$ b% z9 W% E+ M% N- L4 _   TButton *Button1;7 W/ s3 L! D& O8 g$ k/ i# V9 N
   TLabel *Label3;
, s* @, H7 y8 s/ [* H, z   TEdit *Addr;4 h+ M4 j0 E/ X6 Z* Z" g8 Z
   TCCEdit *TxtEdit;
9 l8 ^  M. i. Q; X, j   void __fastcall FormCreate(TObject *Sender);$ T* g0 a- R& J: v1 i% s, L7 n& u  E
   void __fastcall Button1Click(TObject *Sender);$ Z: Z% l; `$ w0 n* U! o- W
   void __fastcall FormDestroy(TObject *Sender);. I- X! B5 K$ L1 C  X2 q0 K# q; m
private: // User declarations0 u5 \# B* P* U6 S8 l* q! H
   void __fastcall OnRecv(TMessage &Message);# W# Z  n1 p# ^
public:  // User declarations% ^. \" E1 ]4 n. e) G
   __fastcall TLANForm(TComponent* Owner);5 [. T4 I) ~# U# a( d5 R/ u, [- l4 k
   BEGIN_MESSAGE_MAP, w3 t) s4 i2 [* a$ M/ e8 \
      VCL_MESSAGE_HANDLER(WM_SOCK,TMessage,OnRecv);
( k3 i) Q3 J0 D5 K0 ]+ n   END_MESSAGE_MAP(TForm);. q. p& O  |) Q$ Y+ C5 u7 E% Z
};% T" D  o0 i  \# p8 x
extern PACKAGE TLANForm *LANForm;. |/ O% a: |3 G2 ~+ {; N1 C, T9 I
#endif) q* u$ I2 d% J* _/ ?7 |* [! N  J# K* K- f

. a% l: a2 m! X+ {, ?
' s) E4 G3 O7 l3 c& p% n.cpp File
1 a+ i7 K6 r/ a  d$ |& l  n) }1 [& m
#include <vcl.h>
! }: l0 P4 D2 w/ a3 I& Y#pragma hdrstop
( F+ E8 R1 @3 f9 {4 M! Y( `#include "UDPClient.h"
: L- ?7 B8 {9 O3 \/ ?#include "WinSock.h"
* l7 N$ K! s; r* C#pragma package(smart_init)
8 b' w# Z5 S$ t$ E: }#pragma link "CCEdit"3 L; A( j% e3 T3 x+ y& d
#pragma resource "*.dfm", N* m) ?8 S& M
TLANForm *LANForm;. s4 A+ [7 b* u' k: h  `* |
enum PROTO {TCP=0,UDP=1};
9 t6 ^0 W) h# aSOCKET m_Socket=INVALID_SOCKET;
* j6 w2 @3 ]% xPROTO m_Protocol=TCP;
1 @4 R  B* @0 x, |__fastcall TLANForm::TLANForm(TComponent* Owner)2 u6 E1 N1 l& A
   : TForm(Owner)' T" c. d, o) |  i
{$ ]4 s& Z2 f- b2 J
. a* N- v/ q4 L5 J; B) m
}1 n6 d+ Y+ ]  K, e" X( d; Y7 \
void __fastcall TLANForm::FormCreate(TObject *Sender)2 Z) m" `1 N4 ^6 W* i0 D! \% t" d
{& z/ [' b1 U; S2 c( j' e
   ::SendMessage(Prot->Handle,CB_SETCURSEL,0,0);
3 r3 l8 u1 }, N, E; A8 [3 E}
0 |6 h9 D- N& {void __fastcall TLANForm::OnRecv(TMessage &Message)
. _0 ^2 F. [4 s{: Q  K1 \: n3 \" T  k# H: I# R2 V
   char buf[4096];
! e- j$ U0 N2 E' u* s5 ]   int nLen;
. B7 a4 T% H8 A   struct sockaddr_in from;
6 K- j/ ~% V! E" w! d3 e   int nLength=sizeof(struct sockaddr_in);
% _% A4 y& _. M5 ~4 L3 u% @   switch(WSAGETSELECTEVENT(Message.LParam))2 b) `, ]9 H* A3 d
   {4 @! O) n$ z/ R
      case FD_READ:" L- i. q! b8 ]' ^# C
         switch(m_Protocol)8 y0 r( ]- z0 ]2 z
         {2 h$ @0 U+ `3 z7 o/ w" V
            case TCP:$ r: b+ |+ X7 k  O
               nLen=recv(m_Socket,buf,4096,0);
4 _% q/ I9 [7 L4 T6 v7 C               if(nLen>0){
9 p6 }  S5 [# ]7 A7 f. V3 U                  buf[nLen]='\0';
5 T6 n! d& V6 g8 [$ V                  TxtEdit->Text="Received Length:"+String(nLen)+"\r\n"+StrPas(buf);
/ Q! H& ]0 a% N; A; p  m8 Z3 K               }, \+ [7 J7 N; s( w) B
               break;; F6 A& x7 \% G5 k
            case UDP:
# s& g  o$ t5 n: b               nLen=recvfrom(m_Socket,buf,4096,0,(struct sockaddr*)&from,&nLength);. p$ p) N) L" S$ U0 Y
               if(nLen>0){2 j: H, u2 z# ]7 V8 \7 o( x' G
                  buf[nLen]='\0';
4 P! ^$ |0 P" N/ t& I                  TxtEdit->Text="Received Length:"+String(nLen)+"\r\n"+StrPas(buf);
6 }& e  p, d3 b0 H5 @0 \2 v- S               }
/ B8 V* q5 Q9 v% R! a2 }               break;0 m( B! N/ U6 D
         }' ~1 M. z. N) M$ z0 S3 F6 w
         break;
  \. K6 I2 G/ @) @3 w      case FD_CLOSE:3 U- [$ w9 u- e4 O' ~3 Z* m
         closesocket(m_Socket);
- h* u3 _( l: Y0 R$ ~9 N+ z4 U) T* m0 o         break;, n1 l' E- j. Z5 @( K' A
   }; t( {& @+ i* M) F1 }% i1 _
}
& c0 N5 S' a4 y2 v& _9 U2 W- z0 u
: a4 r9 c0 b7 Gvoid __fastcall TLANForm::Button1Click(TObject *Sender)
0 h7 ^$ N) g! ]& t{
7 h5 k, T- k+ D- b4 G+ Q! d   char szTmp[256],buf[4096];
. g3 y! G7 z/ R  ^. y0 ~! H   int nSize=0;* o0 Y" B: z  D* L% `
   UINT m_Port;
- {! ~* Q6 l+ @% H8 {   AnsiString addr;  h; \2 I( e& U* C! v
   addr=Addr->Text.Trim();! D- y; J7 d2 F9 k
   if(addr.IsEmpty()){4 y) r9 I9 p3 q' A$ m- c6 u* s4 j. e2 A
      ::MessageBox(0,"lease enter the server IP!","Error",MB_OK+MB_ICONERROR);
+ U" i; l( ?- J      return;
. P* G5 d  I9 }7 G1 h6 i2 |   }+ B/ I& e0 q5 Y% z7 n; @6 U! R: e
   unsigned long nAddr=inet_addr(addr.c_str());3 w( Y" [& _4 c" G" z! B
   if(nAddr==INADDR_NONE){
6 A; u( G+ k( g2 D5 o9 O      ::MessageBox(0,"Bad Internet IP!","Error",MB_OK+MB_ICONERROR);+ J# `: ], h/ }) g6 d; s
      return;}* }, e' F. U9 n/ j+ ?/ t9 a6 A

6 i9 m* I8 v, V! n) Z4 ~   try
( D' w1 I. w1 F  m   {
" y5 X$ R1 t+ W7 C* r      m_Port=Port->Text.ToInt();
  H9 y! a" C2 z# Y6 r. a. U; O   }
- O5 Z# Q  b8 n6 d   catch(Exception &e)9 v4 P5 F; F& J5 S
   {
+ E- d! x/ I/ E$ A& z% H      ::MessageBox(0,e.Message.c_str(),"Error",MB_OK+MB_ICONERROR);, j$ c1 D8 J! s# |0 r
      return;
9 v) w/ H0 R- ^  D. W( @2 I; ?   }
# ?8 I* P+ H. g- U; T   switch(Prot->ItemIndex)
4 K+ q3 c7 s3 ?* o4 I$ g  n! v" q   {+ H! @7 ~: P9 ^2 Q. V9 n& l
      case 0:
3 f3 h4 ]- ~. x; ^0 ~         m_Protocol=TCP;9 A, M/ m, {/ G+ w' H/ Q
         break;6 z) p8 `' x) R" n+ z1 {: w
      case 1:3 ^6 |8 d! r7 {4 @
         m_Protocol=UDP;
6 m8 Y- z; F; `9 S' P0 B. w         break;. u& }( `2 |  w; V
   }3 Y' x7 d$ k$ d8 Q8 Y5 C2 B
   if(TxtEdit->Text.IsEmpty()){
  L7 P! j. i) H* @) K      ::MessageBox(0,"lease enter the text you want to send!","Error",MB_OK+MB_ICONERROR);
. x1 U' S3 Q% a) ]- S3 h7 g      return;}
% I! z5 u  ~+ n' E( T: ^1 W
# X, E, K) {* f3 c   //Initialize Winsocket
, |! g  c0 S9 }9 G% [1 u, a5 v   WSAData wsaData;4 Q4 e& C) \4 Z) w7 q
   ::ZeroMemory(&wsaData,sizeof(WSAData));* W2 T7 |1 X! k+ u# P
   WORD version=MAKEWORD(2,0);6 Y+ n; Q* y! _9 H* E# q) V; O& U
   if(::WSAStartup(version,&wsaData)){* D( N5 g' H7 Z# b: y
      sprintf(szTmp,"Failed to initial winsock enviroment!,error no:%d",::WSAGetLastError());6 L6 ~3 o: Q2 q. F
      return;}& c" @6 Y' S1 Q* ?+ n0 ?" f
6 Z+ P6 p' {" n/ Y. [
   //Obtain the active connection
4 I+ H1 C& t1 x, G+ d) c4 ]   char ComputerName[255];
* {7 r/ w. \" F  l2 D& @. \* S   gethostname(ComputerName,255);
0 H* T6 D' J' F& s9 G   struct hostent* he=gethostbyname(ComputerName);
# `+ {! S& t; Y7 p   if(!he){
( ~+ k9 \. @, Q$ F7 p      sprintf(szTmp,"Failed to get information to host!","Error",MB_OK+MB_ICONERROR);
$ X, l- o- o# @: C0 g! O  E! ~( Y      ::WSACleanup();( A7 B9 A% t. j& O
      return;" ~! G/ z$ j/ ^
   }
, |$ z* \% ^; t& Z' ]: j   //create new socket
: t; [* i; T, F( w+ d   m_Socket=INVALID_SOCKET;
/ ?) x0 R! d1 u   switch(m_Protocol)( T- z0 H+ Z! z
   {6 J3 Q0 z% ?$ @& Y7 K, e9 n, T0 X
      case TCP:
" D) L  W8 T2 G         m_Socket=socket(AF_INET,SOCK_STREAM,0);
% t8 E2 S4 F6 L         break;; x9 z) N* N+ f+ K) m* J5 ?
      case UDP:: j% n$ L0 i+ N1 u* Z8 E* b
         m_Socket=socket(AF_INET,SOCK_DGRAM,0);
- V. d/ i7 S+ g) G$ x         break;
  J6 i1 Q1 X2 z+ W! z/ R$ Y7 o+ n) w   }2 @2 `) `. L2 y. @& i$ p; c
   if(m_Socket==INVALID_SOCKET){6 o, X! r; V/ R+ E0 e' y2 p
      sprintf(szTmp,"Failed to create a new socket!,error no:%d",::WSAGetLastError());
1 L% R$ I- d3 L% v, z      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);
( R8 E% }( q/ c. R! Z      ::WSACleanup();1 Z2 B7 D% m+ S- S' [. ]
      return;
4 S% K/ u! i0 \  P8 j9 }   }- Q; m- [: c+ Q. r; _/ m0 ~
   //bind socket( v' d4 j# B# V) o4 x9 ?
   struct sockaddr_in client;5 o' |* B- a& }0 s
   unsigned long nClient;6 z& N% \. j* h. w  G8 _$ w
   memcpy(&nClient,he->h_addr_list[0],sizeof(int));9 `' ~$ D' z) Q5 U0 f/ ~
   if(nClient==INADDR_NONE){  k! C6 f" k. p# a9 w; l
      sprintf(szTmp,"Failed to obtain the local machine's IP!","Error",MB_OK+MB_ICONERROR);* ^* E9 \0 `9 _
      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);
3 F& V, r& A; c7 I& q      closesocket(m_Socket);
& C6 M* v* X; p      ::WSACleanup();
/ I3 i0 g8 Y/ ]! F: o( u      return;
/ P- q8 r) l4 u: e2 o   }
. y& d* f( I8 u3 r# P   client.sin_family=AF_INET;5 ?1 g) z1 G* [/ \4 Y) `
   client.sin_port=0;. }) M7 _' `3 J) H# a4 X( O8 W; G
   client.sin_addr.S_un.S_addr=(int)nClient;
" X+ {* [6 @' \" c6 c: U1 X; d* m   if(bind(m_Socket,(struct sockaddr*)&client,sizeof(struct sockaddr))){- w1 V- v/ Y6 Y7 U9 U
      sprintf(szTmp,"Failed to bind socket!","Error",MB_OK+MB_ICONERROR);7 b6 n3 l- z8 \: @% S
      closesocket(m_Socket);
9 Z7 U$ X: w- R# w$ B. b      ::WSACleanup();
1 u9 P& b1 _3 Y5 Q+ g      return;}
" L7 j2 U+ a; |( Y% O+ l9 v   //connect socket
5 O- \' A8 r' w' k4 Y: C   struct sockaddr_in To;
# W$ F  _- d5 q" R   To.sin_family=AF_INET;5 o) j! ]! M2 f0 J5 S+ R
   To.sin_port=htons(m_Port);
( M9 |# f" l2 N. T   To.sin_addr.S_un.S_addr=(int)nAddr;
: O) x' g" r/ Z& ]   fd_set FDSET;4 c) o8 p* h, A$ Y- ?7 ^
   FD_ZERO(&FDSET);2 L) r/ R& V  Y  x6 w
   FD_SET(m_Socket,&FDSET);
; Q, a. H2 U& R- D; ^2 p; \" {
. b: c1 ?* V& s' G9 J1 `  K+ d
/ A- u% D, P  P& V   if(m_Protocol==TCP){
2 x6 H. F: E* O      if(connect(m_Socket,(struct sockaddr*)&To,sizeof(struct sockaddr))){
4 R! Z+ p7 L# L) H# C5 n. A% T         sprintf(szTmp,"Failed to connect the object!,error no:%d",::WSAGetLastError());
& ?! N' {# b7 {4 |         ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);2 ?- Y: v- i+ T% [5 L1 I' h5 F
         closesocket(m_Socket);
  s2 B5 L7 a) M4 Y         ::WSACleanup();' ~/ K8 {# y! D6 L8 s. G6 m- w
         return;
' O: I7 n2 b! R% P- l      }, @3 n( k5 N# C9 i* R
      int nError=select(1,0,&FDSET,0,0);# Z/ X5 r8 @# Z
      if(nError<=0){
& t! ?0 Y; e/ ~. E* k: g+ j      sprintf(szTmp,"Failed to select socket!,error no:%d",::WSAGetLastError());+ v- T# O' L- X& C8 B- V1 e
      closesocket(m_Socket);
7 X5 c* h% p3 g+ ~" {* {' Z  y      ::WSACleanup();2 i/ U" G! S/ N  x  d3 q
      return;}8 w6 ]# f/ K2 d% ?$ R  n2 \" n
   }
4 Z% s; V. z, B* |   //Send data( y8 t6 Z/ E7 h/ D1 s
   int nLen=TxtEdit->Text.Length();, C: V6 L& [. U; J# ]. H# s" `: T
   if(nLen>4096){
. ?# h' X( ^& I      sprintf(szTmp,"The buffer is too size to send,it shoud not be more than 4096 bytes!");, K7 X' G% b) [4 Z! y$ f& @
      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);0 k+ _( ~) J/ B5 M- s- e$ d
      closesocket(m_Socket);4 j, C1 V" ^% ?# a
      ::WSACleanup();
) W# E5 \5 g) \4 R7 w& f! o1 T# p      return;
' S1 j+ D9 X" }  R7 A( B* {/ @   }
6 t: }4 S) L! g" T* m   strncpy(buf,TxtEdit->Text.c_str(),nLen);
/ A& l& M: _4 N$ i' v' I% c4 K! \   switch(m_Protocol)
) `/ z1 O3 M. x) h! a4 C   {; [" ]2 K3 Q' J9 ~4 t! S' O9 Q$ [
      case TCP:
2 W2 S1 u% J# N9 S1 F         nSize=send(m_Socket,buf,nLen,0);
7 `; d% V/ y9 b  }- y' |; l         //ShowMessage(nSize);
  p9 Z8 I* o  X5 c! |5 a% ?         break;' I2 v% i* J. V: P! Y
      case UDP:
1 L' H% d. ?* H2 ~2 Y9 E0 G' |: M$ @         nSize=sendto(m_Socket,buf,nLen,0,(struct sockaddr*)&To,sizeof(struct sockaddr));
3 _( v1 y, x( d& T( X         //ShowMessage(nSize);
% F$ D7 r* \; ?5 ?4 t         break;1 t, k4 ~0 r' }/ E, z( }/ E
  A- x. U& s' b& J! c8 {0 h
   }
8 Z, [% E" b' r   if(::WSAAsyncSelect(m_Socket,Handle,WM_SOCK,FD_READ|FD_CLOSE)){
" ?" w" V/ }; A  P+ D      sprintf(szTmp,"Failed to register socket event!,error no:%d",::WSAGetLastError());
, t- H! V( _. j) r- E% T      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);
, {: ~& N6 {( V4 C% t      closesocket(m_Socket);- W8 n# s1 R5 R2 g. l1 ]/ ~( v" P3 [
      ::WSACleanup();
" S9 |2 e8 [3 a. j# T, X$ x      return;}+ L  w% l/ @9 T" g, D
}. M% i" j) P) K) s
void __fastcall TLANForm::FormDestroy(TObject *Sender)
) y+ H. f" N5 w  s{; [% `* s0 E; Y7 B
   closesocket(m_Socket);8 G6 \# J- i- S" ?8 Q
   ::WSACleanup();
' y. U6 G; K% h+ [}
4 ~3 d+ J+ ]% e" I$ N
5 R4 l- @! J5 s4 `Socket api Server:
- S/ }1 d% z: H. h/ [4 T4 R.h File
, U% y% o! v/ u+ H: x, R" h. E#ifndef UDPServerH
, y& J. a0 R* p#define UDPServerH8 ]' P0 x9 q1 Q
#include <Classes.hpp>6 J. Y+ w9 }: G" M, M- s1 m- \: u/ n: m% C
#include <Controls.hpp>! F7 Y* U9 U7 f
#include <StdCtrls.hpp>) j: B8 h& u4 h: K. _
#include <Forms.hpp>
. e0 G6 Q/ q5 F1 v% Q#include <stdio.h>; R& H* \$ G' G6 K( c8 F8 o0 h
#include "WinSock.h"1 M: l" A" n5 P$ n8 D9 m3 R8 u& m
/*#define WM_SOCKET WM_USER+1000
1 A3 u8 ]' q8 }; F  U#define INITSOCKETSUCCESS 0/ d$ _& a- \3 q1 J/ G
#define INITSOCKETFAILURE 1; X/ w. d" v" y# }
#define CREATELISTENSOCKETSUCCESS 2! L+ N/ K( |5 l
#define CREATELISTENSOCKETFAILURE 3
1 h. l/ O1 `3 B8 ^# ]#define SETLISTENSOCKETSUCCESS 4
8 Q+ q' i9 p- t7 l#define SETLISTENSOCKETFAILURE 5
3 U! ]1 F: x- T7 K# U% @6 z* _#define BINDLISTENSOCKETSUCCESS 64 ~8 \& o! M" }& n3 @
#define BINDLISTENSOCKETFAILURE 7; a; `  [  x, m: |% a2 Q2 s, P
#define LISTENSOCKETSUCCESS 8# V3 c! i" {+ X* a# S: Z
#define LISTENSOCKETFAILURE 9. D  F$ v2 c8 P7 t
#define ACCEPTSOCKETSUCCESS 10, d6 ]2 M3 _) a" }# z
#define ACCEPTSOCKETFAILURE 11
" C6 V9 i3 A/ u4 Z; |: ]6 W*/
- S5 p7 y( G. x& [4 t) t4 m: `* dclass TPSTNForm : public TForm
4 `) c2 Z8 v" k" ]$ d{, T5 I3 l( m  U
__published: // IDE-managed Components
" h( c9 I; D) \! Q5 B   TEdit *Port;8 D* a/ [) s. m) z4 k3 \
   TLabel *Label1;
! }5 J6 H3 {& E! N   TMemo *Memo1;
9 S8 n1 M0 `3 ~   TButton *Button1;$ i% F4 o4 g, q: c$ d; u
   TButton *Button2;
9 O: J8 Q3 Y% b3 Y3 b) ]8 p8 F- L# v. D   TLabel *Label2;5 Q; E6 \3 |% p# ^4 E
   TComboBox *Prot;
5 {( S, W; Z) k4 O* v) K; R   void __fastcall Button1Click(TObject *Sender);
2 @/ l4 k$ }( q4 H3 `   void __fastcall Button2Click(TObject *Sender);0 _: A1 T' L: e- W& B' w
   void __fastcall FormCreate(TObject *Sender);! a" s6 w' M5 ~1 ]. e
   void __fastcall FormDestroy(TObject *Sender);$ p( e7 `2 d; M: n- w
private: // User declarations
/ t3 M9 Z0 D3 m( U$ rpublic:  // User declarations. p' r4 I7 [5 i6 o
   __fastcall TPSTNForm(TComponent* Owner);; O' `, k% D3 Y
};/ N6 Y( O4 n& K
enum PROTO {TCP,UDP};, `; C* u1 [/ e7 r6 O( G- T
class TCommunication:public TThread    //Communication Thread" T1 G$ u  v' O9 u6 f. b
{# O/ f3 W5 t* _/ g& }7 _
private:7 `5 B! V4 F! u# ]; d3 J) T$ L
   SOCKET m_AcceptSocket;0 X' n; H8 ^& N# S  I# \
   char szTmp[256];//ERROR MESSAGE
- \% _4 M1 a0 U2 w  J, l8 \public:
* G  [; g1 n+ R3 ~   __fastcall TCommunication(SOCKET m_Socket,bool CreateSuspended);4 t6 ~: }& G  c
   __fastcall ~TCommunication();
. S& f- x& @8 u$ s; Pprotected:# K  P. W; [6 j% H
   virtual void __fastcall Execute();
* W/ ]& a3 g- r5 m- _};, V# g5 W' W$ i* m2 e
class TListenThread:public TThread //Listen Thread5 E& ]$ q* Q) A! ], M% T
{
: h* D5 `  J. b1 o; \! Xprivate:
; ~; H2 r$ U( Y7 v% M2 J! P4 K" p   WSAData wsaData;( w3 e1 O8 W7 D5 K- q
   struct sockaddr_in server;
: d0 |' U, V* J- J   fd_set FDS;
: t' v! t$ _6 |   UINT m_Port;, C1 A! P/ d: O+ t+ k9 H
   PROTO m_Protocol;1 j- _; m  ?6 Z) y4 j0 ]) H
   char szTmp[256];//Error Message( N4 G! k* ~. L) ^9 k6 L6 C$ a! `9 n
public:4 f5 ?* g  E, F
   SOCKET m_Socket;7 R, |# g# V4 d' a
   void __fastcall DoError();
% o% {# L6 k$ {) y7 W( C   void __fastcall InitSocket();
" l8 M# z1 w" O& S, K   void __fastcall CreateListenSocket();
. o5 F, _; a8 i; `/ a   void __fastcall SetListenSocket();
9 Q( P) ]* x9 v6 L4 {% `2 R2 n   void __fastcall BindListenSocket();5 q' W  M4 U% H* @
   void __fastcall ListenSocket();) G: h' T! k$ t) J

) T, t7 P. N6 S& E9 Dpublic:
+ U7 t+ M& y$ C1 [   __fastcall TListenThread(PROTO m_ProtocolA,UINT m_PortA,bool CreateSuspended);, ?7 |; V0 a4 s" A
   virtual __fastcall ~TListenThread();
( {% [) D+ ?* hprotected:+ J8 e' j) \" _, ?" |
   virtual void __fastcall Execute();& V- }* M5 F% F( X8 P2 r
};8 _1 p& i; b: h' Q  P  ?1 i1 X
extern PACKAGE TPSTNForm *PSTNForm;
* D. d7 N4 ^# M2 c! g* g1 P#endif
/ {' A( {- D" G2 C.cpp File
9 G3 ]$ S  J7 `4 j#include <vcl.h>- E" ]) j/ {8 s& I5 y) S
#pragma hdrstop
  ]6 U* i- m. v# K, S3 {#include "UDPServer.h"
, A) O4 [1 L- `#pragma package(smart_init)# }+ c4 V5 X/ u; d. k
#pragma resource "*.dfm"& J- h8 T3 X4 g1 Z7 I
TPSTNForm *PSTNForm;
. ^; @/ x/ ^) [% h2 r- STListenThread *pThread=0;& D# `* S! R. T0 }% G
//******************************CLASS TCommunication For TCP****************************************************2 Y, Y" ]& }# u( O, {2 D5 T2 ?& S
__fastcall TCommunication::TCommunication(SOCKET m_Socket,bool CreateSuspended):TThread(FALSE)* b5 E+ l( ]% `  b" D$ e0 q3 n
{
" P/ v) i  H' z2 m2 q6 O" N% n   m_AcceptSocket=m_Socket;
9 E1 L0 S" v; q0 U. g9 H  _   szTmp[0]='\0';% P6 G; J2 K+ J2 O$ k- ?+ D. O* S" e
   FreeOnTerminate=true;* C. ]+ ?2 z9 N) r: V# a
}
* _% P# b2 A7 J- o0 P__fastcall TCommunication::~TCommunication()
! `& M, v+ V3 ?{, g; q# B1 a5 N! J, r3 L# |
  // closesocket(m_AcceptSocket);
* g+ k2 L8 t( v! r, {3 ]7 s: E, H}
# c$ ?9 d1 [& j" Wvoid __fastcall TCommunication::Execute()$ d6 E) e: V# Z/ M) ]% v1 ?8 N
{
5 s5 Q/ o& r  e; n1 [( O   char buf[4096];9 V) q; U: U/ @1 z) u. J
   int nSize=0;
. K; M) d2 G( a: X9 l   nSize=recv(m_AcceptSocket,(char FAR*)buf,4096,0);' x2 G$ O; o5 g7 J& C
   if(nSize>0)
6 L, ]) _1 p; j. ]' p   {
, o9 z1 j) t4 n/ \4 |" P      buf[nSize]='\0';) f: U* B& \4 @1 `
      //Display
4 e! Y6 Y1 e9 g" h3 H( x, ?: W      PSTNForm->Memo1->Lines->Add("Received Length:"+String(nSize));2 L! k0 ]5 k4 n0 h7 b. E
      PSTNForm->Memo1->Lines->Add("Received:"+StrPas(buf));
! o9 u3 l: X1 g% q4 J- ^- V- _      //Deliver5 S; M8 `& Q) H8 T( L+ {7 c$ C
      ::Sleep(100);
+ t" k- T, j0 f1 z      send(m_AcceptSocket,buf,nSize,0);! M  |0 s% _2 a. `: h" |
   }: }1 C; O( ~+ G. }3 p1 Y8 O- l
& j/ G% E- ^0 m4 w4 ^% X5 T
}
& W3 ~) z8 E+ A' a3 k//******************************CLASS TListenThread*****************************************************5 c/ |( ^' P' s8 X9 [/ {: X, {
__fastcall TListenThread::TListenThread(PROTO m_ProtocolA,UINT m_PortA,bool CreateSuspended):TThread(FALSE)) Q8 s$ Z% Z0 h1 @+ n; T9 k
{; `* F0 U2 U9 e$ D) {3 c7 @$ N
   m_Socket=INVALID_SOCKET;
  R" [; S7 E8 v9 ?   m_Port=m_PortA;
6 l  C9 y. ?8 N( p* p) U/ a   m_Protocol=m_ProtocolA;
6 f) w$ q$ ]9 R( _# N3 f1 m   szTmp[0]='\0';/ }5 `% p. j! ?
   ::ZeroMemory(&wsaData,sizeof(WSAData));
  r! k8 z% d! M1 _5 v   ::ZeroMemory(&server,sizeof(struct sockaddr_in));  J. ?3 e, S4 d& Q. n- M1 P
   FreeOnTerminate=TRUE;//Automatically delete while terminating.
# Z, [9 U, S2 C6 ~5 Y1 I6 S}: Q& P( Y! [' w7 Q* Y! h& p
__fastcall TListenThread::~TListenThread()
4 |, E: q  N6 I4 s{  d3 g% ^7 _3 C  Z' ^# w3 T
   closesocket(m_Socket);
, Z, V6 g5 M, n+ m" g   ::WSACleanup();1 u  M' h! F( w
   m_Socket=INVALID_SOCKET;
( V7 G. S0 }! b' U   m_Port=0;
& t# w! K+ X+ r% {2 o   m_Protocol=TCP;! I* W7 F! s0 A9 J, l6 }* V) I2 T
   szTmp[0]='\0';
$ U. p- D$ B) Y- d   ::ZeroMemory(&wsaData,sizeof(WSAData));
  s6 k  e# i& G! C7 n   ::ZeroMemory(&server,sizeof(struct sockaddr_in));
# m$ Z0 M  ~; L- b% x( D8 q; Q}
1 }' @3 F+ s4 ?: D" kvoid __fastcall TListenThread:oError()
( }" x  y$ o9 {{4 b% J1 b& x" t& c) ]- n) O
   if(m_Socket!=INVALID_SOCKET) closesocket(m_Socket);. U: H( y1 S) O
   WSACleanup();
1 X4 c) D# B" i1 M' j2 |   return;, Q( l, M$ e! `  u' \7 _6 E* g
}5 G* R# w* s, ~
void __fastcall TListenThread::InitSocket()
! K( S# q$ l3 U  `1 l% ^{! J. H- J/ S* v- d
   WORD version=MAKEWORD(2,0);6 L' _& G6 j9 S: X
   if(::WSAStartup(version,&wsaData)){
& o: f+ R% D: ~& n* N: p4 x* W      sprintf(szTmp,"Failed to intiailize socket,error no:%d",::WSAGetLastError());5 R- y- r& D6 e
      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);0 R8 W; ]  f. l* l# a4 c2 T5 {  }" ?
      DoError();$ ^$ {5 `$ T6 @! h
      return;5 L/ k, k6 Q6 L5 j5 U
   }
. |# k0 `' i$ S3 G+ B6 Z% t}
0 O5 N" S" U6 ]0 f, ~/ U4 ^) K$ Cvoid __fastcall TListenThread::CreateListenSocket()
& Y0 a( o" C0 j/ G{
1 ?7 `3 w0 @8 m# [   switch(m_Protocol)
) O' O9 o! H2 Q3 y5 t7 g' |   {
' v5 l: |+ G8 M2 D      case UDP:% }# l. b. P) l6 u
         m_Socket=socket(AF_INET,SOCK_DGRAM,0);
! l% x% m% W1 Q         break;
! f0 ]2 o( i4 @$ G% \. c; p      case TCP:, ]# `# z- s& l) F. @& i
         m_Socket=socket(AF_INET,SOCK_STREAM,0);
' c+ P6 s+ J; g* D7 ^         break;3 a/ N" J1 R$ e
      default:! [9 N" C# w9 m. v- Z$ `
         sprintf(szTmp,"Error protocol!");! d  {/ T' W! i8 R# E
         ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);
2 \: ?) r& A' Z         DoError();
3 I5 [* o+ h5 b1 G& @         break;
, s7 i+ M' G% \! N9 J! g% \   }' U7 J8 v2 {; A8 e- \0 r
   if(m_Socket==INVALID_SOCKET){
4 l; J1 z, {+ b      sprintf(szTmp,"Failed to create socket!");
4 W: [5 f8 X3 M4 r      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);
# J# H7 w7 E$ Z9 i      DoError();# U8 R( R/ Y, B8 B! f
      return;+ @6 G/ t0 g' D- J
   }0 R6 y" d6 ]1 m- k) e% w
}
) d! N8 e& |; d, mvoid __fastcall TListenThread::SetListenSocket()
3 @& t, r4 I$ r6 K; |% J3 v& t' E" Q{1 [1 N/ Z9 r; d1 j
   server.sin_family=AF_INET;$ j8 Z/ f$ O5 q9 Q
   server.sin_port=htons(m_Port);0 v- h5 g, K/ y  i- d# Q
   server.sin_addr.S_un.S_addr=INADDR_ANY;9 Y1 g5 i2 o% S& W$ ?% s* U
   int NewOpenType=SO_SYNCHRONOUS_NONALERT;
  N9 u0 \2 W6 E7 A" Q3 s   if(setsockopt(INVALID_SOCKET,SOL_SOCKET,SO_OPENTYPE,(char*)&NewOpenType,4)){+ S3 e8 c* r  L
      sprintf(szTmp,"Set socket option error,error no:%d",::WSAGetLastError());
) }+ B% Y, ]( V      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);' f1 ~; o8 |7 x5 k( H
      DoError();, l0 D! F" Q5 q/ }7 B, ]. j7 e& _
      return;
' H8 e  B0 S' M; Q4 k2 Z7 ^* O( ]   }
0 j6 F7 F$ g4 z4 L" _% a}! u0 D4 Q  ]# i# b! g( _9 F
void __fastcall TListenThread::BindListenSocket()
8 g$ @! Q3 g$ g7 ^3 H5 f{
% u% A" s1 W& Y$ e  q( O6 E    if(bind(m_Socket,(sockaddr*)&server,sizeof(struct sockaddr_in))){2 L  f% b+ Z9 x( l, f( k/ `
      sprintf(szTmp,"Failed to bind socket,error no:%d",::WSAGetLastError());+ M* }# e2 ^# @8 S5 O
      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);
7 j5 @( F( X; S4 @. f      DoError();
, g) e' U1 V0 V4 H$ M1 D6 ?* F      return;
. g9 @5 q% \  ]  I& q7 `2 g   }, b: f* n" ]  H% F
7 |1 G  h4 A, y, Z# M
}
7 V8 C' Z  H2 g9 I+ N' t% Bvoid __fastcall TListenThread:istenSocket()  Y6 |' p9 S1 t* q9 l# U$ l; ?. u
{
2 e/ J' P# I9 U$ D( ?  if(listen(m_Socket,SOMAXCONN)){
- s; k2 L1 }) N& e7 ?+ G     sprintf(szTmp,"listen error,error no:%d",::WSAGetLastError());
9 L" @) p+ c* a! g2 n     ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);
+ |: z, E2 Y- `+ A0 L/ v     DoError();# y) X$ H$ n) H& I" \% K
     return;& O5 N3 C" s! G
  }
6 b8 u# ]/ g% u  //Determine whether there is any connection
) \- _9 _5 Y" E, \0 T9 \  FD_ZERO(&FDS);! M( i+ m! m9 W% E) I
  FD_SET(m_Socket,&FDS);
2 n) ~  `3 R; |9 ^+ O! h) ?/ f  a}
. g: w# Z( [5 Qvoid __fastcall TListenThread::Execute()- T+ g) M- a1 K0 C: f. r
{" @3 s7 p0 G7 o$ B4 Z) Q
   char buf[4096];
6 u3 q, b8 l9 S' d6 S. T' m   struct sockaddr_in from; //for UDP  Z# Z+ H4 p% U9 X2 n
   int nLen=sizeof(from),nSize=0;  //for UDP3 B: }" u% y1 G5 ?; ]; M
   InitSocket();
( y- H' o; d, f) h- i9 u( C   CreateListenSocket();
0 v) y$ X2 O2 T   SetListenSocket();/ q! l( n# ^2 P8 G
   BindListenSocket();: Q) d1 G) n; N6 x  a
   if(m_Protocol==UDP){5 t. S8 z$ D% T% I
      while(!Terminated){
5 g/ y: K  c9 e2 s, t         int nSize=recvfrom(m_Socket,buf,4096,0,(struct sockaddr*)&from,&nLen);5 e6 j9 U* O0 r, u/ B
         if(nSize>0){
' B8 U  I( M$ N! d* h0 G, \            buf[nSize]='\0';+ a9 M0 k+ K7 H" B# L' P
            PSTNForm->Memo1->Lines->Add("Received Length:"+String(nSize));
3 C4 J, G6 C' S/ a. C3 r: P( q3 K            PSTNForm->Memo1->Lines->Add("Received:"+StrPas(buf));
9 K: h# C/ R) c* ?            ::Sleep(100);
' X  l1 `' U* d8 s1 y            sendto(m_Socket,buf,nSize,0,(struct sockaddr*)&from,sizeof(struct sockaddr_in));
' R+ K$ }1 ^3 {         }
3 N6 S# S3 P  x- F" m0 m/ W' s         else return;
# {- x/ P9 C; F: x0 o& h  U. x3 N
4 k/ _7 o% I' m  U      }. n- F& T5 k, m5 g# C. Q$ C7 i
   }2 d4 t+ d- u) ?- \
   ListenSocket();
2 Q  b2 I) e4 I( X6 |   struct sockaddr_in client;1 A: @( N9 n5 \  d, }4 D
   int nLength=sizeof(struct sockaddr_in);0 G; `" o6 E' u/ X. h3 o. a
   while(!Terminated){7 U# E5 F1 i4 f, S! E
      int nError=select(1,&FDS,0,0,0);
' S( u' W$ J  H) o! |      if(nError<=0) Terminate();: n2 I2 |# M% g" v
      SOCKET m_AcceptSocket=accept(m_Socket,(struct sockaddr*)&client,&nLength);
/ z0 l$ r# w  A& a8 P) `      if(m_AcceptSocket==INVALID_SOCKET){
6 w2 [& M3 F$ G         sprintf(szTmp,"Failed to execute accept,error no:%d",::WSAGetLastError());
- b; l. e7 H2 T$ Q2 Z3 p7 j4 _         ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);
0 C# A) x' j0 ]9 v8 n         DoError();
& t3 k  Q2 g7 S9 a  y" T3 R, f  y7 s         Terminate();0 Q8 V" `) t* ~9 f$ `1 m5 L8 d
         return;
) U" g0 w! {# k: ]! }% _      }
* \/ ]. u$ f8 _. D      TCommunication *pCThread=new TCommunication(m_AcceptSocket,FALSE);% S/ X' q3 [$ B5 T. ?8 A
      pCThread->Terminate();% h7 A; y; x" K# h, ]
      pCThread->WaitFor();
1 Y; g  h  J8 S" j& ^( E1 h5 P3 G   }
) B9 k% x+ x; L8 f}
# L+ _0 K5 k9 H6 O% s//************************PSTNForm*********************************************//
; s9 H6 B) a: M* t1 w__fastcall TPSTNForm::TPSTNForm(TComponent* Owner)# j) t' D- u3 e* U& U
   : TForm(Owner)4 z8 _3 r8 F& p7 c
{
$ Y; s4 F  O% x) ^$ I% ~  F, s9 P3 M}" j6 i# o7 b$ q/ o
void __fastcall TPSTNForm::Button1Click(TObject *Sender)8 x* u2 R  q% D: r$ k
{
' p- s5 ~0 h( t, T- T   Close();
1 [: f) W, v  _5 k% X$ q3 G}
3 b3 v+ E; M  a! c  ?! ivoid __fastcall TPSTNForm::Button2Click(TObject *Sender)
3 m! C: u! t. C: x- }{: o3 F7 z3 }3 Q$ W# ^+ o8 O! ]
   if(pThread){
* e& S, o8 H5 C6 ^3 I% P5 o      pThread->Suspend();
5 U# ?7 \- @# G. H      pThread->Terminate();- |) h7 @0 J7 z5 t) ]
      delete pThread;
" ^2 y. r6 d9 Q# t) D# B      pThread=0;
2 C% h4 A# r7 K& I9 L  f8 O: l, \) i   }3 S$ p2 l" s( G0 W9 m0 s
   UINT m_Port;  K3 h  |" L1 m
   try2 D, ^# `2 |1 w2 R# I* f0 T/ v
   {. P: y9 n6 R8 M+ i
      m_Port=Port->Text.ToInt();
. d4 R( I  D5 h) D! s# ~$ r   }; [* P" h& g/ ]; p1 Z2 x! p
   catch(Exception &e)  U7 u' ]" t% s# u+ t4 N2 d, Y
   {
8 f+ @" p3 G# z* P$ [2 Q      ::MessageBox(0,e.Message.c_str(),"Error",MB_OK+MB_ICONERROR);
- J8 t' R; }; \: |      return;5 F4 J) b( j( I7 o
   }; ]- t( ]2 S3 s! k4 ]
   PROTO m_Protocol;
. d2 @; N* T2 T/ `   switch(Prot->ItemIndex)
# [2 M, R( \* X5 q$ ^$ e2 _   {+ j& l$ O. O0 y' o
      case 0:
' k- K" k$ G% p) v4 o         m_Protocol=TCP;
6 q9 P7 E% |5 f4 x$ z) Y$ I- Z         break;
4 d1 H8 H8 C" n1 E      case 1:/ F$ O6 ]& i( ~; k* R; [
         m_Protocol=UDP;5 }* [5 g; g7 K* r" E1 E" L
         break;6 V; W% d' D* H; Y: }
      default:
* H+ t" |' ^2 X: r/ g- v         break;5 d) ]# ?: `( d7 T
   }( y" {) p7 e7 n! E% o( i
   pThread=new TListenThread(m_Protocol,m_Port,FALSE);, V" w# c5 `5 F. X0 |  G
   //pThread->Terminate();' y: n' \" S5 y8 x, }9 ]9 f1 A; M
}
) |1 K. s# D( n" N; Svoid __fastcall TPSTNForm::FormCreate(TObject *Sender)4 J1 B3 G* C8 l. }, R$ K* C( _" [
{) O% ~7 ]* G5 f2 D2 G; Q1 k/ v
   ::SendMessage(Prot->Handle,CB_SETCURSEL,0,1);- P( T; t. }! H# h! ~5 a
}( \5 Z+ v- D2 T$ i8 r$ g! c" p
# }: N3 g5 _, l
void __fastcall TPSTNForm::FormDestroy(TObject *Sender)
" [" q" t' w' R{
7 Q5 f. [  |  ^! D0 V   if(pThread){
$ r2 O# |0 y0 `2 M      pThread->Suspend();6 n$ y) r6 w- e1 \! g/ f
      pThread->Terminate();}) t9 K  z; ]# w$ H& J
}9 t- l, x6 |4 Z+ w3 h! c
上面的代码,各位可根据自已的需要和针对自已的应用,在数据处理方面加以改进就可以了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-8-9 04:29 , Processed in 0.036316 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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