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

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

[复制链接]
发表于 2004-2-15 14:01:13 | 显示全部楼层 |阅读模式
在CB中用socket api来写网络通讯程序2 r  n9 {& A% v$ r
作者: kingcaiyao ,如转载请保证本文档的完整性,并注明出处。
9 v/ R# v' l0 h4 [) K7 Q' h& V欢迎光临 C++ Builder 研究,http://www.ccrun.com/doc/go.asp?id=5693 A: z$ d6 v$ C( `9 [: t- V4 A
本文转自csdn,作者:kingcaiyao
& c0 k6 q+ i% w原标题:在C++ Builder中用socket api来写网络通讯程序(同时支持TCP和UDP协议)
2 T' n2 [+ ?( i+ U- N原文:  http://www.csdn.net/develop/read_article.asp?id=198836 _, _6 X+ N. f: S" V; F7 M% s
3 d$ ?' j/ g" j+ r. J0 o0 ~2 m
- f3 {+ A9 \% z& ^( H0 S
在7月4日看完sockcomp.pas后,我决定用socket api来写一个客户端和服务器并且同时支持TCP,UDP协议,于是我就去做,现将代码贴出来(已调试通过)! }. Z6 ]; `- I& a% ^( h, b5 B
Socket api Client:# t1 a5 C; |# h# V

. E4 C- k9 s/ r7 W/ N6 n#ifndef UDPClientH9 s3 n( R# @' }) c; e, O4 c
#define UDPClientH5 `5 c: J- d% B) A5 j0 _' M
#include <Classes.hpp>! b2 Z; i2 v1 B! B) ^( Y4 F
#include <Controls.hpp>
% U, L. k) ?/ y& J7 w#include <StdCtrls.hpp>5 l) X. n( i; ^  _& x8 X
#include <Forms.hpp>. y% f  x1 A) q% c" g
#include <stdio.h>2 G! ^( f9 c; G* e% l
#include "CCEdit.h"" `& W/ R: d" q9 {$ N2 h9 L# c
#define WM_SOCK WM_USER+100
. d8 i9 ?8 C* w* L5 s+ D/ J; Tclass TLANForm : public TForm
- L8 L$ {$ U, M, Z; M0 y{8 Z; ]9 _4 v! s  T+ a9 `; R! J2 f, L
__published: // IDE-managed Components* r' J( }  s4 u& U) z) c
   TEdit *Port;
+ g# H5 B# R2 T+ i, [$ h   TLabel *Label1;
( H! Z$ S6 u# N3 l$ G. h   TLabel *Label2;" Z$ R4 R1 l3 n5 j
   TComboBox *Prot;
! h! v% T! k* _& ?" g/ b# p) j- x& i   TButton *Button1;
: m) @1 ~5 M/ Y! I   TLabel *Label3;
$ s# h3 u! o% P8 N8 A+ d! U: ?   TEdit *Addr;; ]+ S* R% V5 j7 c
   TCCEdit *TxtEdit;
  B6 x: e- ?* S' w/ ]   void __fastcall FormCreate(TObject *Sender);
& S1 h# X, F: T* c   void __fastcall Button1Click(TObject *Sender);
  d; {; w  x. K   void __fastcall FormDestroy(TObject *Sender);
( u! c0 D& i6 o2 rprivate: // User declarations5 e5 A* V# @; K. Q
   void __fastcall OnRecv(TMessage &Message);9 n. \& [. g6 A' C5 b8 h# N
public:  // User declarations$ B/ O2 O" U' E4 s" R
   __fastcall TLANForm(TComponent* Owner);; p+ S- N# O6 ~$ R: |
   BEGIN_MESSAGE_MAP" Q3 n+ `: n8 f+ X- g3 m3 ]
      VCL_MESSAGE_HANDLER(WM_SOCK,TMessage,OnRecv);2 V+ r& @1 b' j% J( E+ h
   END_MESSAGE_MAP(TForm);/ R) R1 K" ?7 ^' z# _; p, e% A: P8 p
};
( L: q: ~' J0 }extern PACKAGE TLANForm *LANForm;
  q) n1 c) c$ ~; q5 I#endif9 w+ u% n- f) l* S6 P9 z
- C% l9 V; m2 z8 ^6 n

7 F% E% M+ ^3 y& ~.cpp File
- W2 r8 h' |( s3 m  L0 |' z' z. y
; b% L. ?# Y% m* G  A#include <vcl.h>
( u4 M8 O& ?3 ?; c# j: u& l" r. x#pragma hdrstop
0 K( d7 I0 X+ p1 m  x# {. W#include "UDPClient.h"
9 M! [9 B8 @% ~5 E" A7 M#include "WinSock.h"
2 v+ \3 t6 k* s+ |#pragma package(smart_init)
2 s6 l0 e3 v- F+ o8 }$ H#pragma link "CCEdit"' ~1 g  ?% M2 ^5 A, m7 v
#pragma resource "*.dfm"
. z  O- D% \, m6 X) c# UTLANForm *LANForm;
- w/ F9 T# ~0 G: F; l1 `enum PROTO {TCP=0,UDP=1};% Z9 k, D6 R8 E1 g  K3 z
SOCKET m_Socket=INVALID_SOCKET;
) k; l5 I: a: i9 ^8 vPROTO m_Protocol=TCP;
" b- X; O6 Y7 h' R# l* |+ P__fastcall TLANForm::TLANForm(TComponent* Owner)
* U/ P! [* M6 G' K% p" _' P   : TForm(Owner)
# G5 V2 E4 n) v3 w; B* f{
, _  p, A! c" I' C! j5 ~; A3 e% G( p: O1 i8 f" ^8 u
}  ?( L) I' \+ }. f9 l
void __fastcall TLANForm::FormCreate(TObject *Sender)
4 D* O1 }5 C2 ^0 _2 c( R/ G{
0 C% m  i: V9 o! w7 L   ::SendMessage(Prot->Handle,CB_SETCURSEL,0,0);
$ G* {4 w8 _. }0 s  F& U' g}* [6 {& x- P! `- E% t0 c4 U
void __fastcall TLANForm::OnRecv(TMessage &Message)
. ~+ @0 p5 U( u/ l0 G; Z) x0 v{9 ~* e* J! V9 n  l% q. ?  \9 |
   char buf[4096];
+ T$ z+ u7 Y% N/ I   int nLen;* v9 m  `, i2 K# I
   struct sockaddr_in from;% x6 V- h' U9 h! }' P; J
   int nLength=sizeof(struct sockaddr_in);' |' e7 I5 n6 u+ h% b( }. G* C7 z
   switch(WSAGETSELECTEVENT(Message.LParam))$ D0 W8 P4 v8 ]; p  ]; H
   {) _1 E7 a- \. {; p+ G
      case FD_READ:
$ P1 f7 P6 u  T0 c' _         switch(m_Protocol)1 p8 Q% A! n# ], A0 u0 [
         {5 q$ p% v2 q$ A! s& R0 e! v
            case TCP:
8 i' d4 p6 M, |# w/ ]               nLen=recv(m_Socket,buf,4096,0);
( z+ E  T! H# |: R7 H/ O               if(nLen>0){
. z) L5 z$ `" z* Y1 V  g; r  D$ f                  buf[nLen]='\0';3 b* s; f: x/ W- Y
                  TxtEdit->Text="Received Length:"+String(nLen)+"\r\n"+StrPas(buf);
3 h& R* l  H. W& g8 o. |3 U9 @# x% ?               }
6 D3 q$ ~4 \! N8 n5 ^               break;
9 h  q# \! O1 w/ {            case UDP:
, R* m1 v, k' V" S               nLen=recvfrom(m_Socket,buf,4096,0,(struct sockaddr*)&from,&nLength);
2 W5 T( G9 E) G6 u; j" B               if(nLen>0){' V& V. B# M+ F. ], P4 r% }6 U9 d
                  buf[nLen]='\0';
' o4 b+ K/ K3 J8 L3 U6 ?                  TxtEdit->Text="Received Length:"+String(nLen)+"\r\n"+StrPas(buf);
  _8 k/ p3 u8 H! d* `1 A5 O0 d# U               }2 B+ h9 H( ^& |2 d) h( M, a- ^
               break;6 ^  a( O. W! g
         }
1 S- `5 r/ ?) @+ z3 \         break;1 ?0 o. a7 l+ v8 {- f
      case FD_CLOSE:( f0 }1 @0 l# A+ s9 N' F
         closesocket(m_Socket);$ i" B6 a! S" M& y1 l# O3 v
         break;
/ V- _$ U  |' `2 E: u7 s* u) X7 f   }" `- F( }: H2 N* G  `
}
8 R! D# v9 A7 S4 ]" E  _$ [6 H
  G* X4 ?8 _! `' zvoid __fastcall TLANForm::Button1Click(TObject *Sender)( Q/ j  W2 Q4 S# `
{1 W# Z2 ~. S* U0 Z* r& ~" c* ^" |
   char szTmp[256],buf[4096];( j# D' m* c+ C- E- V
   int nSize=0;: j6 v7 ~  w& U3 W1 n) _
   UINT m_Port;
, {4 V7 j0 |7 v' X3 k   AnsiString addr;
2 D0 S& c( m, \5 s, t7 I9 `   addr=Addr->Text.Trim();: m% H8 [" X; b: n
   if(addr.IsEmpty()){# c8 _* O$ L& a
      ::MessageBox(0,"lease enter the server IP!","Error",MB_OK+MB_ICONERROR);0 n2 Y; y3 R" \" v' Q( g& n* \
      return;# v6 L8 g9 ]( f! j) L
   }9 Z5 h  G, h/ r% x6 E; i) {7 O
   unsigned long nAddr=inet_addr(addr.c_str());. m. J8 H0 O" I: A4 M# B
   if(nAddr==INADDR_NONE){& q' Y5 C7 R2 v7 q, M
      ::MessageBox(0,"Bad Internet IP!","Error",MB_OK+MB_ICONERROR);
/ {+ ^2 B0 |3 L+ f% }. K      return;}8 c/ ^' h4 I/ I9 a+ O, j

  S. p- u7 i+ a0 x1 }1 g   try
% D1 z5 L/ A" r: m7 i5 ~   {7 j5 G3 k. c9 g4 q9 o! @2 P& R
      m_Port=Port->Text.ToInt();9 w4 d! O  V# ^0 t; \+ r! @6 ~( y
   }
# n8 [+ ^: m3 N0 y   catch(Exception &e)- n* [" g& F$ h' e# H2 K( l: f
   {7 K) A1 m( _& M
      ::MessageBox(0,e.Message.c_str(),"Error",MB_OK+MB_ICONERROR);
& w. O+ {2 I2 |' p( f8 w      return;. Q7 M  L! W- D8 g! ]2 N& ]* u
   }- W& x& N' b% _! o
   switch(Prot->ItemIndex)
% ]6 m# |( Q  j6 o' s1 H   {
, G7 X0 M0 C; U- v1 j, {      case 0:# e, b, p1 q( t: u1 M* W" ?6 v
         m_Protocol=TCP;
2 q1 ?! q9 R$ U2 g. }1 h, M" @         break;2 y! R7 O, C# V! x: o' _# I
      case 1:
; I  R+ U8 h9 b! D- P9 A( ^- W         m_Protocol=UDP;
* ]8 n! L4 a9 W) M         break;# I  c, y2 ^  x0 b8 K- c. F& V
   }
1 w( o' ^- m1 X" ?3 R- M   if(TxtEdit->Text.IsEmpty()){
; P% `( s) i" r- c+ V  L      ::MessageBox(0,"lease enter the text you want to send!","Error",MB_OK+MB_ICONERROR);4 B3 h& D. N. `' t( E
      return;}
* q0 H  r" g4 K3 ]/ }( S
) d/ R$ Q' h. }1 V   //Initialize Winsocket$ q; u: a9 e2 a( ], ~+ T
   WSAData wsaData;
7 J; s! }3 x. r   ::ZeroMemory(&wsaData,sizeof(WSAData));
1 D  \' L9 X# O5 C   WORD version=MAKEWORD(2,0);
& e" p" C% o% J$ P+ I2 x' c   if(::WSAStartup(version,&wsaData)){
* d! n5 g0 l* U0 a      sprintf(szTmp,"Failed to initial winsock enviroment!,error no:%d",::WSAGetLastError());7 ~, A! s* n5 t; r% G
      return;}
* y* u+ D0 k+ C7 D5 K4 y7 }8 N7 x. ~$ Z* w
   //Obtain the active connection4 f- ^$ p/ l$ S% E5 d) c) r' C
   char ComputerName[255];. s3 Y8 L+ o4 x( d& Y
   gethostname(ComputerName,255);( g* p) q2 Q! k: Z) J) R8 z$ w
   struct hostent* he=gethostbyname(ComputerName);: e% l8 ^/ X# T, A% w( ?3 d$ i
   if(!he){
+ K4 f- ~' |. O3 i; j      sprintf(szTmp,"Failed to get information to host!","Error",MB_OK+MB_ICONERROR);& b7 Z$ e, \7 S9 J( C
      ::WSACleanup();
8 @' Y+ N" l" g6 m1 f7 k% B      return;
4 |; S  {; t# t; ~! S6 z. ?   }: a: S; D# g8 M% _. \9 O. I
   //create new socket2 _" q9 ^5 x3 j0 E. B
   m_Socket=INVALID_SOCKET;9 {0 H0 ?% D4 R9 I1 e/ r& G
   switch(m_Protocol). m' ]9 x, e# o
   {
8 d' ^, N- A: y: M! M: x      case TCP:, n, Z4 G  d: f
         m_Socket=socket(AF_INET,SOCK_STREAM,0);  \7 r3 W9 n. v4 a0 P: C. N) Z
         break;
! u3 t5 ]5 }1 E6 V      case UDP:
) T# h6 g5 T. F         m_Socket=socket(AF_INET,SOCK_DGRAM,0);' s" Y" h, X, p1 U
         break;+ [% D3 E/ G1 t3 [/ j. ~
   }+ U4 p0 T" E- S% H
   if(m_Socket==INVALID_SOCKET){
& o0 T% E9 H8 a4 N8 b      sprintf(szTmp,"Failed to create a new socket!,error no:%d",::WSAGetLastError());$ W6 I1 o/ J% U! N3 w7 |6 L
      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);2 Z2 W% @3 ^) c5 |) d
      ::WSACleanup();
; r; R2 z9 T% J- @      return;# Z( f" ^7 q3 S. }. i
   }, O  B+ u- q: h0 q6 _
   //bind socket
$ e; E( H' S4 m# v   struct sockaddr_in client;% I" Z6 w& E1 Y
   unsigned long nClient;# T& w  E2 c& a( w
   memcpy(&nClient,he->h_addr_list[0],sizeof(int));: ~- y" G4 n9 y
   if(nClient==INADDR_NONE){
% x3 B* k5 u7 L) c& G  I7 C      sprintf(szTmp,"Failed to obtain the local machine's IP!","Error",MB_OK+MB_ICONERROR);
: T5 {) F9 T& N# Q0 Q      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);" }( G7 E" v; M6 n
      closesocket(m_Socket);; I. Z4 O5 {: c# F
      ::WSACleanup();& e4 g% L7 L. ]  U/ W2 j9 N7 q! z
      return;8 U2 g/ O2 y( G
   }
2 y. L- `! c/ a; ~4 v8 K   client.sin_family=AF_INET;
1 h  T# N3 v; D9 u' H   client.sin_port=0;
) |3 V& W* r6 h  w   client.sin_addr.S_un.S_addr=(int)nClient;; ]5 ~# X) }# m6 s
   if(bind(m_Socket,(struct sockaddr*)&client,sizeof(struct sockaddr))){
5 I( D6 c" K0 u! z) @      sprintf(szTmp,"Failed to bind socket!","Error",MB_OK+MB_ICONERROR);
$ E8 q" z# Q5 u9 X; I' K      closesocket(m_Socket);# N5 W* T0 x" l8 W  g5 O
      ::WSACleanup();! x4 |5 o; h" T! \3 b) E( A
      return;}
) o1 u, M$ ^2 T   //connect socket
; c5 }$ A; T1 K+ O% R   struct sockaddr_in To;
! e  W6 l) x7 Q* y8 m   To.sin_family=AF_INET;' V7 n) b/ M) g  M0 e1 w4 W
   To.sin_port=htons(m_Port);
8 v! P8 C, A3 q5 x! j   To.sin_addr.S_un.S_addr=(int)nAddr;0 n* \" o( |6 W7 a" H0 i8 W
   fd_set FDSET;, Y+ p, c( J$ W! h' h1 ?8 z
   FD_ZERO(&FDSET);8 K& p0 Q3 ^, l
   FD_SET(m_Socket,&FDSET);0 B& r2 H( c4 e6 O  p- E
2 @- {- S/ Y/ g; ]: c

7 r% y2 ]: Y( v+ i   if(m_Protocol==TCP){/ X2 g  ?# F% r
      if(connect(m_Socket,(struct sockaddr*)&To,sizeof(struct sockaddr))){
- M7 J6 L# o+ c+ w) W7 o" i2 x6 g% J: t2 {         sprintf(szTmp,"Failed to connect the object!,error no:%d",::WSAGetLastError());6 _% ?: x) M2 V/ _3 X
         ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);
$ ~1 [9 b# N& f9 C$ u         closesocket(m_Socket);# m9 C7 B# K' X" ?0 G7 W
         ::WSACleanup();. r# }4 {& ~8 m3 m8 v! H0 w
         return;
9 n7 a3 c% J. g- ~' F+ D4 U      }
# M0 T- _3 o2 R) {6 O! d5 g      int nError=select(1,0,&FDSET,0,0);
6 E* J/ A/ l( ?6 _' ]3 v( u      if(nError<=0){
6 L9 d+ F& A# @      sprintf(szTmp,"Failed to select socket!,error no:%d",::WSAGetLastError());
- C- P* w+ {, M) l      closesocket(m_Socket);
0 N0 E2 s9 F+ g+ h4 G      ::WSACleanup();) |/ k9 A* y! X/ t$ P, X4 P
      return;}
8 N2 R* e, t( d6 N   }# k" {$ X, b* I5 l
   //Send data9 H& C. O; L2 v( r: C& G8 J! M
   int nLen=TxtEdit->Text.Length();
- v& J$ b9 Z, F# N' o2 S7 u   if(nLen>4096){
7 K) w, L$ _' h' C: |9 H      sprintf(szTmp,"The buffer is too size to send,it shoud not be more than 4096 bytes!");5 R+ j9 A% z  E  H5 y
      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);# S+ k9 y' M# V- D6 v7 v
      closesocket(m_Socket);  M4 D, l2 b. M: Z  ?; H6 K
      ::WSACleanup();9 j; S- R2 ~/ P, q8 {
      return;
+ `; K( A. L" l   }
6 X* o" O+ N' I; v   strncpy(buf,TxtEdit->Text.c_str(),nLen);" U4 l. L7 s3 v, B
   switch(m_Protocol)
' F& ~" A" h( H  R  a   {! f% r0 N+ t* F# ~* ]  q. Y
      case TCP:
6 \( g% T, ]# G) [' s8 l3 |         nSize=send(m_Socket,buf,nLen,0);1 T- \' S3 c3 U! _, |0 z
         //ShowMessage(nSize);. Q5 u/ f" f: W9 I# V+ i! m( x
         break;* u1 G  F) M! t$ y
      case UDP:
. Y3 U5 G4 I  A: [0 h) ^         nSize=sendto(m_Socket,buf,nLen,0,(struct sockaddr*)&To,sizeof(struct sockaddr));
4 G& v- j: ]' i- W& A) s& m- @         //ShowMessage(nSize);
7 ^- S  X1 @; c0 N1 x2 X9 Z: L         break;
2 i- K1 @) ^- ]8 g$ C
, J$ ]. ]7 f4 C/ d$ X   }# ]( {: ?$ D6 Q
   if(::WSAAsyncSelect(m_Socket,Handle,WM_SOCK,FD_READ|FD_CLOSE)){
. l% d+ h4 s  J- F      sprintf(szTmp,"Failed to register socket event!,error no:%d",::WSAGetLastError());
# U, u' A7 Q) c+ a: \9 e      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);
5 l% ?& Y+ _5 I, T      closesocket(m_Socket);
! _! |* H6 Q! }      ::WSACleanup();& T. b/ V4 n$ ]. v2 |' N
      return;}
' l/ b  o) h+ V* C}7 ~. E0 m& o+ x: Y
void __fastcall TLANForm::FormDestroy(TObject *Sender)
  D2 \" w6 l$ b% w{9 R: `! m7 t' u
   closesocket(m_Socket);6 F5 N. r7 ~2 E
   ::WSACleanup();* r: `5 Y4 w+ Q, F
}
: b0 k0 H, y% s  i' K7 }  i2 x9 T. B4 {% K$ D" B' K
Socket api Server:
: J4 v" X% a& i/ d7 ].h File
8 X/ E( Q; q3 o2 x( D! ]#ifndef UDPServerH( \1 w" {) I4 W) ~) A- w2 f7 B
#define UDPServerH
$ v* g4 Q4 O7 D5 \+ d% w" x#include <Classes.hpp>
% O* B' y- P3 p5 s#include <Controls.hpp>+ [' ?' f; g5 l) Z  T0 K  O
#include <StdCtrls.hpp>$ i% [% p, A% B+ A
#include <Forms.hpp>
9 V% V- ?) E# S4 r( W#include <stdio.h>9 W3 v) ?% _. k* s; t
#include "WinSock.h"
/ _0 a# T( I& D6 y* ^+ i6 ?) f/*#define WM_SOCKET WM_USER+1000- _$ p/ S7 r. P# s
#define INITSOCKETSUCCESS 0
5 s# S! w8 I( a' q+ w/ }& g- c#define INITSOCKETFAILURE 1
* A% V' }3 m1 V/ W* i8 D#define CREATELISTENSOCKETSUCCESS 2
, \% L6 T& c" H. K1 c& Q#define CREATELISTENSOCKETFAILURE 3
- v; s% P5 R; \6 I5 T! Y. a#define SETLISTENSOCKETSUCCESS 41 Y& W; N4 @( a" G, z
#define SETLISTENSOCKETFAILURE 5
. g6 n" c$ J& R2 r5 @#define BINDLISTENSOCKETSUCCESS 6
  d& F6 Y9 D) K3 _#define BINDLISTENSOCKETFAILURE 7
$ c# M, ~" d1 f; S8 f; D  U. T#define LISTENSOCKETSUCCESS 8
0 P8 w, n1 G- o1 u#define LISTENSOCKETFAILURE 9
' v$ F) `6 d' I  }7 o% g. k9 M, I#define ACCEPTSOCKETSUCCESS 10
( {% l) z1 c) R; t#define ACCEPTSOCKETFAILURE 11
; K) J4 M9 T: a) h*/
! J3 S2 X9 C7 Z* O/ E) {3 Jclass TPSTNForm : public TForm
+ Y# V( ]. F& f/ r, {- L! S{/ P9 P, k, y  Y+ a8 ?. ^& p
__published: // IDE-managed Components( p' Y5 w! U; F9 _- P2 y
   TEdit *Port;/ h1 |" Q# H6 U
   TLabel *Label1;
; C# `: D, B5 N; R6 E0 n2 @$ _   TMemo *Memo1;
8 v9 A1 y5 k* `   TButton *Button1;
% Z; d$ k8 K- z. ?7 _   TButton *Button2;
9 s# O! I/ O7 q: C2 [8 @) |   TLabel *Label2;% K2 L, z" c& @0 F5 ?" k9 y7 y* o
   TComboBox *Prot;! l* N7 B$ C% k; [; I
   void __fastcall Button1Click(TObject *Sender);
; V* x, f5 {, G0 A' n; a. K   void __fastcall Button2Click(TObject *Sender);4 L, k7 F' Z- k0 i
   void __fastcall FormCreate(TObject *Sender);
3 v, x9 j! C! N. p$ l   void __fastcall FormDestroy(TObject *Sender);
3 n7 u$ h3 I3 w9 l8 Q4 |private: // User declarations" U  p! E' l5 @( h
public:  // User declarations! B8 i, Y! e( ?; s$ w- h4 ^0 x
   __fastcall TPSTNForm(TComponent* Owner);: M# N3 e+ c0 ^
};4 Z7 b" ^, H) B, {* e  h) [: R' p% R. ~% e
enum PROTO {TCP,UDP};2 S6 T, D( e. s$ U- G) ~
class TCommunication:public TThread    //Communication Thread
- q' e  x/ f- n  O% c{
0 [: W/ o, ?7 Z4 r2 |private:4 S7 z- ~( y9 ~; U
   SOCKET m_AcceptSocket;5 ]- N; m" A$ A7 ]2 K, _5 n9 [: Z
   char szTmp[256];//ERROR MESSAGE
$ t, E/ \; {) P* g5 E; j% f0 vpublic:
) W6 J0 ], C* V   __fastcall TCommunication(SOCKET m_Socket,bool CreateSuspended);/ ~1 m* W  O( r0 u# n
   __fastcall ~TCommunication();6 m# C9 c$ c  j. T5 `0 K
protected:
' ~( `9 d+ Q7 l+ T1 c   virtual void __fastcall Execute();/ {/ n& X2 q, e- s: S9 h; Y) D, L
};
3 M1 r2 j0 Z9 `) P( I$ N: \* Qclass TListenThread:public TThread //Listen Thread
7 h& g5 O  V  b  z0 `{
& O# _; c/ P. ]3 a) vprivate:
7 `$ s  e- U0 g: P7 w& A   WSAData wsaData;0 Z" v0 k, u9 ^
   struct sockaddr_in server;
) o, M& s: \3 _6 c& M   fd_set FDS;
4 ^' ^8 @/ B# R7 U+ N; ?& X# i) O  d+ X9 _   UINT m_Port;
+ `3 }& A% y' e& b5 R. ?) w   PROTO m_Protocol;8 n( n) C/ n6 Z6 ?
   char szTmp[256];//Error Message
; g; q0 ^0 b4 _- p2 }  _$ {7 bpublic:
3 B4 s2 o$ a1 s) t  J. [7 z* D3 D   SOCKET m_Socket;2 Z! ?0 [0 s5 H- u! A+ o# D/ L
   void __fastcall DoError();! p# i8 c$ M, Q) K
   void __fastcall InitSocket();6 a; Y! @2 R# d) f: i# g
   void __fastcall CreateListenSocket();
5 R& [2 b' ~( S   void __fastcall SetListenSocket();7 F7 W5 x$ f, V4 o5 I: o
   void __fastcall BindListenSocket();5 u0 \3 y' n# o  S; e
   void __fastcall ListenSocket();! Q8 j: G! u6 a% H0 q, m2 {
& \" [0 z  g' e( l$ K1 `: u9 Y- f
public:
( i- H8 q. F5 Q   __fastcall TListenThread(PROTO m_ProtocolA,UINT m_PortA,bool CreateSuspended);* U1 `1 p* ]( l0 T% I1 r
   virtual __fastcall ~TListenThread();; V, t1 Y3 B9 X: Y0 H0 ?! c8 N
protected:0 J8 |. C$ W8 r" n) j3 m
   virtual void __fastcall Execute();+ M/ A. l. y# m1 R( E
};( N" g& g+ t! k6 u. h3 O: N' T
extern PACKAGE TPSTNForm *PSTNForm;
7 R0 ^$ ]- ]& a* O; n8 C7 P8 ?#endif
, ]0 w% Q5 ?! E9 K! N1 p: v, `& q1 L.cpp File, e. G  N  e" h5 y2 J
#include <vcl.h>" {' l: S! U: }( y6 z( x) ~  a
#pragma hdrstop
: m7 M; G8 c3 |) Z#include "UDPServer.h"- N% q9 A& O5 z; \8 J# t6 X/ z
#pragma package(smart_init)
3 c# f3 u, p; `6 `#pragma resource "*.dfm"/ E/ B$ g) C" y4 R
TPSTNForm *PSTNForm;
# H" b9 v) i- ZTListenThread *pThread=0;' z* t9 {3 O! L. Q+ O$ ]+ n- C
//******************************CLASS TCommunication For TCP****************************************************# x3 Q/ a% D, b7 \' a; i3 s
__fastcall TCommunication::TCommunication(SOCKET m_Socket,bool CreateSuspended):TThread(FALSE)
* Q" S  \% @; X" Y; {3 l{
8 d# @8 d2 T+ g; U   m_AcceptSocket=m_Socket;
: K# A, ]& k1 ?$ L   szTmp[0]='\0';
- {$ \# s* u5 E/ }2 K4 B) \. Q  G   FreeOnTerminate=true;
  t& S4 U+ R( X. c/ Q  B: _}3 {- l* o- C' L6 a! J
__fastcall TCommunication::~TCommunication()" o( g9 j( E& _( k
{0 p1 f2 ^# R: Q* ]; c, i
  // closesocket(m_AcceptSocket);
( G5 _7 q" Y6 {: G/ `& v}! y- F& [# E5 R2 s, Q
void __fastcall TCommunication::Execute()4 ?6 {6 J% Y5 b8 {/ C* u1 z: F. y& G
{7 x* q) u/ |1 x  i, O# R6 {) z5 Q
   char buf[4096];: Y: S- `! L( O, L
   int nSize=0;
; O# T" R7 ^0 N+ Q6 `& |   nSize=recv(m_AcceptSocket,(char FAR*)buf,4096,0);
0 D1 d& a/ d0 {( \   if(nSize>0)
9 g* V+ @, @4 ]' ^3 `" @9 a, ]7 i   {# P% f( G+ Y4 k8 r$ N% F
      buf[nSize]='\0';
1 e' u! l! \( |! P1 s: b- }: J      //Display
3 P2 p+ X! p/ S      PSTNForm->Memo1->Lines->Add("Received Length:"+String(nSize));
* r6 V& m/ H8 m9 T8 }0 J, k; E0 h      PSTNForm->Memo1->Lines->Add("Received:"+StrPas(buf));8 U( g+ F3 S. Q
      //Deliver7 s* u) l4 e) y
      ::Sleep(100);) A6 N6 l! p. d, B9 a- W' i' f
      send(m_AcceptSocket,buf,nSize,0);
$ S" m2 D! l8 d   }4 N' c( j- G" N1 @5 H5 \1 w& K
" D6 }3 z4 P7 v: K
}' I$ ]. h* H) t. ^2 {  B' ]: e* w
//******************************CLASS TListenThread*****************************************************
7 E; s( n4 V/ J- l" O__fastcall TListenThread::TListenThread(PROTO m_ProtocolA,UINT m_PortA,bool CreateSuspended):TThread(FALSE)
" t4 T0 d& J* [/ k7 }0 G% S{) p5 [+ O, n, n# ~7 E
   m_Socket=INVALID_SOCKET;) |, z% A: s3 c# M8 b
   m_Port=m_PortA;
7 h3 s1 r7 d9 h; d; A. |   m_Protocol=m_ProtocolA;+ F0 z  x* c' P  ]& t9 _4 _! F
   szTmp[0]='\0';7 n2 f2 h& m) @. r0 S1 s
   ::ZeroMemory(&wsaData,sizeof(WSAData));
! p5 l8 L- G# Q$ l# G$ A   ::ZeroMemory(&server,sizeof(struct sockaddr_in));1 b! Q. ^3 W! m3 x9 ?9 ]; h' I
   FreeOnTerminate=TRUE;//Automatically delete while terminating.
, l9 J1 @) |" [1 f5 f- T0 i1 H1 j}
! i: s& i9 r3 L( x__fastcall TListenThread::~TListenThread(). T% n3 Y+ |7 u5 t; ^) X
{, K" x, S4 r4 N7 P0 y! D
   closesocket(m_Socket);
- }7 k, v- C8 G+ ~   ::WSACleanup();
( ?; {( O9 P+ B  X% T   m_Socket=INVALID_SOCKET;& k3 h# ?3 m( r  o
   m_Port=0;2 A9 y, _, v7 p6 x7 c5 x: t
   m_Protocol=TCP;' x- W4 O. J7 [9 R' `) S. K! x1 s0 i
   szTmp[0]='\0';
# E! ]3 [& [+ @   ::ZeroMemory(&wsaData,sizeof(WSAData));
1 Q" x. r( K) e   ::ZeroMemory(&server,sizeof(struct sockaddr_in));. D' F* |* b) H
}7 h9 i; {6 e) N! ]% L+ P" o
void __fastcall TListenThread:oError()" e) O( h! ~) n# k% _1 O) O  ?6 g
{) s0 ^# `, }+ @: x; T- W; a
   if(m_Socket!=INVALID_SOCKET) closesocket(m_Socket);
) ?; M$ b% Z* e& `  c4 k9 ^! e   WSACleanup();0 G# D* n4 H* o& I
   return;
# E% W& O: y% |- L}0 X4 |" B7 F* q; {) W3 u# T5 ^( Y$ w& x
void __fastcall TListenThread::InitSocket()" V# o) {& B: k% f' r
{
" |% Y- m' E2 M0 V8 n# [, H   WORD version=MAKEWORD(2,0);
5 u1 y1 [3 Q1 t8 U   if(::WSAStartup(version,&wsaData)){3 r! X, K. k, G- G6 Z* [, T
      sprintf(szTmp,"Failed to intiailize socket,error no:%d",::WSAGetLastError());: {, a8 k$ T- k$ r3 v
      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);4 \$ q. A$ g1 a
      DoError();$ d. M3 i) z7 v7 _9 v
      return;
4 ?9 w0 n/ \0 g) D7 p1 `) P2 l" N   }* B) {0 K! N& N& [/ c8 E
}
, l9 g# a% D/ S" g3 p/ P& ]void __fastcall TListenThread::CreateListenSocket()
% V2 _0 K1 w! V' x$ ?{
) w1 J0 k; u2 h+ ?; H+ ]/ R* s   switch(m_Protocol)
( f# F, F( t# D( I   {
7 b6 S( k4 g! O+ @+ j3 z1 z6 h      case UDP:
/ Y5 l: F% |% @         m_Socket=socket(AF_INET,SOCK_DGRAM,0);
! Q+ a5 C6 O' ?* P4 |         break;
( E$ ^# l4 o# s$ u& p) v( ]      case TCP:2 b: T) k2 w% i% [' g) O
         m_Socket=socket(AF_INET,SOCK_STREAM,0);. [3 ^' k; V- v* f: g
         break;1 m. U8 ]4 B1 K- g3 x* a
      default:
% x( ]- `; F! B  W: M         sprintf(szTmp,"Error protocol!");
' @: Y& g  K% }% \3 q         ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);
2 X. s1 j+ T/ A0 B         DoError();. k' H. W. Q; U* Y
         break;
. s4 ~( x0 ]* d* Y$ V) t   }4 h4 W) I( N9 A' {' m# Z
   if(m_Socket==INVALID_SOCKET){* d8 K9 m8 V9 O& V* T
      sprintf(szTmp,"Failed to create socket!");
+ v7 H7 J! e1 k      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);; P$ j$ j& `( T3 m7 k' i( L
      DoError();
% h+ w* o' c* h6 m% e" Z      return;" J: ?4 [( W, j6 k0 R/ U
   }6 }* M4 e8 P% A1 K9 u- s" K0 w+ T
}
8 A  ^" R: o9 g, W9 H) J' V$ d0 qvoid __fastcall TListenThread::SetListenSocket()
1 y" N7 _, ^0 p{( P+ S9 H* k. q, W& a4 B
   server.sin_family=AF_INET;6 Q! ^/ y$ m' F3 D
   server.sin_port=htons(m_Port);
3 B2 E- ~+ m. g/ |+ X3 T0 p   server.sin_addr.S_un.S_addr=INADDR_ANY;
% x' W7 N8 I" i3 e  W   int NewOpenType=SO_SYNCHRONOUS_NONALERT;) i% l, c/ U+ V% D+ v  a
   if(setsockopt(INVALID_SOCKET,SOL_SOCKET,SO_OPENTYPE,(char*)&NewOpenType,4)){1 q" \1 C% f$ y; \; m% L2 p% K# z
      sprintf(szTmp,"Set socket option error,error no:%d",::WSAGetLastError());
: o" y+ X3 F& S$ P! j1 ?      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);
8 E: ~% g/ t0 u! }# o' ^      DoError();2 Y0 j: ?, u. @0 F% B
      return;
* N7 b, C5 j6 i6 M% l   }
5 X  o, w- M1 @}$ A9 x. m, j6 t, M' L+ m
void __fastcall TListenThread::BindListenSocket()4 `2 m7 u- e; ?/ V6 p
{
% q5 M" H1 @. b    if(bind(m_Socket,(sockaddr*)&server,sizeof(struct sockaddr_in))){
8 l% g$ e9 s$ q      sprintf(szTmp,"Failed to bind socket,error no:%d",::WSAGetLastError());
6 G: V' G2 g0 v9 |# \0 P  M      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);" g: ]( x0 S' q3 |3 L
      DoError();. A$ b% m3 z2 q) {9 X( s
      return;
8 U. w2 u$ }+ W. E7 @( D   }
# ^' k* O" }% @% X0 p+ g0 N6 [* ^3 ?9 N: B  l4 [' Z
}3 c6 E6 U) z8 s1 x0 a
void __fastcall TListenThread:istenSocket()
& G% H8 X4 F. V8 T& L, K$ |6 z. z{
; g4 n, X3 [, D% N7 {9 f  if(listen(m_Socket,SOMAXCONN)){
) n1 x& Z1 _4 {2 q2 X     sprintf(szTmp,"listen error,error no:%d",::WSAGetLastError());
% u! _* O7 J; P* t     ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);; U. p2 y" V1 k- V- f
     DoError();  y: b; v' P9 Q% U
     return;
! A/ P. P& u5 j1 l$ p  }; w" C* h# m( ?( J# a; }
  //Determine whether there is any connection
4 w7 F% y1 H+ B3 j7 z! j2 N  FD_ZERO(&FDS);
+ c2 }( k# H3 R+ M# h% S% l4 Z& Q  FD_SET(m_Socket,&FDS);
& ]& ^2 T# x5 g& T, D7 }}
, E6 X9 W5 S6 O9 F  n0 Q1 z* `( F6 [1 evoid __fastcall TListenThread::Execute()
2 K5 O5 M/ H/ L& G{8 K" h: B0 g0 b6 [/ ~! _) [
   char buf[4096];
9 u( u0 ?/ @' K# a% o   struct sockaddr_in from; //for UDP& c4 a& K  Q! }' O# @' F- u6 V
   int nLen=sizeof(from),nSize=0;  //for UDP
; B/ ^2 L2 V! j   InitSocket();/ n1 q5 {! U6 B
   CreateListenSocket();  G$ s- U1 P( N  {
   SetListenSocket();0 U2 i  A6 i' w
   BindListenSocket();
0 C6 e7 e8 o4 @! }: q) n   if(m_Protocol==UDP){) _* X. J- {+ g* g: x* I0 ]$ T
      while(!Terminated){$ ?. M3 Y) e- U/ ?# S1 p
         int nSize=recvfrom(m_Socket,buf,4096,0,(struct sockaddr*)&from,&nLen);
/ x; P+ W% v) b( B& a, c         if(nSize>0){0 o6 e; {4 o2 }; P
            buf[nSize]='\0';6 S1 Y" X1 k" u  y0 a% |' k% k! r
            PSTNForm->Memo1->Lines->Add("Received Length:"+String(nSize));
3 o. B7 S& q! S            PSTNForm->Memo1->Lines->Add("Received:"+StrPas(buf));% R* e# _# r& G+ x# p
            ::Sleep(100);: |0 m# C9 d* L/ e6 j
            sendto(m_Socket,buf,nSize,0,(struct sockaddr*)&from,sizeof(struct sockaddr_in));9 m0 J8 H' B  j3 |  ?; T. ]
         }
) P$ ~6 a0 O9 t) Q6 S+ M         else return;  C/ z& ]% t% z7 R

" D8 P% D2 F3 |' Y      }5 B1 @* a8 _: D  s5 _7 M
   }
" l+ w" \! P% d   ListenSocket();
8 I6 }: R+ r+ d. ?2 w% m   struct sockaddr_in client;
; z( h  Z# K5 o9 `) V   int nLength=sizeof(struct sockaddr_in);
8 s; m, M0 y9 q  r1 ?7 }0 C   while(!Terminated){- `# `# u) k6 Z
      int nError=select(1,&FDS,0,0,0);6 f( }# A/ l3 j
      if(nError<=0) Terminate();5 I7 S2 J% C3 Q4 D
      SOCKET m_AcceptSocket=accept(m_Socket,(struct sockaddr*)&client,&nLength);7 @. d- k0 p- c' v4 o
      if(m_AcceptSocket==INVALID_SOCKET){, M, |# @; h; v' i
         sprintf(szTmp,"Failed to execute accept,error no:%d",::WSAGetLastError());
6 D* }6 n2 m2 Y         ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);( ^$ a% B8 i2 n3 A" K
         DoError();
) i) @3 t1 z% e/ r* t$ R' r         Terminate();
2 w2 p, \2 w# X9 T- ?) @- s) d         return;
6 u0 g: y2 M% J      }$ m  K/ L8 p7 B; ~$ Q9 U7 B
      TCommunication *pCThread=new TCommunication(m_AcceptSocket,FALSE);
  o5 W- u" ^" t      pCThread->Terminate();3 M* H: I- Y4 i  P" V1 I0 }" g
      pCThread->WaitFor();& V3 J+ q8 @! r/ |& F7 n3 k. n( Q
   }& `  s6 Y6 I. I* K" N1 _" r, n
}; ?- w( X9 ]7 a; O
//************************PSTNForm*********************************************/// }" r4 Z1 ^* T, s' f+ U
__fastcall TPSTNForm::TPSTNForm(TComponent* Owner)  m5 S4 D- @0 S3 j( c
   : TForm(Owner)" C% `3 n, f! J' o2 B- `1 i
{
* u7 H( B# w- H/ ~( _! a3 D}$ R/ c5 t, |7 J9 `3 C# l
void __fastcall TPSTNForm::Button1Click(TObject *Sender)5 m3 u7 [, t7 d; Y: r
{. W5 I7 A% t8 v+ F1 W2 o
   Close();
& E3 V4 ?' Q1 ?5 g3 m% I( \3 w}
/ ~8 v5 B) ?! p  N' v' \void __fastcall TPSTNForm::Button2Click(TObject *Sender)' O+ A' P) a7 X$ ~  @1 z
{* H3 c0 A( ]" A" v4 S
   if(pThread){
; _# Y( ^1 O9 i' h& D      pThread->Suspend();
$ h0 R( |0 r! O/ D, ]7 u5 v1 L      pThread->Terminate();
& c9 n, B3 a( F# V! i; s/ G      delete pThread;
/ g: s' S& U  X1 }- a# m5 Y      pThread=0;9 P6 e/ c" {! s2 I' Q3 Y0 t% W% ~
   }
/ e+ H! c6 R5 n' E   UINT m_Port;) A0 n8 a; m8 _
   try7 h+ m2 d1 a: F5 X/ y
   {
  @+ F, O, m( z7 {      m_Port=Port->Text.ToInt();
+ o( r7 V- }5 I" r2 s% E. N   }% V% n0 J* |- G  ^5 F( ^
   catch(Exception &e)& L2 F1 J- }( P1 ^
   {) [* f; Q# i! l& P- `
      ::MessageBox(0,e.Message.c_str(),"Error",MB_OK+MB_ICONERROR);3 w8 m- |6 B& X* F) H  |
      return;
0 _$ d% o( o! V3 `; v; \. Q   }
: S/ x3 ~- w& H3 u- G$ \+ M7 b   PROTO m_Protocol;
9 h. ~6 q! q6 k  e   switch(Prot->ItemIndex)* a8 e: ~# `: V3 a4 ~
   {9 j# ^0 r0 N1 f& m" E
      case 0:
) c4 y1 ?: d( }" q         m_Protocol=TCP;
2 f# S) ~6 p, p: j         break;
8 r7 j4 s% f) \. l7 N: c* G. E      case 1:& R. ]: {- ?4 t8 _
         m_Protocol=UDP;
' N; j( k' j2 F. J- f& w         break;
- @4 b# N9 _( Y      default:6 K. n2 U+ [( k8 ]. |6 a
         break;
- r6 E: U" H/ d9 U! g* |0 e0 v   }
: l, u! `6 k- F6 q' g+ [   pThread=new TListenThread(m_Protocol,m_Port,FALSE);
" u/ f  j$ {- U/ A9 B5 z2 S( t   //pThread->Terminate();
$ T$ N' x% \* j# w# [7 H  h3 E5 Y! Z+ g}4 X$ w! x2 j6 d: A0 R- j
void __fastcall TPSTNForm::FormCreate(TObject *Sender)
6 U" L. W* a' a+ c. @! g{
( u  s- V5 h, {: j) D" v( M' j; @   ::SendMessage(Prot->Handle,CB_SETCURSEL,0,1);
7 {, y3 `5 }8 H0 E}
6 Z+ O& D3 c; R2 W( @: n  y- X8 i8 Y0 r3 z% V
void __fastcall TPSTNForm::FormDestroy(TObject *Sender)
- o0 {3 H5 N4 m' e4 }6 `: |{
# u% h% U% a6 v1 W   if(pThread){
) {$ o/ ?& e0 `% L4 b: Y, }      pThread->Suspend();
* ^! ^2 `! J* `$ w1 q      pThread->Terminate();}
9 u4 z. ^5 k" k) x}, \& q" W9 Y* b. b% m$ I8 u% h
上面的代码,各位可根据自已的需要和针对自已的应用,在数据处理方面加以改进就可以了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-8-15 11:32 , Processed in 0.023756 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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