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

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

[复制链接]
发表于 2004-2-15 14:01:13 | 显示全部楼层 |阅读模式
在CB中用socket api来写网络通讯程序
9 C" \6 D' M+ ^; q) W# Y# L作者: kingcaiyao ,如转载请保证本文档的完整性,并注明出处。* e& k  j. _1 x. T: y- X
欢迎光临 C++ Builder 研究,http://www.ccrun.com/doc/go.asp?id=569
$ `; j* Y) h) u6 ^本文转自csdn,作者:kingcaiyao
) G$ {) ?3 K. B! I! Y& M- Z原标题:在C++ Builder中用socket api来写网络通讯程序(同时支持TCP和UDP协议)' E" Z* B8 n+ U& n3 ^) w; R
原文:  http://www.csdn.net/develop/read_article.asp?id=19883& d3 O4 u7 I6 N* u
8 Z/ h& F: j, ?" I5 @; ^1 p$ i
1 V/ x8 V7 J9 H! G5 K
在7月4日看完sockcomp.pas后,我决定用socket api来写一个客户端和服务器并且同时支持TCP,UDP协议,于是我就去做,现将代码贴出来(已调试通过)# C' N+ k+ Y, ]. T6 y$ y
Socket api Client:
) T: a* p4 D% w1 s
4 ]+ k/ J4 t/ b% q#ifndef UDPClientH
6 }& ]& m. {# j4 R/ r( B% V#define UDPClientH
! \8 p! R& m! }6 x#include <Classes.hpp>( E& h* f3 ^8 d, G9 q, c1 p$ m7 X
#include <Controls.hpp>' k" n/ A# r5 F+ P2 ~7 X
#include <StdCtrls.hpp>
/ b; G/ H3 Y  j8 |#include <Forms.hpp>
% j1 q# V! @2 T# u" D#include <stdio.h>
, r0 S$ z9 a. }+ k! c- {#include "CCEdit.h"& u; n2 i* }  \# r
#define WM_SOCK WM_USER+100
# |; ]7 z  M8 F7 P+ X% q& y/ ]class TLANForm : public TForm
# T0 F* U  b) `3 ?{- C% z( x% h' L
__published: // IDE-managed Components
8 J. c( h1 h$ B$ k$ d4 v   TEdit *Port;
1 g- x4 ~: ~3 {; h( g   TLabel *Label1;
5 O/ n) J5 f. W   TLabel *Label2;3 L' P3 ^% X/ i
   TComboBox *Prot;8 J7 G: s3 _2 @  U9 {$ X) w! n+ R; U
   TButton *Button1;9 |0 E  i5 F* [. C4 m0 B' J/ y
   TLabel *Label3;) I: V, k. J7 I8 ~0 m8 Z
   TEdit *Addr;, C& e; ]$ A0 K
   TCCEdit *TxtEdit;: |# ?( F& {0 r7 H6 F+ m7 e  F
   void __fastcall FormCreate(TObject *Sender);
. A/ @+ s+ K' h  F  S; K( o% K; A   void __fastcall Button1Click(TObject *Sender);
# D9 \3 o/ Y" _; p, _5 }1 A+ L   void __fastcall FormDestroy(TObject *Sender);: S2 U6 A' P9 k' i: V4 X. n: W
private: // User declarations
; |3 _3 d1 G# Y   void __fastcall OnRecv(TMessage &Message);
1 s4 O' i* G4 ?public:  // User declarations
( |( E+ Z* |5 R   __fastcall TLANForm(TComponent* Owner);! ]' y- w  u$ o8 ~! B
   BEGIN_MESSAGE_MAP
( y4 J0 a! P6 `& U      VCL_MESSAGE_HANDLER(WM_SOCK,TMessage,OnRecv);
* K/ j0 F7 `% T% Q# `   END_MESSAGE_MAP(TForm);& P5 V4 X8 p. r! ?* O. K
};! s2 A7 S$ O$ `3 ]
extern PACKAGE TLANForm *LANForm;- x  t8 v7 ?1 A1 p# P" @
#endif
! h. U# X- s$ X1 {( S  _$ p2 P: c4 @4 e
9 n1 `1 y$ {6 w; j/ u+ Y
.cpp File" t! `+ u1 z, O

+ u  `& [% |! n: V4 u4 ?#include <vcl.h>
, ]# V2 M8 _& y; a/ F% P* w! B" I# u#pragma hdrstop
3 i9 x" r6 P) z6 q. I4 h" t6 B- {#include "UDPClient.h"
% W# a0 v: a7 V0 Z# ?. m#include "WinSock.h"
6 g& |9 q& b, m' P- P) T" [- f#pragma package(smart_init)
' c! s$ b2 U2 [6 ~  j  z#pragma link "CCEdit"
' o; B0 \% ], \#pragma resource "*.dfm"
: n1 h! j! V5 k1 |$ X; DTLANForm *LANForm;: s0 }1 ^$ g! F4 p6 I/ {$ J. k  ~% A
enum PROTO {TCP=0,UDP=1};5 e- ^. g( h; W0 S6 r5 n. {
SOCKET m_Socket=INVALID_SOCKET;
- a$ L: c( h7 Z: v$ l# T  k0 @PROTO m_Protocol=TCP;0 |6 h% ~& Y- R' i7 s
__fastcall TLANForm::TLANForm(TComponent* Owner)+ i, y3 Q3 c2 D4 n
   : TForm(Owner)
- S( v' l9 S" P3 p{
3 y( m( u$ K% R& j1 r
( |- q+ |1 x% x! ?}
; L1 B& \. C6 svoid __fastcall TLANForm::FormCreate(TObject *Sender)
; u2 K- K) A9 O/ U{
8 y" X& n, x6 a' e( w& ?! Z1 }   ::SendMessage(Prot->Handle,CB_SETCURSEL,0,0);1 q" x8 b, }- ], D  p4 I' S* v
}
- J8 a, ~: _" k& S" N" L# M, Ovoid __fastcall TLANForm::OnRecv(TMessage &Message)$ e( v8 i7 Z$ U: N
{
- q: A% E. u& q0 A- t( x   char buf[4096];
- P1 g8 i; ?; s; w+ T; w. Y/ v   int nLen;; _7 @2 j8 h* {2 N' S
   struct sockaddr_in from;
) f8 s# M) [& V# O6 ?, s$ Z( d   int nLength=sizeof(struct sockaddr_in);
- Q0 F! n6 U, _- X  W: n   switch(WSAGETSELECTEVENT(Message.LParam))8 T6 K$ A& K% A% z" {
   {
7 u" p- A+ N% R1 x8 j      case FD_READ:
( z% n5 d( G1 x& D  a- @" W' ^         switch(m_Protocol)6 {, `0 k3 L8 P  t
         {
6 K$ O3 w2 m; L4 |, p# u            case TCP:
# x& t. |. J) v5 c               nLen=recv(m_Socket,buf,4096,0);$ z$ Z+ Q' }6 z% C
               if(nLen>0){
' _# J: M/ g0 i' P                  buf[nLen]='\0';
- \  J! \4 G  S* B! j8 q! y                  TxtEdit->Text="Received Length:"+String(nLen)+"\r\n"+StrPas(buf);( C) S* a* t% A8 l! e
               }* e& B1 @3 y. U& z) [3 o
               break;
5 _6 j& g# ?. T# o! v            case UDP:, m  p+ ?3 ~9 P$ Q2 ^
               nLen=recvfrom(m_Socket,buf,4096,0,(struct sockaddr*)&from,&nLength);. X/ _* B- F( h
               if(nLen>0){
0 g' B$ r0 c  X7 Z6 |2 _                  buf[nLen]='\0';7 I7 p& V8 ^. h/ A5 w
                  TxtEdit->Text="Received Length:"+String(nLen)+"\r\n"+StrPas(buf);, d& H9 X2 P& I3 B
               }1 D; {7 {. M, U' n8 f3 m1 w7 @
               break;9 W9 O, i# i6 u1 x2 E9 Z
         }+ Z/ ?- A# Q) n
         break;
; ~; z' p+ x" q  A+ c: s) f      case FD_CLOSE:
9 i) R* `  t) i' D         closesocket(m_Socket);, t% g2 V: |. _
         break;
* }9 e1 U% \3 ^. W   }
$ g3 g; |% Y7 L( ?0 i! i# f# u- @. |}
8 u; o% R9 l/ X6 _; I  O; z* l6 C; \4 C4 j. z: [7 j4 [
void __fastcall TLANForm::Button1Click(TObject *Sender)
0 Z9 \  B, J3 ]- M! X% @{: r, x5 ]8 K  ^2 ?
   char szTmp[256],buf[4096];, |( E; w* E% }; J, A/ X5 F, L
   int nSize=0;3 @) p$ h0 X0 |+ n
   UINT m_Port;1 o4 {0 R% F2 R6 U/ O
   AnsiString addr;  L1 d- P* T4 \1 D( s- l, p5 ^
   addr=Addr->Text.Trim();& W7 p, r' S* K0 s1 F& u+ E1 ~, a
   if(addr.IsEmpty()){+ T; r5 k# n& A3 H2 I6 `$ [
      ::MessageBox(0,"lease enter the server IP!","Error",MB_OK+MB_ICONERROR);
$ n0 |9 M+ }9 _: R4 w      return;4 T* j; y: ~; H
   }
* T  G4 k% `$ Q% W7 A' V   unsigned long nAddr=inet_addr(addr.c_str());( a: C4 f6 l2 [
   if(nAddr==INADDR_NONE){5 S) J0 T! _) `+ ]! @
      ::MessageBox(0,"Bad Internet IP!","Error",MB_OK+MB_ICONERROR);1 K3 ^0 y/ G: _
      return;}
4 D1 {, J, h2 F" s( x; `* v( Y/ R; q# [& [
   try
7 P, E! @: k/ w0 p" a7 ?   {
7 T& J7 x' p$ O6 L: A! k! X      m_Port=Port->Text.ToInt();/ x3 W& A, j. w# p6 ?* }# E
   }: k# D, ~( O  r- ]
   catch(Exception &e)
) D5 h" u2 }9 r* T   {
3 }8 _7 G3 n. Q. w/ I% R8 c) T      ::MessageBox(0,e.Message.c_str(),"Error",MB_OK+MB_ICONERROR);
; D8 {+ c$ O3 `' @' t' c      return;
. \: f1 A/ J( x0 y1 V# Y! H7 f   }
% f2 }5 ?  Q5 M   switch(Prot->ItemIndex)
8 B7 `: W# @  {   {2 D4 m" R2 W& q7 O8 p
      case 0:: s/ B6 N. X# x, g" N7 M' @
         m_Protocol=TCP;+ n9 x) s4 c0 }4 v; T
         break;
- X3 r- p' ~! q      case 1:9 s5 s& k* b4 ~# R4 x! ?$ p1 I
         m_Protocol=UDP;
' X' V$ E, w( W% t- p* p3 W* c5 z         break;
8 k4 Q* X- J0 y/ G! x) d   }
- h: ^' m( i  k+ Z7 B   if(TxtEdit->Text.IsEmpty()){# y/ E- W, ]) y2 y
      ::MessageBox(0,"lease enter the text you want to send!","Error",MB_OK+MB_ICONERROR);
# u  U2 ]+ R. f" W9 m; B  w/ k      return;}
1 F* V9 }& b! P$ ]$ Y- E
6 p' f8 R2 l; d+ K   //Initialize Winsocket# @7 H9 E; h5 e/ I1 P2 m
   WSAData wsaData;
' d. e# W9 B9 o7 Q0 g4 I   ::ZeroMemory(&wsaData,sizeof(WSAData));
- u4 q( \* l( b0 Z: a3 ?' x   WORD version=MAKEWORD(2,0);7 [+ n/ J- m! ^/ V/ N
   if(::WSAStartup(version,&wsaData)){8 O- f4 w$ A& k4 e& f4 T% L+ y
      sprintf(szTmp,"Failed to initial winsock enviroment!,error no:%d",::WSAGetLastError());4 u% }8 f6 G% ]0 _! P6 ]
      return;}
8 {, ?! i% P& K. i+ [  x+ E( q, A( E" T' A) @
   //Obtain the active connection$ B/ i2 w$ P5 C8 g( X. R* L
   char ComputerName[255];
( z$ I3 `9 e4 i4 J  V   gethostname(ComputerName,255);
# _6 N# a( L! m# d/ q( [# [0 T! @7 A   struct hostent* he=gethostbyname(ComputerName);  w5 \  p6 M- u: z7 k
   if(!he){2 ~5 U) y7 u1 O6 ^+ k7 h: c7 [& z
      sprintf(szTmp,"Failed to get information to host!","Error",MB_OK+MB_ICONERROR);
  \* s; F: Z% D) E      ::WSACleanup();
0 k' B3 f$ J; y+ K( D" o" P      return;
  [1 Z# d% S' f% h( M3 y   }" p! o% ]& p5 L, V
   //create new socket. x) A0 k) J$ H; J
   m_Socket=INVALID_SOCKET;  H1 ^+ i' ?* g* r
   switch(m_Protocol)  ?" l! U7 s* |0 H4 }2 b
   {, R1 ?1 {$ N8 }& d
      case TCP:
( x  Y5 l6 j# d         m_Socket=socket(AF_INET,SOCK_STREAM,0);. h6 }  R: ]9 q  Z
         break;+ G2 V" m: P3 P$ \) D) ?, F4 w
      case UDP:, Q* s5 ^  z3 }# W, E
         m_Socket=socket(AF_INET,SOCK_DGRAM,0);8 b3 y! s. V! }
         break;
  z$ C+ L; E/ m$ B   }$ s- h. h- F9 L6 }9 t- i
   if(m_Socket==INVALID_SOCKET){
' p+ B) a+ g- z4 X      sprintf(szTmp,"Failed to create a new socket!,error no:%d",::WSAGetLastError());
4 j( u0 p7 O! v$ [      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);" w0 r: s0 Z6 u- k  U2 v
      ::WSACleanup();
/ d! H, p% G5 \/ f6 u      return;4 _" l9 w* N! F* A3 C4 b) {
   }
& m3 g: N" Y  B- o$ `, e  Y   //bind socket
- U5 m  t: G+ e; }   struct sockaddr_in client;
& @/ `. j/ A% L; a! _) }   unsigned long nClient;
4 i: _. @6 }3 |+ f7 _8 x: ]   memcpy(&nClient,he->h_addr_list[0],sizeof(int));
4 S3 A1 s1 r5 `" S' V   if(nClient==INADDR_NONE){) ^% D: E2 E& s$ M
      sprintf(szTmp,"Failed to obtain the local machine's IP!","Error",MB_OK+MB_ICONERROR);& U- I* G  @) f$ X& Z; i
      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);: V4 Z4 C3 M7 q( |! i3 F
      closesocket(m_Socket);
( E6 ?; V1 e' ]- D2 i. \5 N0 C      ::WSACleanup();, {* `; p. J: e$ U: V$ z
      return;+ V8 N0 h$ f: {9 D: t$ Y. B# D
   }- M, G: Q0 e0 F7 [% `% c. W/ L
   client.sin_family=AF_INET;
0 `4 O, H, S& K& `( z& [   client.sin_port=0;6 p8 Z& P( o% R( T9 v/ g
   client.sin_addr.S_un.S_addr=(int)nClient;
7 ~& ~5 D' I3 V9 x" l! j   if(bind(m_Socket,(struct sockaddr*)&client,sizeof(struct sockaddr))){5 [+ L( z: z( [! i5 Z2 w; h
      sprintf(szTmp,"Failed to bind socket!","Error",MB_OK+MB_ICONERROR);
% K; E, V4 y2 B, [, y      closesocket(m_Socket);
6 Q$ R& B$ y3 `" v      ::WSACleanup();# q& Y/ Y( q0 H& z
      return;}
  A$ ?' t$ g" d! f1 a8 X   //connect socket
8 G1 I5 K& e  m, l5 i7 C7 P   struct sockaddr_in To;
7 E" V5 t/ z- |8 x   To.sin_family=AF_INET;
" D7 Y3 ^: ~* {/ g, A   To.sin_port=htons(m_Port);
& I) O8 p6 R% t0 W3 p6 @# {   To.sin_addr.S_un.S_addr=(int)nAddr;
& V0 p0 o6 E) r* l. J: a   fd_set FDSET;
# E+ M5 f1 ]1 q: V; }& G1 F4 W   FD_ZERO(&FDSET);6 D0 N8 n& ]0 w& h; l
   FD_SET(m_Socket,&FDSET);( h0 r& I; N9 Z) f
, M' Q3 W7 N9 f9 N( b( L. N

# t$ r3 }( P9 t- J1 r# P/ k8 J" c   if(m_Protocol==TCP){- a9 q' W9 S! ^( g  o. ?
      if(connect(m_Socket,(struct sockaddr*)&To,sizeof(struct sockaddr))){, t- f2 ?$ n3 I  V- _3 a  r9 u# Q: G
         sprintf(szTmp,"Failed to connect the object!,error no:%d",::WSAGetLastError());
, n$ ^: S! z8 Q$ J3 I9 M( A# m8 O         ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);
: ^  V' m# d2 u4 T6 }+ T( F. l' V         closesocket(m_Socket);
% v7 ]: y7 |+ u) Y; T6 A' W         ::WSACleanup();1 L$ @& `4 T- ]' K2 f1 r) M
         return;0 W% `+ X' z* j9 J
      }' K8 o- e: w0 x% ~; V, r
      int nError=select(1,0,&FDSET,0,0);5 G. |2 @, X+ Q9 c* E% w* |
      if(nError<=0){
' @4 b( P5 l  L, ]4 Y      sprintf(szTmp,"Failed to select socket!,error no:%d",::WSAGetLastError());9 k1 R/ G& T$ X( p
      closesocket(m_Socket);7 T  t- }0 f# _( _# f& K, I
      ::WSACleanup();6 {: p+ U4 L$ v5 s
      return;}
4 Z0 @- l7 w/ U   }/ ?7 \9 j, F6 b2 C# F7 M/ Z! Z' g
   //Send data, y, n- V  r; B1 e& P
   int nLen=TxtEdit->Text.Length();
" Z2 }1 x3 h2 M2 }$ G: V, r   if(nLen>4096){
3 r; C- Q8 x- h3 s  h. l      sprintf(szTmp,"The buffer is too size to send,it shoud not be more than 4096 bytes!");$ l+ \* \) O; s* x- _. l- L& q0 R
      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);3 W- u: O2 i; Q2 c# r
      closesocket(m_Socket);4 J1 d& v) u0 Q- `1 m2 p
      ::WSACleanup();6 Z. ^: n# b, h
      return;
2 V# p& E+ o* S$ x/ E% x. k# Q. d   }
$ }5 d4 a) ^3 p; S4 J' ^4 e3 B   strncpy(buf,TxtEdit->Text.c_str(),nLen);0 E' @" \1 b. P0 W' f( A% k$ u: w
   switch(m_Protocol)
  L9 x% v5 j( \   {* p+ E. H/ s1 P1 O
      case TCP:
+ S2 H$ }/ I2 U3 @         nSize=send(m_Socket,buf,nLen,0);
$ ^- [1 j0 c# ^# H6 p* W7 {5 `         //ShowMessage(nSize);* Z1 F  X  ?7 R! Y# G1 w$ e
         break;0 l8 e; R% N! x5 ~
      case UDP:3 r6 ?4 D2 @/ X! M0 t+ E5 Q
         nSize=sendto(m_Socket,buf,nLen,0,(struct sockaddr*)&To,sizeof(struct sockaddr));) s3 `' x0 `/ f
         //ShowMessage(nSize);
/ X7 N3 J! b: x& k/ f- S. e         break;
. e& i0 G: b  p% d. W: u8 l# C8 }: j; @* D+ u5 i
   }
; d9 F  b% X* Q& [# p7 ]) }$ t   if(::WSAAsyncSelect(m_Socket,Handle,WM_SOCK,FD_READ|FD_CLOSE)){( d* u- D# a3 S6 Z3 B$ x  b9 v% i
      sprintf(szTmp,"Failed to register socket event!,error no:%d",::WSAGetLastError());
% v" _4 k9 y' y" `5 ~5 q! N, {      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);
5 A! b1 u* q- L  a) X# }      closesocket(m_Socket);
2 Y6 ~  |/ H3 W6 t; O7 F6 K8 O& @- D      ::WSACleanup();! b7 p' ?+ Y8 b9 ]
      return;}
  j$ V2 C' B7 n6 g( ]# e}
) {! G/ w$ Q" ?; {4 h6 x, wvoid __fastcall TLANForm::FormDestroy(TObject *Sender)3 Z! U- |# N2 K; q1 L! Z. Q6 ~( O+ `- Y
{
7 @9 t% K) [( N   closesocket(m_Socket);0 g+ w# X) t. X2 U
   ::WSACleanup();6 ]1 _8 K+ F: o+ e: g
}8 o2 K7 i0 |- }( S& [$ b6 W

" ^# i, m5 r8 q$ U& y1 Q: `Socket api Server:
/ g9 {# d+ ^7 J3 w.h File
8 k* ?1 j. C# @8 `4 ]/ ]; K0 c, i#ifndef UDPServerH
$ e3 I% Q) w: ~4 b6 ?#define UDPServerH
) j  X5 D+ ?- ]% U; h) P#include <Classes.hpp>
$ W; X! j* d8 E9 F#include <Controls.hpp>, g& T& T. s. q6 B. c. I
#include <StdCtrls.hpp>
& F9 |) U! v) l% P7 w#include <Forms.hpp>" u2 \0 ~. {$ G
#include <stdio.h>
2 o- w. ], }" U' M6 a. {( m#include "WinSock.h"6 Z9 l2 v1 H% }3 D# w. g
/*#define WM_SOCKET WM_USER+1000
( l+ J' n7 B1 B& L1 V#define INITSOCKETSUCCESS 02 @& u( s: @' b
#define INITSOCKETFAILURE 1
% E5 i+ C8 ]( o; {# j( p. E#define CREATELISTENSOCKETSUCCESS 2
1 }" F% s' S6 J8 B+ y#define CREATELISTENSOCKETFAILURE 3
, T! g8 C  O, t" D2 Y" g#define SETLISTENSOCKETSUCCESS 4
6 Z# y% r& B9 O0 u5 N0 H' O#define SETLISTENSOCKETFAILURE 5
( y7 I4 U. p! G; g; ^#define BINDLISTENSOCKETSUCCESS 6
$ _2 `) M6 R$ y5 l& U# l8 P4 b  Z#define BINDLISTENSOCKETFAILURE 7
3 y2 t  n+ E' g+ Z#define LISTENSOCKETSUCCESS 82 d! \7 T; I' o
#define LISTENSOCKETFAILURE 9
# A9 }; y1 G8 m( R2 _' b0 s#define ACCEPTSOCKETSUCCESS 10
% u2 W$ a1 E# Y6 }) k- Y+ ?#define ACCEPTSOCKETFAILURE 11# ~9 \% L! O3 N9 T! y8 @; i
*/! I' T5 C4 B& _" M3 l* y
class TPSTNForm : public TForm
+ [2 {: r5 V$ O% I, _{
! h4 v! L  |/ R* W__published: // IDE-managed Components  l7 a4 U- _; |: H
   TEdit *Port;6 T- F  P. o' }* l& i5 V
   TLabel *Label1;( I: X! [; r9 I. K7 K" S$ Y) f9 b
   TMemo *Memo1;. R* U9 Z; P1 n& Z$ T' C( ^# {4 u
   TButton *Button1;6 T1 r% N4 d1 [# |' L
   TButton *Button2;5 g' T% a' ?( @8 T* B) I5 u$ T6 y
   TLabel *Label2;
  W$ \) y4 v: P9 U0 I& R   TComboBox *Prot;
; j0 b! i. Z% g( Z( y9 z- U) [2 W; L7 m   void __fastcall Button1Click(TObject *Sender);  V) D9 H/ P' R
   void __fastcall Button2Click(TObject *Sender);
; \- w' ?( z: f   void __fastcall FormCreate(TObject *Sender);
+ c& }9 G& d& J% @1 U4 v   void __fastcall FormDestroy(TObject *Sender);
$ N) Q: X4 E1 Q7 O  G5 V7 Dprivate: // User declarations# L6 B4 m: R9 |, K7 J1 `! ~3 f
public:  // User declarations
& A9 u) W6 g4 s+ V+ P" T   __fastcall TPSTNForm(TComponent* Owner);1 A' \% H8 C+ @( j) m
};! U& Z' M# K5 t8 s1 L8 A- X0 {) a
enum PROTO {TCP,UDP};
2 s- C# `1 k/ h/ H  Iclass TCommunication:public TThread    //Communication Thread
5 N8 f7 Z8 S$ n/ ?{
2 w, y- s2 o* F5 qprivate:
2 k" d/ V3 \& `: u/ v   SOCKET m_AcceptSocket;
% ?4 u1 w3 V8 g/ ^3 b   char szTmp[256];//ERROR MESSAGE
9 N' n! o7 A, A" M; }, ~& J0 zpublic:
5 R" ^# J8 ?7 \, L2 ^) b# v3 e   __fastcall TCommunication(SOCKET m_Socket,bool CreateSuspended);
+ D: o5 D$ B7 b0 A" l% A2 l. F   __fastcall ~TCommunication();: |9 k' T$ h( e' }' L* d' Z
protected:0 U& n4 [% R5 e& S  d. M2 j9 F
   virtual void __fastcall Execute();4 r7 `9 |0 O  N" n) F
};2 L9 t9 [1 t$ s
class TListenThread:public TThread //Listen Thread1 S' c1 l$ ?  B& [/ M
{9 m3 {- s! c  |8 A1 P, A
private:3 V0 a9 ]9 m) O) f, \
   WSAData wsaData;
( r' I8 \/ d7 }. x7 y# g$ ?, J   struct sockaddr_in server;
. m9 w0 b: ^( L* a0 J9 P   fd_set FDS;/ Q4 }$ d+ t9 d$ s2 P( [
   UINT m_Port;% L& i; z9 ^- w6 ]
   PROTO m_Protocol;( Z, }& U0 M8 ^- {" Q: U
   char szTmp[256];//Error Message
( M9 a" Y8 j/ t1 U  Kpublic:
' J' \/ ?, o3 e: A& L2 k  w   SOCKET m_Socket;
* @* ~. |1 n/ ~   void __fastcall DoError();. k# y6 ^, X$ H3 q
   void __fastcall InitSocket();
6 w" }' q/ w" r% n$ a! K* ?% W   void __fastcall CreateListenSocket();1 m. R+ ~8 }! E* C% Z0 }/ N
   void __fastcall SetListenSocket();
1 o; x: T6 l9 L5 E2 B   void __fastcall BindListenSocket();2 x4 ?3 {6 m. x
   void __fastcall ListenSocket();
8 C: B8 l2 \& }! @* P. r7 F, ]2 z$ N! m9 F6 t  `
public:: S: E  X% T0 o1 V$ |3 G& _7 [* h
   __fastcall TListenThread(PROTO m_ProtocolA,UINT m_PortA,bool CreateSuspended);
$ X; w1 g0 G9 w, {3 z7 w( j   virtual __fastcall ~TListenThread();6 N4 \8 V0 A, W8 d- `7 Q, ~
protected:
; z0 E/ P+ ^& B, D   virtual void __fastcall Execute();
9 y( \4 B0 _8 D! m& }/ [};3 C. w( d) r: r7 F0 _. o
extern PACKAGE TPSTNForm *PSTNForm;
% B% T0 |, Z! D, i#endif
* K! |4 Y: v4 D.cpp File
" v; [+ Y5 F5 O7 t( m5 G9 I* X#include <vcl.h>' O$ m# k3 X+ j( r8 j- Y  D
#pragma hdrstop
7 B2 X8 M7 u. u7 O& r8 H# d#include "UDPServer.h"
  l& I) x8 u* S0 x#pragma package(smart_init)
% q4 R/ @  Y7 F7 k; ?" f#pragma resource "*.dfm"
% j' ^) [+ L8 M+ {2 W, ITPSTNForm *PSTNForm;
* u: i2 |% j  s! xTListenThread *pThread=0;
" H) [+ x$ g0 w  z//******************************CLASS TCommunication For TCP****************************************************  `4 q) P& q6 ~  ?; F
__fastcall TCommunication::TCommunication(SOCKET m_Socket,bool CreateSuspended):TThread(FALSE)
& [/ o9 i0 r! d# L8 l% A7 U1 N# D{
, R* m8 b1 \- r7 d! r" |( J. T& M/ Z1 f   m_AcceptSocket=m_Socket;  Y* [) Y, w! y' U! |+ W- s- x. X
   szTmp[0]='\0';. ~- `. `3 o+ q) c2 d
   FreeOnTerminate=true;! A$ K$ ?* ]$ z& w9 v
}, T" w1 r; w# Y+ ?/ J: i
__fastcall TCommunication::~TCommunication(). s, w: e  q$ S% W$ W  Z
{; I/ `8 A5 J- \6 |# ~+ Y
  // closesocket(m_AcceptSocket);8 K( O+ n( w; ?; U( A
}
' G  f- C& k5 `void __fastcall TCommunication::Execute()
1 p$ f6 _( m+ S% R' }  D{
" A1 ]* d8 v8 n- V   char buf[4096];
7 [$ \2 ^* v# K! G9 @6 h$ w   int nSize=0;
3 z, r+ j7 b' B" c   nSize=recv(m_AcceptSocket,(char FAR*)buf,4096,0);) }; a- P, d' c7 i4 W, f
   if(nSize>0)+ T$ m- r# I7 ]2 ]1 G' E" z8 Q
   {
! N6 m9 @0 M( k2 @: W2 T2 s4 f      buf[nSize]='\0';# F" Q; x5 ?6 `- Y; f
      //Display- M* `( h: h! x
      PSTNForm->Memo1->Lines->Add("Received Length:"+String(nSize));
" m( f& `& S$ W" o. s      PSTNForm->Memo1->Lines->Add("Received:"+StrPas(buf));  F# N8 b) Y6 p% X$ u% n2 Q
      //Deliver
, J/ K' w3 }% A' `7 G! ]  F' s0 N8 Q! l      ::Sleep(100);; P2 C' U5 ]5 s! m- y, `/ r  F
      send(m_AcceptSocket,buf,nSize,0);0 b, Z* n1 r6 y# m- c- k/ G: W
   }) c  Y. ^& Q4 j9 U% H0 M) I
" l* h% @3 N* |! _" g! Z# R
}
; Q* E- d# X! a//******************************CLASS TListenThread*****************************************************' {/ T! d% O7 g+ g9 s8 b* L
__fastcall TListenThread::TListenThread(PROTO m_ProtocolA,UINT m_PortA,bool CreateSuspended):TThread(FALSE)9 u( ?3 G) a* w. H' i. M9 A6 Z
{
7 d3 ?& n; A% J; K; U   m_Socket=INVALID_SOCKET;! Z; q: h0 l- ~
   m_Port=m_PortA;' c, U8 s0 o2 X: _4 L/ r' y7 i
   m_Protocol=m_ProtocolA;& b) ]& ?9 S* B4 w% X
   szTmp[0]='\0';) l2 a9 d( Z0 |+ C6 V6 s8 @
   ::ZeroMemory(&wsaData,sizeof(WSAData));
$ D7 G+ n  u2 x" Y& x; x% ]   ::ZeroMemory(&server,sizeof(struct sockaddr_in));+ [; F" n* f2 l; S5 W  Z1 B2 |
   FreeOnTerminate=TRUE;//Automatically delete while terminating.; ?% n% r4 P! y% |( `- U
}& G4 y6 e/ ?  K$ H6 j4 g' _9 o
__fastcall TListenThread::~TListenThread()
: n' O2 Y- H/ \7 i  q0 \{7 F0 }9 k  e( V$ s
   closesocket(m_Socket);' Z/ ?2 X/ ?. |8 }+ q( M
   ::WSACleanup();
0 {" }* B7 R2 C$ J1 g* l: h, s- F   m_Socket=INVALID_SOCKET;4 e/ i8 g& `3 g; ~  @3 k: P
   m_Port=0;% w% }+ L& g  A/ O, {5 @
   m_Protocol=TCP;
, M4 W7 _  M1 r% l3 `0 p4 H1 r" b   szTmp[0]='\0';
% @5 J$ X: g' X. s   ::ZeroMemory(&wsaData,sizeof(WSAData));
; F* @$ R. \0 n! M" A  G   ::ZeroMemory(&server,sizeof(struct sockaddr_in));: ]8 d, S* X+ Z; i6 I, I  a% C
}: j& A2 X; y# u; W, g' _! \# O$ E9 I
void __fastcall TListenThread:oError()- s% i$ d  ^: b% p! w9 T
{
# ~( n' x" l! ^5 _+ L% S   if(m_Socket!=INVALID_SOCKET) closesocket(m_Socket);$ n! \0 V; ~0 v4 |
   WSACleanup();
9 ~2 _/ k& |( G   return;# S0 s) N+ r) j0 h$ z- k
}& u  x% ?) u* P5 S  C  D9 L
void __fastcall TListenThread::InitSocket()
1 L4 M! m" b3 z, N9 U) w{
: o/ v5 S) c9 z   WORD version=MAKEWORD(2,0);
3 b9 o8 |* B+ o/ N1 s/ k   if(::WSAStartup(version,&wsaData)){( ]  W' s0 E0 Q1 ?  X1 v
      sprintf(szTmp,"Failed to intiailize socket,error no:%d",::WSAGetLastError());
+ z1 a# z0 V! L6 v# L6 k      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);, y9 i% ^, i* P' ?
      DoError();) o; |- }/ z' L8 u7 r7 `
      return;+ j3 f# l& [+ l: [( F
   }
. B2 F% [! U4 W) g1 H}) H8 }2 R( ~3 o" N
void __fastcall TListenThread::CreateListenSocket()
. ]! J; `/ m" P. m6 o! D, f{
1 g# J# h9 ]+ k& K; a" d3 J   switch(m_Protocol)
: W9 h' ]8 M( |$ [1 J6 l) n7 U# \   {' e' N% f& Z- S6 O, H$ z
      case UDP:
0 @6 i, Q( Y  ^; e& H  \         m_Socket=socket(AF_INET,SOCK_DGRAM,0);
3 C5 w  \1 x; k; d  L         break;
. N' B9 d4 i& i0 M      case TCP:
  ?1 b$ n& @/ a7 I" }         m_Socket=socket(AF_INET,SOCK_STREAM,0);& E) E' {2 ~. ^2 Z# k
         break;0 g# e; ^; A2 S# C# b& D
      default:
: w& z! e0 Q" K8 |* Y         sprintf(szTmp,"Error protocol!");
: s- R$ ]  ^% A6 ]2 ~1 }$ F  M         ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);
$ S0 T$ S  Q9 ?3 u# y3 d         DoError();1 K6 y" `' V! y" i, _5 l- M! E
         break;
" e' s0 i/ U# w- x3 Y   }
- R7 E% j, ~7 C8 K6 n- b/ H   if(m_Socket==INVALID_SOCKET){
( _7 s' M# S# [: c8 A& \      sprintf(szTmp,"Failed to create socket!");
, ]" H, {6 M' w/ R" F, F      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);
' u# ^% {$ p/ `      DoError();
9 S, a* i2 h. v) A1 F      return;" u+ E9 }; Y; R. ?* E- \
   }
, S3 e8 U8 q* C+ f' e4 ?% ]}( x- D/ ^) L4 |- F
void __fastcall TListenThread::SetListenSocket()" |" |& g, I- P4 {7 I* U, I
{" y  r/ w+ a4 V# A! Y! D; Y5 ?6 A+ w; f
   server.sin_family=AF_INET;5 }! J( I7 r! T& n% v4 l
   server.sin_port=htons(m_Port);2 v( D. A4 s* c; `4 T
   server.sin_addr.S_un.S_addr=INADDR_ANY;" F: u, c5 K" c) a) g; C1 B
   int NewOpenType=SO_SYNCHRONOUS_NONALERT;
2 T4 Z5 n2 J: p+ E/ _   if(setsockopt(INVALID_SOCKET,SOL_SOCKET,SO_OPENTYPE,(char*)&NewOpenType,4)){' Z3 n; s; V/ |2 K0 K: S
      sprintf(szTmp,"Set socket option error,error no:%d",::WSAGetLastError());7 J& X! V( n7 M* m# n
      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);9 t+ H8 Y& M; o
      DoError();
' `+ H4 A5 n* i' g      return;
$ Y, W1 ]/ i- W5 ?  n- \- `   }, r. x# S- n6 e+ ~+ ?0 i* X1 z
}
! L' b3 m9 A+ |# F1 uvoid __fastcall TListenThread::BindListenSocket()4 h& w, b( C2 w0 }$ P9 e
{
) q/ W/ ^! ]7 Z" U$ m( t, W# h# l* P    if(bind(m_Socket,(sockaddr*)&server,sizeof(struct sockaddr_in))){3 V. W, [8 Q  B- `
      sprintf(szTmp,"Failed to bind socket,error no:%d",::WSAGetLastError());
' }5 {& R1 P& m      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);
0 Y! L; f3 {* g8 V$ p2 r" X      DoError();+ _; ]% U; Z: @8 d$ T0 `7 D% h
      return;/ E5 s# Z' _1 f% H1 A( x
   }4 [" y* V8 K# Z; G: Y* U

; N! u7 d& v$ V+ P8 N& z}
: T% {% T: X3 N( i8 U7 K8 Y6 Qvoid __fastcall TListenThread:istenSocket()
+ m( o, j# Y) J{
) A5 @4 ]; N3 S5 ^1 U  if(listen(m_Socket,SOMAXCONN)){
2 Z0 N) S( [  |) P     sprintf(szTmp,"listen error,error no:%d",::WSAGetLastError());
+ K+ Q3 K# g% `' X     ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);) a6 p- \) k1 w0 e
     DoError();4 s' z) D/ t7 {3 |
     return;$ M& q) N6 r; n' U* B$ R! x' q' ^9 S
  }
4 z$ d" }3 Q) d( r- o/ g8 N  //Determine whether there is any connection
7 h& M2 P4 |0 O- k( P  FD_ZERO(&FDS);
6 |, {/ ?7 p3 u  N* X( z  FD_SET(m_Socket,&FDS);# q2 O9 g) }% b2 w9 V
}
& k  m' w* |) F1 y5 x& s- u7 Kvoid __fastcall TListenThread::Execute()
: a7 H* b. l2 l% k: b{
, g) ]9 G4 r- O' {2 G0 o/ T5 q7 m( [   char buf[4096];
4 _) ~& {5 Y" M5 z/ q   struct sockaddr_in from; //for UDP. t$ [: U/ k" V( f- R4 N1 S
   int nLen=sizeof(from),nSize=0;  //for UDP
- Z- r0 y: `+ S- x7 ?   InitSocket();! i$ p3 g7 u8 q+ D% D: e
   CreateListenSocket();
# i4 n, J) E6 Z1 ^2 C9 _7 _   SetListenSocket();* N; R  l  Z* ], r* E
   BindListenSocket();
; G+ V8 F% U1 i4 a) F, V$ G   if(m_Protocol==UDP){
$ ^0 T% z* `* [9 ]+ Y" W: g      while(!Terminated){2 C6 V* X- ^" t1 Y4 k% ^
         int nSize=recvfrom(m_Socket,buf,4096,0,(struct sockaddr*)&from,&nLen);
# Z8 _# z6 S0 Y: K         if(nSize>0){8 l8 L: O% p9 ]: U% B; E) ?3 h
            buf[nSize]='\0';0 U& y  [+ k& Z2 @0 Q9 R
            PSTNForm->Memo1->Lines->Add("Received Length:"+String(nSize));
. I4 Q5 C" R" C0 D. J8 Y7 J! M7 u3 a            PSTNForm->Memo1->Lines->Add("Received:"+StrPas(buf));
2 u+ K, @7 c/ C- c3 p' y            ::Sleep(100);
8 M5 V9 K8 w5 V" o8 S! Y2 ^$ B            sendto(m_Socket,buf,nSize,0,(struct sockaddr*)&from,sizeof(struct sockaddr_in));1 Y6 B. }1 f3 [7 Q
         }
9 R. R% U3 H4 F& \         else return;4 x5 E2 _' m8 N1 |3 t6 c
* P6 L; w& G+ H+ u
      }/ K/ h1 g6 _' d: G8 u
   }
+ Q6 ^1 k. r4 p3 @$ f! Z! H   ListenSocket();: _' X& K/ W" G) H% Q1 i7 a' o
   struct sockaddr_in client;7 l% ~7 Y1 l# ]# [, S
   int nLength=sizeof(struct sockaddr_in);/ x/ Z8 v0 L* r* |3 X5 e
   while(!Terminated){
3 n5 y! d/ F& ^& k- I3 G1 ]& \1 m      int nError=select(1,&FDS,0,0,0);: `" B5 x" i( g7 G* |) Z
      if(nError<=0) Terminate();
7 N2 Y0 J* M' J1 y& [      SOCKET m_AcceptSocket=accept(m_Socket,(struct sockaddr*)&client,&nLength);
. S5 Q, V; Y5 n! V; v      if(m_AcceptSocket==INVALID_SOCKET){  j! M4 W8 x9 ^. S
         sprintf(szTmp,"Failed to execute accept,error no:%d",::WSAGetLastError());
& m8 U$ s2 E: K! j; Q. R         ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);, Z. P4 K# ~  c, |' L$ Y, ^5 ?
         DoError();
) E" I$ T" [( y5 a" B1 y         Terminate();9 z: s) C6 [# n# U6 t% p
         return;
% E# P+ L) M- T+ l      }
7 o" O5 u/ l# f% Y$ h      TCommunication *pCThread=new TCommunication(m_AcceptSocket,FALSE);
6 m4 h2 G6 Z. L" U      pCThread->Terminate();6 a% {! `/ c4 Z
      pCThread->WaitFor();
# |9 M/ I$ ^# s  H# ?2 f( o   }/ h) ~9 {( T& O. }4 C. F
}/ X3 |$ Q5 C1 x) E4 f' U4 T9 f
//************************PSTNForm*********************************************//
. m9 @, b$ T7 j/ C  p$ |& g4 N7 F2 T__fastcall TPSTNForm::TPSTNForm(TComponent* Owner)
9 K$ x" J& k+ F% T7 R9 ^( t   : TForm(Owner)
4 A' q; ^$ k: ]- e{: O$ Y! O6 b& @% L
}
$ L- y. @* O2 |2 x  xvoid __fastcall TPSTNForm::Button1Click(TObject *Sender)0 m! q$ i8 G' z  h- e8 c$ B
{- z8 F+ Y" M8 r
   Close();! U6 S- ^2 V; D% g: y
}9 g8 j7 Y9 Y' |; H
void __fastcall TPSTNForm::Button2Click(TObject *Sender)
5 {5 c! ^+ C% c) o4 o% ~! T{% |6 ~. P. e3 V- e* P5 x
   if(pThread){
& y3 a8 B/ H9 E      pThread->Suspend();
- J. i$ Z$ x7 }. T      pThread->Terminate();
2 P( Q7 R5 B; s3 B( E* p- a      delete pThread;
1 y, I7 R5 n$ }' Z      pThread=0;/ |( R8 }) f# H( ]! V/ f5 s' w
   }
, f4 ?+ v- Q8 d+ H$ z" b' D   UINT m_Port;1 _* H/ Y7 j0 m9 A5 n; F* {
   try
7 p! u/ \- p5 N) }( _3 S   {7 j* B' K0 y8 P- N+ O
      m_Port=Port->Text.ToInt();' n! r1 G4 `5 X  ?
   }) f8 F( K) f/ r! e3 `8 ~4 Y3 R
   catch(Exception &e)5 F2 `+ z/ x5 s8 x/ I6 Q/ z
   {
9 i! `, r; b( Q, Y' w  u: h8 ~      ::MessageBox(0,e.Message.c_str(),"Error",MB_OK+MB_ICONERROR);) B2 D8 c9 t% D6 Y
      return;1 f1 r  g- k! z% r: i7 ^6 B, Q- ]+ @
   }
4 {$ k( |( M5 `6 H- [& d) g2 e   PROTO m_Protocol;
! Y! h, g$ O$ S) j0 [   switch(Prot->ItemIndex)8 Z2 U8 V" l2 ~1 z
   {; C5 E3 {& I: N9 g, ]
      case 0:2 e9 }0 V& Y8 U' Y4 p
         m_Protocol=TCP;" V4 l  [, Z+ O- `. n
         break;, M4 V8 M% @0 q' y( T% G& F) v
      case 1:
1 U5 ^8 z/ p1 Q7 T# h         m_Protocol=UDP;) ?; ]- r; P% c  g' H( j# |# C
         break;, u! Z- K2 T1 j9 ]
      default:
. e4 e% z6 B1 m3 Z) [/ v         break;* h& G/ L- O7 c1 u6 u5 w. T! j9 p' E
   }
; n" j' F6 x: h( m+ O% o6 g0 o   pThread=new TListenThread(m_Protocol,m_Port,FALSE);
5 r3 k* H! m! l1 p3 d1 `! G0 I- n   //pThread->Terminate();
' Z" b! i5 C8 M/ W5 A1 |}/ ]5 A, k, D! Z8 E9 z; M, x/ O
void __fastcall TPSTNForm::FormCreate(TObject *Sender)2 x& Z* d0 i# [. u2 h# u" }
{3 y9 b" Q5 o  y, x8 f* P7 Y2 r/ I
   ::SendMessage(Prot->Handle,CB_SETCURSEL,0,1);2 p5 g( P" L% b& c% ]% B$ `
}7 t! y/ d/ ~2 y' Y! ^& M

; q2 a, L0 i# N! s6 g+ s+ _void __fastcall TPSTNForm::FormDestroy(TObject *Sender)
- |. t/ o7 z: h$ f/ G{; u& i  ^4 H3 A* k1 N& @) }9 S
   if(pThread){! p- K1 L1 V) z
      pThread->Suspend();# m! s  V( h2 G( B- p2 {! |
      pThread->Terminate();}
4 r" m: X- v/ r  n}
( A4 |5 m( x6 |上面的代码,各位可根据自已的需要和针对自已的应用,在数据处理方面加以改进就可以了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-6-19 09:30 , Processed in 0.016282 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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