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

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

[复制链接]
发表于 2004-2-15 14:01:13 | 显示全部楼层 |阅读模式
在CB中用socket api来写网络通讯程序5 E& N: M: t+ A0 D
作者: kingcaiyao ,如转载请保证本文档的完整性,并注明出处。3 t' v+ |% A+ F; ]9 F5 m
欢迎光临 C++ Builder 研究,http://www.ccrun.com/doc/go.asp?id=5695 L. J( y3 @/ k- a( K  A
本文转自csdn,作者:kingcaiyao. D  B, l# @& e- k- h2 Z3 z
原标题:在C++ Builder中用socket api来写网络通讯程序(同时支持TCP和UDP协议)
+ o4 q/ K  @8 \, c原文:  http://www.csdn.net/develop/read_article.asp?id=19883/ h6 N; d" r/ @
4 r# f% A: p8 x7 v  y0 F
  x" `: \2 M5 I; q
在7月4日看完sockcomp.pas后,我决定用socket api来写一个客户端和服务器并且同时支持TCP,UDP协议,于是我就去做,现将代码贴出来(已调试通过)) I4 R" X% g( F) Z6 I% h
Socket api Client:
8 H& @3 ]5 s( U9 k# f# P4 H# d6 {, {: p0 @3 Q
#ifndef UDPClientH( O3 p" Y; r. P# K4 A% E
#define UDPClientH
0 J" [7 r8 b& h5 ]' `- l# G#include <Classes.hpp>
# B, n1 F4 J% e6 X' n1 m#include <Controls.hpp>5 Q0 [/ Q$ X& g* j" z+ r' w
#include <StdCtrls.hpp>  V- u" Z9 W+ ^: x) g
#include <Forms.hpp>, M/ u& @6 A  n
#include <stdio.h>2 ~1 `1 j5 ~# s! M7 S7 d
#include "CCEdit.h"- u, Z- F  n: X+ n# X
#define WM_SOCK WM_USER+100
* t! U. |! V& D4 m0 jclass TLANForm : public TForm' {# S. w3 V; d3 A8 i
{
; s4 F  m! n7 G__published: // IDE-managed Components
/ i0 x3 v) N# z   TEdit *Port;/ ]' l* f6 L. N2 s8 ?0 Y
   TLabel *Label1;: f- ~5 [6 O" {: I( ?9 Y+ p
   TLabel *Label2;
8 {1 D( B4 K7 U  s4 I   TComboBox *Prot;
9 q0 ~* D& `7 G# [" Q& ?   TButton *Button1;
: k$ }! x: F1 A, x; a& d   TLabel *Label3;% ?5 }, \7 V3 d( F% w3 N; J
   TEdit *Addr;, t" L& a% l0 v( X- t
   TCCEdit *TxtEdit;4 t) @, U: Y7 L& t+ i
   void __fastcall FormCreate(TObject *Sender);
) D+ `8 N; K0 T6 d   void __fastcall Button1Click(TObject *Sender);! N. m( v6 |2 i" O* H+ ^. R
   void __fastcall FormDestroy(TObject *Sender);
3 w+ V$ \2 Z! Y+ h& Uprivate: // User declarations
* C" a* {+ B# ]! ^- I   void __fastcall OnRecv(TMessage &Message);
9 s$ C7 J7 R3 B) h" tpublic:  // User declarations9 _$ b& C8 f' Q3 r- i9 v) `
   __fastcall TLANForm(TComponent* Owner);: l) Y' H8 ]5 r& F
   BEGIN_MESSAGE_MAP1 o  c. n1 S" u
      VCL_MESSAGE_HANDLER(WM_SOCK,TMessage,OnRecv);
( Y7 D* m. ?  e' _3 x   END_MESSAGE_MAP(TForm);! H* m' d1 U% i0 r) n& G5 l0 ~
};
3 f9 T9 D1 G$ @# Y/ ^! K  ]extern PACKAGE TLANForm *LANForm;
3 h+ P  L/ ^- H" D0 V4 W$ m#endif7 x* g4 b9 ?* M( u, X& y
6 N; M6 D1 ?5 u, }! ~

0 z" i8 h8 O( j6 @/ e.cpp File( \& ~* u. L& ~; \  w2 w

+ V6 h: G8 j7 G  l/ U4 x#include <vcl.h>9 W$ Y! l: H4 I0 `: Z9 T
#pragma hdrstop
4 z" {4 j9 E9 O3 p. q#include "UDPClient.h"
# L3 ~$ I6 M) g+ `" T#include "WinSock.h"/ ?7 a3 K' i5 ^% ]
#pragma package(smart_init)7 r$ Y6 ]0 M) X+ Z- k7 C
#pragma link "CCEdit"  j% n, z5 `9 ^- I5 z' X# z
#pragma resource "*.dfm"
0 G8 ]$ C" I4 q. ^" h) [TLANForm *LANForm;
1 u" {; v- S5 a* U& @1 n5 Aenum PROTO {TCP=0,UDP=1};
) ]. j  x1 h  Y( T& D  a1 BSOCKET m_Socket=INVALID_SOCKET;' X' Z' A* t; B  {. ]: C1 _) O
PROTO m_Protocol=TCP;
& s* T) u% @( s" f8 G__fastcall TLANForm::TLANForm(TComponent* Owner)& m$ b( w3 v" v' h5 d
   : TForm(Owner); j7 a" Z! o. B& S5 z1 T
{
; t6 E: J: x8 ?0 J' Q# F5 ]9 |2 ]; v7 B1 H) a+ i2 u
}4 [8 f2 S5 T# g  E5 p/ B
void __fastcall TLANForm::FormCreate(TObject *Sender); c1 \  A' e" A4 R6 b5 |
{
/ W* @4 r6 c2 O2 {   ::SendMessage(Prot->Handle,CB_SETCURSEL,0,0);! z8 Y7 R/ {: j" ?. z( f; O
}
# K) g- E0 ~1 `+ {void __fastcall TLANForm::OnRecv(TMessage &Message): O& B9 Q5 S3 m8 o& G9 h2 n- q! k
{* o- A" m8 D; x& T4 Y- Y5 F
   char buf[4096];8 o( v1 e2 r2 S  ~* `4 L
   int nLen;! F* v, B% _' @$ Q
   struct sockaddr_in from;' g, y; s9 y' Y" P! G( Y2 Z2 l6 ^8 z
   int nLength=sizeof(struct sockaddr_in);! K2 ?9 V8 t+ J( [* M- o5 R  [$ C
   switch(WSAGETSELECTEVENT(Message.LParam))
! y# N; r  I" e   {
; n* S$ K* ^- Z      case FD_READ:: k8 z+ m8 o! p  C; S; ?
         switch(m_Protocol)) l4 E- I9 N. H# R4 |3 w
         {: S1 H7 s- r. {7 m7 v+ I* F0 [+ @) {+ C# m
            case TCP:0 T7 h2 t1 [+ i1 `( {2 Q
               nLen=recv(m_Socket,buf,4096,0);; a0 u: {% O( n. a; }& l' Q
               if(nLen>0){
5 T% o7 R* b6 H                  buf[nLen]='\0';
$ b5 c. Z$ M+ t. l                  TxtEdit->Text="Received Length:"+String(nLen)+"\r\n"+StrPas(buf);" F) Q" A7 @% m0 F) j% I2 O+ B
               }
( o7 O' b5 O! |* K3 C, g               break;5 k5 b. {" V: t9 x
            case UDP:
% D/ x8 v; |( g4 G% d- ], F2 Y+ U# d               nLen=recvfrom(m_Socket,buf,4096,0,(struct sockaddr*)&from,&nLength);: |2 Z& h1 Z! [6 J' J/ h
               if(nLen>0){
) W% w# i2 p; n% |' w4 q                  buf[nLen]='\0';  z! P3 R' ~7 {# B0 ]; e
                  TxtEdit->Text="Received Length:"+String(nLen)+"\r\n"+StrPas(buf);
4 V! d  Y% V+ _" m5 G               }3 v0 N6 g& ?+ O2 N* H. V
               break;
3 l; r* g/ w% G5 {         }1 G8 V. r% j- Y' o
         break;# N  {; Y2 J9 i5 u& K- x3 ]
      case FD_CLOSE:9 v& m5 k( A2 x5 `. F
         closesocket(m_Socket);
  R' l0 ?- b7 U. ?/ G9 d6 [# V         break;
! A9 ^% o8 R9 M0 B) l3 O   }0 [0 }3 O: S9 ]+ f4 j7 D6 Y8 B
}) |7 W7 ]8 I+ x7 o

5 |1 q/ `2 l* f  }8 qvoid __fastcall TLANForm::Button1Click(TObject *Sender)1 K  m3 R( \5 q$ y& M; t
{
+ ^2 A0 S4 e$ h  Z2 s- L& I   char szTmp[256],buf[4096];4 k4 g8 N/ O( J
   int nSize=0;) i, Z1 ~9 x: ^! ]& t9 j0 r
   UINT m_Port;
* k5 ?, X1 Y" {$ q: }! e: i   AnsiString addr;9 z9 E' R" R% T
   addr=Addr->Text.Trim();  T- \+ Z; z1 Z; \: v) R) ^4 _1 Z3 x
   if(addr.IsEmpty()){
1 x4 Y3 K4 T+ b" @- I! }, z: L/ `      ::MessageBox(0,"lease enter the server IP!","Error",MB_OK+MB_ICONERROR);, w8 u5 @- v( Y1 V2 C. r# }
      return;+ [6 T4 I/ t  b& ]9 h
   }
+ t/ ^3 w" B# O0 q( q8 [$ p, ]% L   unsigned long nAddr=inet_addr(addr.c_str());
$ V% Z4 k% V* e3 z   if(nAddr==INADDR_NONE){
8 M! D2 L, f, w, Y$ I2 C      ::MessageBox(0,"Bad Internet IP!","Error",MB_OK+MB_ICONERROR);
: S( M" h* Q8 A! |1 Q! L# w      return;}
. w, i) n7 T& b1 c2 y5 n7 R3 T: s) ]' s- z% _. H, C0 _6 n
   try# l3 e3 K4 Q! y0 h  G# S' ]3 e+ C
   {* H' d7 p4 u! ]: y
      m_Port=Port->Text.ToInt();
* B8 O( U4 D) G8 R/ ~1 A  c+ t   }
$ t6 s8 k0 w: q% M1 e   catch(Exception &e)+ S. P7 o# o& V% ]' X0 y, G6 h+ V
   {
, d% |% |, t+ h. s8 W2 [      ::MessageBox(0,e.Message.c_str(),"Error",MB_OK+MB_ICONERROR);8 {! D  \+ d. D# z3 S
      return;* h. [7 ?/ [2 j) g' [) B3 S
   }
3 u3 D. A5 b. @$ x$ N, b' a   switch(Prot->ItemIndex)
  b4 ^# @7 B& q  H# D5 B7 o   {
1 u( h" m0 R2 @( O/ F6 n$ T      case 0:# g5 |2 `6 l. o( h% R/ ]- w
         m_Protocol=TCP;
6 l$ R4 f+ {# m5 U: B: p1 {         break;! x" [: Y4 L  d4 r# t0 t4 R2 A
      case 1:6 ^& O4 C, k; d% ^* r: K$ F
         m_Protocol=UDP;
$ y8 ?4 p5 h5 x0 i+ \         break;( S$ P( Y: E) @- M! D- z) `
   }7 Q2 e& g1 R1 r0 ^. W7 H! Q0 g+ q
   if(TxtEdit->Text.IsEmpty()){) E" g) q) M6 F& {# j6 H/ }
      ::MessageBox(0,"lease enter the text you want to send!","Error",MB_OK+MB_ICONERROR);
  R$ ^" e' ~" q4 ?      return;}
4 s1 G5 z3 }* y# `& M2 B( p
4 I0 u; Q+ t' D% d1 N   //Initialize Winsocket; `, I. M6 X$ l
   WSAData wsaData;; }8 W9 G7 m/ D: g
   ::ZeroMemory(&wsaData,sizeof(WSAData));  p  T2 T' |% U$ q% M( m* I
   WORD version=MAKEWORD(2,0);0 N# n6 e' o+ S1 g( U
   if(::WSAStartup(version,&wsaData)){" a/ p" I/ l& N3 j
      sprintf(szTmp,"Failed to initial winsock enviroment!,error no:%d",::WSAGetLastError());
! [6 c* B& E2 N5 F      return;}
2 z5 T/ b/ g9 j* \% n
8 z# u6 N! s( ?$ u3 d0 V  [9 l   //Obtain the active connection6 P! u7 r, S7 n; c6 c6 _# V6 A
   char ComputerName[255];! Y: r  J/ F# N2 o/ H2 `
   gethostname(ComputerName,255);
$ }6 a& Q3 P* g. M   struct hostent* he=gethostbyname(ComputerName);
% a: `: B( `% R" [, Q+ ~   if(!he){# w- l' v+ o  O; y4 a3 d
      sprintf(szTmp,"Failed to get information to host!","Error",MB_OK+MB_ICONERROR);$ @2 L2 O, G/ z. A! {
      ::WSACleanup();: U- `5 F, H+ R6 I8 C$ d
      return;" l' w9 `( ~1 M6 F: x7 q! q
   }
8 z% v- `+ k9 a1 N   //create new socket
$ j1 O) M) |( i) G0 G: I   m_Socket=INVALID_SOCKET;% f) \4 a# q6 }: n
   switch(m_Protocol)
8 F/ \% u) u" a) t9 N  K   {( W0 ]1 ?: Q. E5 T
      case TCP:
. y; G" a. ~1 {7 U9 H- ?         m_Socket=socket(AF_INET,SOCK_STREAM,0);
* T/ @2 c  G# h0 i- V3 E) {         break;- ~+ n: E$ C1 k2 H
      case UDP:6 ], @# H- p, t$ @
         m_Socket=socket(AF_INET,SOCK_DGRAM,0);$ j9 i  H5 i) a
         break;
6 g2 v9 ~- l8 X2 b* R   }4 n, h+ g2 K3 e+ J* |
   if(m_Socket==INVALID_SOCKET){2 u: g1 h9 ?8 c% b5 y1 T: H. r
      sprintf(szTmp,"Failed to create a new socket!,error no:%d",::WSAGetLastError());% H. I/ l& d/ Q
      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);
1 Z2 \) D/ L9 c! W+ f$ G$ @      ::WSACleanup();
  s& e2 m4 i5 p9 Y% }+ t      return;8 V: B% B5 h( L7 t# ^
   }# k4 y# a5 M" v- d) z2 D$ f6 Z
   //bind socket5 P9 e1 q; f$ j5 g! s9 \
   struct sockaddr_in client;
+ [* b5 v0 W; U   unsigned long nClient;
' M8 J: h) ?- o. P   memcpy(&nClient,he->h_addr_list[0],sizeof(int));
# X5 z, b7 Y$ A9 o   if(nClient==INADDR_NONE){$ c0 A* c2 k! n6 q3 X6 R7 A
      sprintf(szTmp,"Failed to obtain the local machine's IP!","Error",MB_OK+MB_ICONERROR);3 M9 \' t" y% e" A* R% S% k+ X$ H- R# S
      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);
( P# C$ ^: f; @2 W5 W. d5 G" y      closesocket(m_Socket);
, {  _% o, F5 I0 i8 Z7 l1 c/ q      ::WSACleanup();+ L' I# K- t7 m
      return;: L& ]% H9 o. p( m2 x- P
   }! q4 B. E( E$ o
   client.sin_family=AF_INET;2 [: G/ C% J2 _$ G' I9 W* e
   client.sin_port=0;
* ~: x2 U: k8 `! Y1 ]0 w   client.sin_addr.S_un.S_addr=(int)nClient;1 ]" |2 b, D" C" y3 K7 x" L1 f
   if(bind(m_Socket,(struct sockaddr*)&client,sizeof(struct sockaddr))){
0 j7 [' |  V7 Y: V+ V$ r5 w% g9 y      sprintf(szTmp,"Failed to bind socket!","Error",MB_OK+MB_ICONERROR);
1 T3 _5 B( x$ y' l- t8 E; [      closesocket(m_Socket);6 I( \, Q4 f) r9 _$ ?1 I2 c0 e
      ::WSACleanup();& H2 Q& s5 r) o# F. Y
      return;}
4 A7 `# I! j) C   //connect socket  G7 U+ e8 ^! i# f* w
   struct sockaddr_in To;
2 R, r& u3 i& [3 y   To.sin_family=AF_INET;8 Z4 R& Y5 s! |! Q' t; t
   To.sin_port=htons(m_Port);
$ O8 R4 W5 w6 s7 i  q9 T   To.sin_addr.S_un.S_addr=(int)nAddr;
6 l- g0 G) F  M5 B( d8 V   fd_set FDSET;9 c: S, @' A# F$ q
   FD_ZERO(&FDSET);
: W: x1 p2 y4 w+ h' c   FD_SET(m_Socket,&FDSET);
# {' v, y( p' M, ]$ B  X& m( ?
2 N; T" y7 r1 I, Z6 G5 [
3 `* Y0 K, s6 P- o, l4 n   if(m_Protocol==TCP){
& H( z$ O  @# k- }! x      if(connect(m_Socket,(struct sockaddr*)&To,sizeof(struct sockaddr))){2 r' m8 X/ A+ l/ [
         sprintf(szTmp,"Failed to connect the object!,error no:%d",::WSAGetLastError());
- T% U5 a4 b* x8 E         ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);- D/ i# G# m8 Z& A' }6 d
         closesocket(m_Socket);
0 R% O& s+ O2 I         ::WSACleanup();4 \3 P3 T8 Y5 M" {8 L8 Q
         return;
/ d; S( T& g% c( N5 w; n7 M      }
" w) o& j* O$ U- Q9 s& M      int nError=select(1,0,&FDSET,0,0);/ r9 ?9 U3 ?: J( d) h: z3 J5 F+ M! \
      if(nError<=0){+ r' a. e9 x* w# [
      sprintf(szTmp,"Failed to select socket!,error no:%d",::WSAGetLastError());
5 C. K, F8 n7 {! H  ]4 W      closesocket(m_Socket);" ^0 ~$ f' E; y. `+ B3 q
      ::WSACleanup();
- c! R/ l5 ^+ O7 b0 C. _, V) v5 y      return;}
* }& B3 k8 }  _+ a   }
2 t2 E& r8 Y+ ?   //Send data) p" Z8 t0 z- I7 }, [6 C& |
   int nLen=TxtEdit->Text.Length();- c( Z$ a; R6 f. F# y4 g/ F6 A
   if(nLen>4096){3 K' X8 b+ O, L6 u$ {5 Y8 Q
      sprintf(szTmp,"The buffer is too size to send,it shoud not be more than 4096 bytes!");0 F* m( A* Q  P/ m
      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);
5 v- ?$ w( N9 m! s  n7 a5 U# ]9 ]      closesocket(m_Socket);
: S. E2 a; j2 O, W3 d      ::WSACleanup();
$ Y4 p2 f2 C" y) e4 j3 o      return;
# b; W9 T& `! H   }. V; E, p  s& N9 h' S6 L
   strncpy(buf,TxtEdit->Text.c_str(),nLen);2 }3 y6 H7 w* T* g( ?0 V3 O; b! B9 [
   switch(m_Protocol)
3 \* T2 z+ }0 E. |  `   {/ y% i% E- l9 A0 C( z7 g1 M
      case TCP:
; s* m- V/ y4 E9 ~7 ~         nSize=send(m_Socket,buf,nLen,0);
  {! w& |5 J" v- Y7 O' V; Y         //ShowMessage(nSize);' ]3 q# d0 x' R( J
         break;: |/ Q3 R- d  Q) w( |
      case UDP:8 Y" k( r( M% U. e5 c/ [8 J
         nSize=sendto(m_Socket,buf,nLen,0,(struct sockaddr*)&To,sizeof(struct sockaddr));
7 B: b5 _0 X( }* v  ~6 j+ Z3 j* j         //ShowMessage(nSize);* S9 }8 d9 k# y7 x4 Q* u7 y
         break;
, ^6 n' e1 u3 x0 i6 S
4 s0 }+ v4 T. r7 [/ P' }6 b: z   }
* s8 B  `. F$ o7 p3 G" Z1 ?" w1 u9 m' I, I   if(::WSAAsyncSelect(m_Socket,Handle,WM_SOCK,FD_READ|FD_CLOSE)){3 [' _6 Y# x* e% i; @6 L" [
      sprintf(szTmp,"Failed to register socket event!,error no:%d",::WSAGetLastError());
1 |3 j8 h0 U; ^. C9 P* X7 j3 e; Q      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);
/ A/ [0 `7 ]" y$ a4 R- G' Q( M5 ]/ ]. R      closesocket(m_Socket);
# ?% C9 \, t, F( ^# ]- V! ~      ::WSACleanup();8 G4 u( f- q8 b( i
      return;}
! z% I" d$ k4 S: @( @" j. l  E: d# C}
! q0 w& k/ F6 l: }: A2 \9 Jvoid __fastcall TLANForm::FormDestroy(TObject *Sender)
: l( T% n' U$ r) T0 U{
! x9 R1 d# ^9 U   closesocket(m_Socket);
/ s3 y, r) w- c- @% O9 E   ::WSACleanup();. t; J& W& Y( D& _9 I$ L( }
}
6 Z' Y' }2 ^' j* c$ b  L; b1 {- B" @4 i2 |; ^- q% J
Socket api Server:* l6 Q: `( i1 e2 L( g
.h File% m; v) D: G) `' I0 c, r
#ifndef UDPServerH
0 w# N! l' V  m# G1 e8 A; t#define UDPServerH
- R- M* G; v# s# e9 T% c, U4 C#include <Classes.hpp>; `5 n0 `  C" i1 T$ y! {4 O
#include <Controls.hpp>; w: I3 V8 S- A8 i4 m9 z7 n3 x
#include <StdCtrls.hpp>& M' X/ z% S- ?1 Z
#include <Forms.hpp>
1 h- I1 G) E1 s, @: I#include <stdio.h>8 n, ^/ W) T; D1 d  A1 @
#include "WinSock.h"/ D: @! D3 J6 W# G
/*#define WM_SOCKET WM_USER+1000/ d' i7 z+ @  K# k! C0 s2 y& D
#define INITSOCKETSUCCESS 0: C# U  i* \4 e" X: A
#define INITSOCKETFAILURE 1
+ ?6 e1 L! i7 o#define CREATELISTENSOCKETSUCCESS 2
2 \9 J- I$ F$ N) ^5 ]  Z# y#define CREATELISTENSOCKETFAILURE 3- U7 q; W) a% S
#define SETLISTENSOCKETSUCCESS 4
+ w9 K0 p. R' G2 e) t' A" J#define SETLISTENSOCKETFAILURE 58 f7 L/ e) p3 ]& u8 J. P
#define BINDLISTENSOCKETSUCCESS 6
! a# b; N7 ?. p; M" A7 R* I#define BINDLISTENSOCKETFAILURE 7" T4 s8 W! G9 K2 p5 y
#define LISTENSOCKETSUCCESS 8
# Q# R9 V3 D' w9 F# ]2 P5 \#define LISTENSOCKETFAILURE 9
2 {. W$ d' Z' `* f6 j' [& ]#define ACCEPTSOCKETSUCCESS 103 |0 W& |  ?# K9 |7 X- }4 |% B
#define ACCEPTSOCKETFAILURE 116 ^) T0 ~1 k# j. R
*/; [8 {* \/ V7 ?8 L2 R8 F3 {
class TPSTNForm : public TForm3 N& J+ I. ~/ I1 D2 L) D
{
: O6 y9 f# ^$ T& O2 t6 a5 e__published: // IDE-managed Components* K$ n5 V- k) h" g9 R) m) n
   TEdit *Port;
/ U2 l  }' `1 Z   TLabel *Label1;1 a2 h! b0 N* d/ r
   TMemo *Memo1;" E" |7 q% x) \
   TButton *Button1;
0 g, ^. b) k5 X- R5 F; U   TButton *Button2;
$ s3 v. r% Z- O   TLabel *Label2;
; U% h6 F0 ?- y/ ^; O5 P   TComboBox *Prot;
0 W( x6 f8 c; g9 a  c! e   void __fastcall Button1Click(TObject *Sender);: V7 ?5 p, e9 N- `
   void __fastcall Button2Click(TObject *Sender);+ p: x  c/ B9 P4 H
   void __fastcall FormCreate(TObject *Sender);
- U7 S+ m2 K; n% Q   void __fastcall FormDestroy(TObject *Sender);; o' `: u+ k0 q! b
private: // User declarations
( O( C- }$ P/ o: [8 P; D5 fpublic:  // User declarations  d9 b4 Z7 ]/ |
   __fastcall TPSTNForm(TComponent* Owner);6 v- }: ?0 ~" z( _3 r2 Q6 U9 Q7 S
};. b1 w; h( ^: d4 h3 Q
enum PROTO {TCP,UDP};
) i  I6 h  r2 L; Hclass TCommunication:public TThread    //Communication Thread7 A' ~1 }2 i1 R1 o( o# b+ |" |* A2 t
{- {' R4 H) o  J9 F8 P0 m0 R
private:
' F5 |9 V, w; f1 Z% |' ]: P   SOCKET m_AcceptSocket;
+ w& F5 \. e% T% {2 j- j1 u6 a2 i- p   char szTmp[256];//ERROR MESSAGE
1 Q, I# J# p- y" @public:  ?' p# x+ ]2 T- d- d
   __fastcall TCommunication(SOCKET m_Socket,bool CreateSuspended);
6 e4 l9 @( y) n8 ]0 b   __fastcall ~TCommunication();
) @1 N0 A. q+ U1 qprotected:. m/ ^/ j) u! q5 o, |: J
   virtual void __fastcall Execute();$ P- I3 A( `# A# h& z
};  E4 L3 `+ `" Q& R& \
class TListenThread:public TThread //Listen Thread
0 ~7 X, d' _9 |. {- Q{7 \% W% }3 A/ _1 C* L0 b& O
private:& a$ x. B3 L+ H% Z9 F
   WSAData wsaData;: h# i" K/ i% L0 Y
   struct sockaddr_in server;: M" o6 r( t- I3 T1 T
   fd_set FDS;
/ P' _( G8 i* Q' v% W! Y   UINT m_Port;
4 W# u6 T: s! K$ K8 t8 U   PROTO m_Protocol;
4 F. w( S1 ?* y# p. V& S1 M   char szTmp[256];//Error Message9 L" U3 c* E+ O- m; J
public:  i% W4 w4 t6 [7 e1 Z
   SOCKET m_Socket;
& p: U' V- V2 e$ [' P7 k   void __fastcall DoError();
, n4 L; E  P3 f& p% ]' H; V5 q   void __fastcall InitSocket();
) Y3 @( K5 G9 R0 R' f7 c  t0 a   void __fastcall CreateListenSocket();
$ ?3 G5 @, R5 n9 q& v   void __fastcall SetListenSocket();/ D; I4 V  n6 J" r# Z% [
   void __fastcall BindListenSocket();
4 o+ P* W% |, w   void __fastcall ListenSocket();
6 L1 q9 J1 N5 v6 T* ?, J* H( v$ V9 l! y/ [/ B& [& C7 G
public:) k3 H* B: H1 |6 t
   __fastcall TListenThread(PROTO m_ProtocolA,UINT m_PortA,bool CreateSuspended);
( ?% }. L/ L# Q: W  }4 E   virtual __fastcall ~TListenThread();' T$ m( Z# a- L
protected:- ?1 g- ^8 ]. c+ f. c9 y( p
   virtual void __fastcall Execute();
4 V9 Z- q# x1 F# p" \5 b* I$ Y% w7 I};* p2 e" s# F9 Q! J& k
extern PACKAGE TPSTNForm *PSTNForm;! h1 @% |5 z# x& d+ r. M7 o
#endif  U1 ~; k" Y7 ^& B% @8 `
.cpp File
7 I  L3 R5 i6 B0 W1 C#include <vcl.h>2 s; m: O4 ?/ B& h" a
#pragma hdrstop
3 E6 O+ a* R* o9 h- }9 @! i#include "UDPServer.h"8 b3 z  \: x/ u. y) s
#pragma package(smart_init)2 O0 f- l5 ]" x, M  X  o  y7 x/ {) ?
#pragma resource "*.dfm"
: D- }5 W5 t# k7 U1 BTPSTNForm *PSTNForm;
2 c. X' G) T5 bTListenThread *pThread=0;9 _7 k6 ~' ^/ O8 s
//******************************CLASS TCommunication For TCP****************************************************
8 C5 N, Y, p7 j' E; d1 P__fastcall TCommunication::TCommunication(SOCKET m_Socket,bool CreateSuspended):TThread(FALSE)" b% ~- S- R+ _+ |- P9 F
{. m+ e$ p& X4 M# F
   m_AcceptSocket=m_Socket;
, O+ B* m, v( I   szTmp[0]='\0';
4 P5 |. f. I# {6 o' L- k$ |   FreeOnTerminate=true;
6 f& r4 {6 \! L+ [  b}
  @& h: w, ~7 u! x* Q* i, D__fastcall TCommunication::~TCommunication()
) S  N, y0 l- y8 u5 y{
- f$ E. N5 F5 T% E  // closesocket(m_AcceptSocket);: W% M6 l) V3 u
}
/ ^7 g  a+ [; rvoid __fastcall TCommunication::Execute()
% q7 F8 d+ U- J0 v( F; F; B6 z{
4 P2 b0 [& X/ B% y2 y; D1 |) [2 L6 O   char buf[4096];: J1 v# D& i( l& {6 r* g% H
   int nSize=0;
2 k3 }8 t8 `; y9 ]; W$ W5 j4 F, A8 Z   nSize=recv(m_AcceptSocket,(char FAR*)buf,4096,0);$ ?, s0 {7 g' O1 l
   if(nSize>0)* k; R" r1 G) B) t# D
   {$ y0 b/ q! {1 M( H/ ]+ b9 ?
      buf[nSize]='\0';  F. Z3 x3 A+ g3 N8 O
      //Display6 C* I# D+ m* J/ |: N
      PSTNForm->Memo1->Lines->Add("Received Length:"+String(nSize));
6 q- U2 ]$ W  X9 U' @9 g; P2 c      PSTNForm->Memo1->Lines->Add("Received:"+StrPas(buf));
% O( O6 Z* T3 O3 f' }5 y; c: a# A' Q      //Deliver
; Z! l. I9 N  X; @+ U. E      ::Sleep(100);3 _- O. t4 t1 Y, @% l0 ?
      send(m_AcceptSocket,buf,nSize,0);7 s/ ^" I( c9 m, v9 P
   }% `: ~1 z/ y8 s! u4 }3 `, t+ q

9 J# N7 l( B- R  z( Z}1 ?+ @) ]8 ]( v/ f# s* K9 J" |
//******************************CLASS TListenThread*****************************************************
: m" D3 D1 y1 N- p1 e; A__fastcall TListenThread::TListenThread(PROTO m_ProtocolA,UINT m_PortA,bool CreateSuspended):TThread(FALSE)
* s% y6 ]# v! E, M0 c{
# h6 U: r& W4 y5 W6 S) K   m_Socket=INVALID_SOCKET;, q$ ]6 k7 z# Q" S# ~( s
   m_Port=m_PortA;; X1 W$ B  L/ D2 h+ W& r
   m_Protocol=m_ProtocolA;7 \$ W3 a7 O8 C% @2 p
   szTmp[0]='\0';
) M& j2 j, J7 T  B   ::ZeroMemory(&wsaData,sizeof(WSAData));! f# {! I! u  v: u7 f2 G, N1 f0 \% v
   ::ZeroMemory(&server,sizeof(struct sockaddr_in));
" t- R8 c; e) M   FreeOnTerminate=TRUE;//Automatically delete while terminating.9 q. d+ b% G  J0 m( c5 l- f( ?3 E
}
2 N; N; d7 X! |$ `, P4 H1 y__fastcall TListenThread::~TListenThread()% S0 x; Z; h2 ^0 c5 N. W* |
{4 B) q/ k7 C6 n# E$ ?9 H8 a2 k
   closesocket(m_Socket);
% I' ^# g) c6 ~) q+ e& Y   ::WSACleanup();* y* O& D* w0 S, s0 K+ M
   m_Socket=INVALID_SOCKET;( k  s! [/ |' }7 x# |! p0 R
   m_Port=0;
/ j/ I5 z5 ]0 {   m_Protocol=TCP;: g: O9 q1 a# b
   szTmp[0]='\0';
6 K) F5 }; I7 g( q. I) t- b$ e   ::ZeroMemory(&wsaData,sizeof(WSAData));
* E  J$ z7 T+ D9 M* D6 Y   ::ZeroMemory(&server,sizeof(struct sockaddr_in));. `3 ]3 G2 Y$ v0 D3 Z5 P
}; y8 [3 l: {$ |5 e: X! T/ F
void __fastcall TListenThread:oError()
/ y+ s8 D! R' I{
* p+ U* }& z" V9 M+ ?" j$ {   if(m_Socket!=INVALID_SOCKET) closesocket(m_Socket);7 i8 [8 i) a! |8 D/ {
   WSACleanup();5 W2 v) @$ K  w
   return;8 p# l" w& B( R
}
& |" q1 p0 a/ E" avoid __fastcall TListenThread::InitSocket(). ]3 P6 h* e; u& l. Y
{
6 U% ^( V' T, a: l0 G   WORD version=MAKEWORD(2,0);
7 u9 x4 R' M7 l   if(::WSAStartup(version,&wsaData)){
; n* Y) z5 M6 o% f: ?      sprintf(szTmp,"Failed to intiailize socket,error no:%d",::WSAGetLastError());+ G6 r. m5 Z" j9 l7 N6 O! z2 V
      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);% }( C, b! _2 n6 A
      DoError();) n  k% d9 ~8 S1 `
      return;+ Q- z  M( K8 r; B2 r1 I. e. f
   }8 p$ U9 Z: ^$ K+ T8 L/ j! v
}
# u0 u- j% ]! t4 J4 fvoid __fastcall TListenThread::CreateListenSocket()
  s& W, l3 Z$ ~1 [{
' F5 |8 r0 r6 u. f& M% s& b   switch(m_Protocol)
3 e2 y# u! X, h2 }: G   {  {# S, Q( U: H0 t4 a
      case UDP:5 D1 T/ v" p+ z7 t9 T7 @
         m_Socket=socket(AF_INET,SOCK_DGRAM,0);
& q9 v9 M5 R2 J7 t4 g) a         break;. y& ]5 ~$ [3 l
      case TCP:
, J  l. p" S4 q3 z         m_Socket=socket(AF_INET,SOCK_STREAM,0);
! V, d" z' c0 d, X. f6 N; q         break;3 S) o9 V2 G+ {' \2 R2 z
      default:
4 l! {- Y7 b( p% k1 o0 E  k8 h" [         sprintf(szTmp,"Error protocol!");
$ ^. J$ k" u3 }' ~# I         ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);
$ `- a4 h' U% f- j8 J+ V: d         DoError();
! U: y  ?7 U5 |3 ~, R) O. _7 N         break;
4 D2 S2 m4 b$ v; g   }
0 E( k; j; h4 u, [. l% `( @" X5 [   if(m_Socket==INVALID_SOCKET){1 E6 ?& q1 F. K2 J1 C+ v
      sprintf(szTmp,"Failed to create socket!");
. k0 Z" A$ f- U      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);
; l* Y2 R: e# o0 O% G# S1 U      DoError();" o, i" i" G, G/ t' Y
      return;& y$ [! O- u; p/ \( b, F
   }
" \+ M: v0 T; M) V8 F- w}
7 \8 n+ u: K# j; i4 c7 _4 zvoid __fastcall TListenThread::SetListenSocket()
+ y5 Z5 u* A1 w" ]9 d{& @9 }- g& b; u2 K7 \: F. B
   server.sin_family=AF_INET;
7 J$ }, J, z' B! A6 T   server.sin_port=htons(m_Port);
  }  x+ `) ~0 b+ Q0 ~, k5 c4 J  z   server.sin_addr.S_un.S_addr=INADDR_ANY;
& M' f' U0 b% Q/ @   int NewOpenType=SO_SYNCHRONOUS_NONALERT;0 t, N1 T) \: ]* z4 a; O  B4 R9 v
   if(setsockopt(INVALID_SOCKET,SOL_SOCKET,SO_OPENTYPE,(char*)&NewOpenType,4)){
' {  b% f' D, N( g+ S% D0 P      sprintf(szTmp,"Set socket option error,error no:%d",::WSAGetLastError());
. k# O4 o2 O* n      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);5 u7 @' R) i. N$ g( J
      DoError();
  f8 A2 Z  u2 m: r      return;
- z/ @- b  A+ ~6 i0 L3 A   }6 B" r  ]1 e( j8 N/ D
}
( `8 L& ]3 {) F6 n' w/ Pvoid __fastcall TListenThread::BindListenSocket()+ n& N' ~- X/ x- K. e1 X
{
: ?3 o# S7 w& a7 @; V7 `  s    if(bind(m_Socket,(sockaddr*)&server,sizeof(struct sockaddr_in))){
: D' l, S" x& r4 H+ d  ]      sprintf(szTmp,"Failed to bind socket,error no:%d",::WSAGetLastError());
7 M+ u; e1 Y1 ~. G" Y' `      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);
: v6 N" l( M8 k; L/ n+ v' B      DoError();
( W" P) Q4 [0 @  G5 X$ Q0 Y; Y* n      return;
, g" W1 \; q' I6 F   }. U& X+ Q! r3 j. n
5 O( }9 |, g7 s$ x% Y# a7 f0 ?0 ^! t
}$ W' v- h2 U% h7 \
void __fastcall TListenThread:istenSocket()
: A: A3 `+ Q* \0 A; R! N$ }' ?$ @9 b{
) a/ z, a! d3 P1 ^* F. P" |  if(listen(m_Socket,SOMAXCONN)){
) c& O. H* ?9 a3 B  z; S     sprintf(szTmp,"listen error,error no:%d",::WSAGetLastError());4 d0 v4 G& h8 A% ]' b
     ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);
2 K: C' `! a0 e' H* w     DoError();3 |; L. }) B. L
     return;0 W* A5 H  l" p
  }' x, d, K/ C1 \3 u
  //Determine whether there is any connection
, J; m3 U! g5 @+ V! X  FD_ZERO(&FDS);  H1 K6 o& x5 N" |, c; ]8 M
  FD_SET(m_Socket,&FDS);4 Y) e5 G6 ?% ]' ]- u. E6 c
}5 P; d- s4 A4 r5 V8 _
void __fastcall TListenThread::Execute()" `2 w. f3 A  ?
{
7 o3 l& ^: J' c- f, N- y' o) M$ E   char buf[4096];
" U# H1 ^. Z8 G% L   struct sockaddr_in from; //for UDP
- y; ?3 S6 L9 H( j+ R9 {1 {   int nLen=sizeof(from),nSize=0;  //for UDP
* j( R6 |1 P. P* \; {   InitSocket();
  s8 D/ m  p: z* B% k0 I8 H) ^   CreateListenSocket();) m7 m& u2 q8 n! ~$ h
   SetListenSocket();2 J# W$ w8 ]9 p
   BindListenSocket();
# w! y! ^/ a$ G+ y6 c& Q   if(m_Protocol==UDP){
" Q+ k4 L/ p7 F* Y4 t( g: {0 E8 Y( l      while(!Terminated){
& I( j4 @: {) k/ I         int nSize=recvfrom(m_Socket,buf,4096,0,(struct sockaddr*)&from,&nLen);
; c. O( I, L+ m         if(nSize>0){+ K, z- {; T2 ?$ v
            buf[nSize]='\0';
: g# n" Q+ o! |4 v0 r            PSTNForm->Memo1->Lines->Add("Received Length:"+String(nSize));6 I7 T4 Z8 ?  {7 P
            PSTNForm->Memo1->Lines->Add("Received:"+StrPas(buf));
, h8 `, K( J/ c, C3 A* f            ::Sleep(100);" m  b  J2 j9 B) Y5 F* S: X& r
            sendto(m_Socket,buf,nSize,0,(struct sockaddr*)&from,sizeof(struct sockaddr_in));$ L6 @" y5 @, Q2 s4 V! x% R" I7 {$ @
         }
2 d" r8 ~; v/ |. h1 W& \& I         else return;
" M. u. x$ s; Y
" B2 h" l: M9 O& o      }
" T( F) P5 Q# a& r0 m   }
$ r$ H/ m& o1 [  T% c   ListenSocket();
, u* p0 a8 D' {1 q0 a# ^- j- U, d   struct sockaddr_in client;
" R& p) B- Q/ }+ K- l3 V% b   int nLength=sizeof(struct sockaddr_in);
; C  ^! i! U3 A2 P; ~: [; M- {   while(!Terminated){
# x; z; \2 v: g( y0 ]& R' j      int nError=select(1,&FDS,0,0,0);
" a" n7 V! b& n# H      if(nError<=0) Terminate();
  t) \* E. Q7 o( o1 H) f      SOCKET m_AcceptSocket=accept(m_Socket,(struct sockaddr*)&client,&nLength);
% T" O0 y8 s! i4 _; t! l5 v      if(m_AcceptSocket==INVALID_SOCKET){7 I2 ?% D( Z8 U5 w6 Y: A% j
         sprintf(szTmp,"Failed to execute accept,error no:%d",::WSAGetLastError());
  ~; ~, r* V9 F% C# e; C         ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);
3 ]& k) b) ?! r; t( \7 E/ \         DoError();
9 W: x1 ?) d" x: q+ q! o         Terminate();7 d- f! S( C4 N" u0 g
         return;
: {0 g) Z& ~. u% }, l  k0 y- u      }& M' K4 w5 x# D8 `/ b, m5 T4 a( n+ P
      TCommunication *pCThread=new TCommunication(m_AcceptSocket,FALSE);
  N; m, l/ [0 x, H7 L6 |! u4 M, r$ M      pCThread->Terminate();+ B5 z  I. w; {" A4 l! ^0 |
      pCThread->WaitFor();9 P: `/ u9 C8 T' z0 l# m$ K
   }
' R( }4 k8 d3 C( k}* ]' \# W1 m; F5 Y& j0 |
//************************PSTNForm*********************************************//
, Y2 I- J" c( K1 t  V__fastcall TPSTNForm::TPSTNForm(TComponent* Owner)5 q" U7 z7 F% ^& b. Q3 Q
   : TForm(Owner)
& ~  N" M* Y9 u# E2 e, X6 F. h& \{  ~+ K  W9 @; J/ Y( g, w
}
; J0 I9 ^: z$ g( G0 q1 a6 c( Bvoid __fastcall TPSTNForm::Button1Click(TObject *Sender)! N5 v5 m2 d' a& f/ W, l+ L' u
{
. C" V" S. O( n! F3 W0 ~   Close();, T9 m: w2 f3 x8 w1 [# F
}
4 ]) g" m$ k9 x& l3 @6 vvoid __fastcall TPSTNForm::Button2Click(TObject *Sender). y6 B) f/ e5 d" r# g
{9 |9 ~9 R6 g! n6 K% b
   if(pThread){3 S4 i3 E8 a  [
      pThread->Suspend();  V  R3 p8 C: v6 `& v6 |7 {# {
      pThread->Terminate();( J( W% M( h! y7 V  K
      delete pThread;. B# k1 t% F$ [- u5 ^  ~( \: U
      pThread=0;
9 y1 Y; R7 M) p, Q% p7 _1 U   }
7 ]% U5 p; E6 O8 W7 p/ H   UINT m_Port;  W& M0 e0 N1 p
   try: [6 X9 T2 w! l
   {
( I3 @* h3 P! `" J* `8 `6 ?      m_Port=Port->Text.ToInt();
/ [/ S: m' y0 |3 s   }
+ ^. L4 t2 {% u1 b   catch(Exception &e)# \; \9 ]6 z" y+ v* p  \. M
   {
/ a, T* B: q  P  T* m2 L2 o/ z      ::MessageBox(0,e.Message.c_str(),"Error",MB_OK+MB_ICONERROR);
- l7 j4 c+ K5 r/ R; b      return;+ A5 z0 @6 v1 S0 U
   }
, \0 @- l/ b& `3 j   PROTO m_Protocol;
, k. s$ p7 F" H  R6 Q' y   switch(Prot->ItemIndex)
5 R) @  [, ?3 a7 u! i3 k: }   {/ l/ u+ @* E; |" d1 A; R& B
      case 0:
& |) }7 a+ d& i9 R3 J# |/ ]         m_Protocol=TCP;
, z1 u9 c5 i$ _5 J9 q         break;5 b7 W& C4 Y8 l7 I4 l
      case 1:4 ]0 V0 L1 z" F3 P" M1 ?4 M/ d
         m_Protocol=UDP;
& }/ z1 Y5 W& I2 N+ @         break;
" w2 a# d$ ]0 e' [      default:
0 T8 ]1 ~( Q2 r1 @" k         break;
. T( x6 V+ E$ x8 ^8 t! o% P   }
$ `. ?  s! U4 `- ^   pThread=new TListenThread(m_Protocol,m_Port,FALSE);
  q$ T( y0 N2 T& ^) o   //pThread->Terminate();
- c# `$ v, {3 ?, ^0 p6 F6 e}
/ o4 ^* l: t7 pvoid __fastcall TPSTNForm::FormCreate(TObject *Sender), T) V4 \+ {1 A; }7 G3 U
{( ~. i9 h0 T& \% z; h8 j) m
   ::SendMessage(Prot->Handle,CB_SETCURSEL,0,1);
0 n* L; P( X) A1 d- L. y1 p: h}2 U; n0 J! p1 {7 d: H5 b

" Y( p! q( c* R( C5 Ivoid __fastcall TPSTNForm::FormDestroy(TObject *Sender)
3 I1 Z0 K, `  `+ C; q{0 [- R& N( J) o$ S
   if(pThread){
* W! b) G' h( m      pThread->Suspend();
+ q0 x! y8 e+ t: ]5 P7 c" C      pThread->Terminate();}
. c4 ?' X5 x+ R; ]$ O) Z) o}& p6 l. b& f5 O! F2 L0 |0 z9 ?
上面的代码,各位可根据自已的需要和针对自已的应用,在数据处理方面加以改进就可以了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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