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

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

[复制链接]
发表于 2004-2-15 14:01:13 | 显示全部楼层 |阅读模式
在CB中用socket api来写网络通讯程序
$ p, o  Y4 k- z' \作者: kingcaiyao ,如转载请保证本文档的完整性,并注明出处。. X/ Z/ E! z1 d) w
欢迎光临 C++ Builder 研究,http://www.ccrun.com/doc/go.asp?id=5690 q# v; P, b; B; {
本文转自csdn,作者:kingcaiyao
. ]* N4 m+ c) z4 ~原标题:在C++ Builder中用socket api来写网络通讯程序(同时支持TCP和UDP协议)1 D$ T2 n" \$ S2 |8 n
原文:  http://www.csdn.net/develop/read_article.asp?id=198831 \* f" L' @3 i# G$ V
' h- s( i) w7 U9 ^5 @+ ?- K0 A

. ?3 p' B/ j1 O在7月4日看完sockcomp.pas后,我决定用socket api来写一个客户端和服务器并且同时支持TCP,UDP协议,于是我就去做,现将代码贴出来(已调试通过)
! J+ ]/ F, _: m* n( f0 NSocket api Client:. M' @/ |, k. m* }" @# I

5 F9 [4 f  L& z$ ~7 y3 r8 ~; f( }#ifndef UDPClientH
( P0 ]/ z: [- |9 [7 N9 b#define UDPClientH9 B* {$ @, E' f" m6 }0 }3 F
#include <Classes.hpp>
+ d/ J4 |2 e5 ^: j% Q#include <Controls.hpp>
: ]3 l0 V  J+ v; z  q. J$ F. y3 p3 A3 V) t#include <StdCtrls.hpp>. y9 p* f* s! B+ _" R; w
#include <Forms.hpp>
& G" U, a& E7 l1 @+ Z+ Z7 V#include <stdio.h>
! y& t4 T% r* M#include "CCEdit.h"/ S0 _* S( ~& D6 t0 n3 W
#define WM_SOCK WM_USER+1008 |2 B/ A0 \. @1 W/ o
class TLANForm : public TForm
6 m8 y1 j- @7 ~- q# Z{
5 }) U* U/ x% P  d$ _% e__published: // IDE-managed Components
1 N9 [" |2 z2 x  [   TEdit *Port;
+ o- Q5 M% J! P, m   TLabel *Label1;
5 W, I! _' ~2 r% B- G6 L, S/ T   TLabel *Label2;9 {% B  J/ t: v$ t) J
   TComboBox *Prot;; ]2 E. ?( N* C: |' K! D/ u% E
   TButton *Button1;
$ q; N  }- n  |+ A2 A9 Y: F   TLabel *Label3;4 W: }8 h8 s) k% l2 @
   TEdit *Addr;: c6 C& F5 a5 W+ X
   TCCEdit *TxtEdit;
5 @, }! d5 V- T1 }; T: u   void __fastcall FormCreate(TObject *Sender);5 z: `, b5 B0 F2 W6 C3 N, n
   void __fastcall Button1Click(TObject *Sender);
% Z8 U% ?* Z) R: G   void __fastcall FormDestroy(TObject *Sender);$ z4 ~4 V5 ]( `) {6 n- z: k& V, q
private: // User declarations+ r: T4 w9 N4 K. Z+ [4 N
   void __fastcall OnRecv(TMessage &Message);& ?) ]4 ?: h1 Z" M- {, V3 j, i
public:  // User declarations- N1 d9 j( C. n7 t# r8 X
   __fastcall TLANForm(TComponent* Owner);& v7 l/ j6 G5 E9 ^& a8 b+ @9 p
   BEGIN_MESSAGE_MAP
$ Y; N- O! ~& g0 w      VCL_MESSAGE_HANDLER(WM_SOCK,TMessage,OnRecv);
, L: w4 k  V7 I7 S" _7 y   END_MESSAGE_MAP(TForm);" M; t) |( K: W- F6 r
};
7 P: R1 V( r1 [. E  n% sextern PACKAGE TLANForm *LANForm;
$ D+ F9 u8 z  s3 x% K7 G#endif
% J+ D4 l1 O2 D4 \7 Y$ t; m* \, T- e5 L. l/ D' @" w
: O' v) q# R# v
.cpp File1 ~$ T" C6 Y' \6 m: E
. R- d  ?$ L: N" K* R4 L/ P
#include <vcl.h>/ y0 x& e$ Z" z3 S, M* e
#pragma hdrstop; D+ V2 e1 y9 w7 r; ?
#include "UDPClient.h"! _8 w/ y( h$ A6 W9 z. ~3 M. M! D
#include "WinSock.h"
1 c: A: m$ z& e; y#pragma package(smart_init)# s) }" O! c& G0 _
#pragma link "CCEdit"
) O+ ]- j' T- T/ D6 h#pragma resource "*.dfm": X9 h( j8 s% T$ y# l
TLANForm *LANForm;8 F' R2 L$ U* B) O
enum PROTO {TCP=0,UDP=1};
6 _- }. t  P' hSOCKET m_Socket=INVALID_SOCKET;
+ g8 S% A5 D6 p( n; GPROTO m_Protocol=TCP;
- r( v$ K/ A8 ^__fastcall TLANForm::TLANForm(TComponent* Owner)
! h+ a! ~& m2 M! w" F% V! D   : TForm(Owner). g& B- z8 N: O
{; l* D1 v4 V4 Y7 Z8 j
/ s" \) t/ \- b$ @
}0 G) Y1 `- V% M9 C6 i" \
void __fastcall TLANForm::FormCreate(TObject *Sender)
8 {" R  a2 c" C0 f{8 h% [7 L6 ?/ Y: u2 F
   ::SendMessage(Prot->Handle,CB_SETCURSEL,0,0);
" z. x4 A& U% \* F4 r) Y+ P}; l& q* |+ C* t5 h; F
void __fastcall TLANForm::OnRecv(TMessage &Message)
* F* t5 L6 G0 v* o: O{9 i( R) [) H2 V9 [) i
   char buf[4096];8 O- Z8 P3 p% a3 l$ J( q
   int nLen;
6 Z( C/ v. t% Z! A) Z. [4 J   struct sockaddr_in from;
7 B: M* V& h1 v, ^' q3 s, X) [( W   int nLength=sizeof(struct sockaddr_in);5 P, I, c) n: `& d8 U: W
   switch(WSAGETSELECTEVENT(Message.LParam))% Q; S0 \  u$ b7 t2 y
   {
5 {9 U+ A1 m- u$ a# E      case FD_READ:& s: v6 _/ r( {1 c  }- d0 @
         switch(m_Protocol)" {! l! L" i" C* o1 U2 T6 z; W
         {5 d$ U7 U( z3 e
            case TCP:7 m' b/ I: b* V; b4 f- ?6 m! u
               nLen=recv(m_Socket,buf,4096,0);
4 B% t% X" ?6 V8 g" y) L               if(nLen>0){0 q" a0 j* S' G2 v
                  buf[nLen]='\0';/ I% n2 z$ V+ G' w  |, m
                  TxtEdit->Text="Received Length:"+String(nLen)+"\r\n"+StrPas(buf);
* {8 V, h7 l6 F( T8 u, y. ^" A# C" ~+ d               }
" }" I9 d4 z5 M/ q               break;
9 `# t6 }4 @# y; R) j- M            case UDP:$ a6 I4 z5 ~- ]# R
               nLen=recvfrom(m_Socket,buf,4096,0,(struct sockaddr*)&from,&nLength);, y& A, C2 A9 b) D! a% M0 p
               if(nLen>0){
3 O) t8 [7 F. `/ z' A  K                  buf[nLen]='\0';! s8 u3 G6 E  f  o  H
                  TxtEdit->Text="Received Length:"+String(nLen)+"\r\n"+StrPas(buf);
; ^/ Z" q: e5 r* C1 i8 a1 {/ j               }( t0 u" Y  |6 V# y. }/ P! J
               break;
2 k. {0 ~  |( R# {         }
) a& ]/ ]. F0 ?' S         break;
# q; y/ v& D% R      case FD_CLOSE:
! c: b/ c/ ?( R& C         closesocket(m_Socket);
: y' Y: Y" ~* I( C         break;
+ D  t( w& W% V1 u- P' x5 v3 O   }
+ Y6 E/ ~( f0 Q, C; ~' }}
& V( t, |3 L6 T2 j, S" j( H, k6 V8 H, o
void __fastcall TLANForm::Button1Click(TObject *Sender)
6 K' U" j2 o, p4 w, V( _6 q{
2 Y4 }2 k: N! l   char szTmp[256],buf[4096];
9 {: g. ~/ D3 [' k; [* N0 K& Q6 v% l   int nSize=0;2 m& U6 L* }  z/ z' z& C! _6 w
   UINT m_Port;
, i. u# c6 e' X7 G1 u   AnsiString addr;
" l: N6 O3 w; F# }. w) w6 }7 H   addr=Addr->Text.Trim();
2 E% v( ?( u0 n9 U" w4 B   if(addr.IsEmpty()){! D( v& e# V% Z) l
      ::MessageBox(0,"lease enter the server IP!","Error",MB_OK+MB_ICONERROR);
/ V. B4 \: L! x' }& K8 S      return;9 ~' g9 p( V0 A2 t2 h' S$ y& j1 j
   }( b; p) \0 _, v+ [. i
   unsigned long nAddr=inet_addr(addr.c_str());" _/ f0 p0 V" W% }
   if(nAddr==INADDR_NONE){
$ q1 [& r7 F  n" d8 E; G      ::MessageBox(0,"Bad Internet IP!","Error",MB_OK+MB_ICONERROR);6 V- S) m7 P. [6 G( h
      return;}
9 C) A8 l9 i+ a( J/ `3 W% I, v9 @8 }. d/ F9 {* s% t
   try- {: N4 N6 Z: {0 \5 ~2 T
   {
& P: s1 g: r. c' W; M, e& e' ]2 |/ J! @      m_Port=Port->Text.ToInt();
7 C3 ?# |! x4 T  I  i   }
% a7 \6 B! g# Q" a   catch(Exception &e)( N1 D+ R, }' N9 l+ M) H( c8 V. n
   {( Q5 E2 l) H* g( T9 m
      ::MessageBox(0,e.Message.c_str(),"Error",MB_OK+MB_ICONERROR);( `5 V8 H8 ?4 ^1 r
      return;3 ~; u: S# Y- v' Z7 D$ s' }
   }9 _  r. i9 O$ Y# l4 }
   switch(Prot->ItemIndex)/ m6 S! Q0 T7 Q
   {
/ `0 {  x7 P9 W$ N" P      case 0:& S1 _+ m4 I$ C9 \8 n
         m_Protocol=TCP;3 e* _/ H' ?. Z% q& f' c# ?
         break;
" u8 D: `; e- v5 H. j8 Y. R4 E      case 1:8 T" m. c, s$ [. q) m5 h% u1 h
         m_Protocol=UDP;
& P  \. ^# i7 O) L         break;
6 [- S" q  I9 k+ R7 Q7 {# R  x   }, ^8 B. f% b" ]) e$ o" W& x9 h3 {
   if(TxtEdit->Text.IsEmpty()){
' c3 [" r2 Z) d4 F      ::MessageBox(0,"lease enter the text you want to send!","Error",MB_OK+MB_ICONERROR);; ~) i% o0 J" T4 g
      return;}
  S/ L7 B  z9 z9 O5 z' x
3 Y) d% S5 A8 A9 h4 L   //Initialize Winsocket
2 [) d" t! ]6 A; [; F, C   WSAData wsaData;+ N4 [! c) c9 c- K$ h/ s9 Y" E
   ::ZeroMemory(&wsaData,sizeof(WSAData));
! }" ^& {* K. ~  s9 x   WORD version=MAKEWORD(2,0);
, v  a( l' L6 n   if(::WSAStartup(version,&wsaData)){
$ Z2 o: _9 i; D" \* u5 Y/ e      sprintf(szTmp,"Failed to initial winsock enviroment!,error no:%d",::WSAGetLastError());
: Z( S. {" }* {0 u4 u5 L0 _      return;}) J% g! |1 P6 U4 C" V

- X' C2 g6 l( _' c" y   //Obtain the active connection2 H& }1 |% X2 s% f* I( N2 V2 t
   char ComputerName[255];
5 |) H" C& V7 v( \2 J   gethostname(ComputerName,255);
3 s% H% V; F! E, O, b: K& M% Q   struct hostent* he=gethostbyname(ComputerName);
' |) H! F& P' X; M   if(!he){0 p' ^7 l$ I" `+ I
      sprintf(szTmp,"Failed to get information to host!","Error",MB_OK+MB_ICONERROR);
/ {! e1 f& O( X1 U2 L2 G5 d! `      ::WSACleanup();
, `2 L7 G1 O4 x* W7 ]1 i      return;* g' ?& r8 Y5 c( O
   }
1 q4 Z9 A* K& g: T. f6 d; u   //create new socket4 h% _. y0 u+ f
   m_Socket=INVALID_SOCKET;2 q3 S' p3 \5 w1 b3 h
   switch(m_Protocol)
; A% j. i; [! y# G1 y1 u9 j9 u   {0 E. O3 ^. u8 e6 l( d
      case TCP:, @4 \. P) E  J
         m_Socket=socket(AF_INET,SOCK_STREAM,0);
; E  a% T# p/ t3 i, n4 \         break;" H" c& m& B2 c* T/ C( x/ K  d
      case UDP:5 {7 \! ]0 ?/ @+ Q+ f  }8 E8 n, m
         m_Socket=socket(AF_INET,SOCK_DGRAM,0);- j- j! F# U9 f4 X2 o% ^
         break;
# R1 {7 k9 O2 y8 T   }0 x7 L/ ]1 u; g, K& m( w
   if(m_Socket==INVALID_SOCKET){1 M  M* d; m% P' H+ g+ z
      sprintf(szTmp,"Failed to create a new socket!,error no:%d",::WSAGetLastError());$ `, e; p% H) }! I3 `
      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);
- C/ z7 q8 f0 G& D) G      ::WSACleanup();
# N4 y% E+ c) y      return;; P! G! ?. E3 F" S$ y) n' T
   }# y' H  c+ {, \7 f5 \0 w- n
   //bind socket0 G8 d- g# f4 c$ f4 c1 X! m% H
   struct sockaddr_in client;
6 Y$ v, M9 b, o* c: T2 H" S! V1 B' A" L   unsigned long nClient;4 y; V" O0 h+ W4 Q0 L
   memcpy(&nClient,he->h_addr_list[0],sizeof(int));
2 {! N, x, h, m1 e+ U/ J" I   if(nClient==INADDR_NONE){
3 Z( F. I& R% L$ @/ ]7 C$ B      sprintf(szTmp,"Failed to obtain the local machine's IP!","Error",MB_OK+MB_ICONERROR);) Y* m& [- O' Q, y
      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);. F5 f  k# j- [: ?
      closesocket(m_Socket);
: H* f- N$ R3 a  Q3 S      ::WSACleanup();7 ^9 w" r; U7 p) s3 q( {
      return;
, a7 e: A0 ^' u. ~; S7 p   }1 j$ L. e) v" ^" W- Y
   client.sin_family=AF_INET;7 t8 v" W& h8 t# W3 t  Q
   client.sin_port=0;. G( B1 \6 X" H" {: q0 V* N- K/ p' L: S
   client.sin_addr.S_un.S_addr=(int)nClient;
- V1 I' n4 n6 E  K1 A7 z6 |' O   if(bind(m_Socket,(struct sockaddr*)&client,sizeof(struct sockaddr))){
4 l/ {# t% p( W# L8 Z6 |) k      sprintf(szTmp,"Failed to bind socket!","Error",MB_OK+MB_ICONERROR);: I1 H- B) _, w! f
      closesocket(m_Socket);7 @7 I) Q: V% O4 W
      ::WSACleanup();* x& G: s) V- e, g; n# e
      return;}8 u8 f- h) W$ x' }- q  ]
   //connect socket
$ r0 }% w$ W; W" P9 v   struct sockaddr_in To;' q5 m# Z8 f5 j/ B9 j
   To.sin_family=AF_INET;0 Z% X" A$ b/ E" q
   To.sin_port=htons(m_Port);0 J3 z: ~4 d/ T7 c' O+ N9 o
   To.sin_addr.S_un.S_addr=(int)nAddr;& f2 o! P+ }/ ^. \- F- J
   fd_set FDSET;
0 R$ J( \& J8 y& q0 v" ]+ @' t2 J   FD_ZERO(&FDSET);. d" {# |# ]* y5 H5 c( R6 ~
   FD_SET(m_Socket,&FDSET);% L0 g" p4 U. }

) b; R6 V0 S# s% T7 {; y& \
$ C: ]! M  W! B, S$ [   if(m_Protocol==TCP){; e) v% Y' I( s# I: p
      if(connect(m_Socket,(struct sockaddr*)&To,sizeof(struct sockaddr))){0 V3 \# [5 u, v5 ~4 ~2 V
         sprintf(szTmp,"Failed to connect the object!,error no:%d",::WSAGetLastError());
# |( k, h, u" l3 M( Y& Q         ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);- t" }: s& Z1 G8 O1 t9 Q* r5 Y
         closesocket(m_Socket);
* L2 p6 P0 u+ v; I         ::WSACleanup();
& N$ h( J9 `$ ^         return;) g' k+ m* M, I1 N6 Y; W* y
      }
9 S  q1 Q0 o$ a  `$ `) Y: a      int nError=select(1,0,&FDSET,0,0);! Y0 `+ b6 {6 q' A$ k$ B6 \
      if(nError<=0){
! L* O' e6 `( |% @+ d# x      sprintf(szTmp,"Failed to select socket!,error no:%d",::WSAGetLastError());
) `8 A9 |& }, f2 G+ |& R  \  ]$ z      closesocket(m_Socket);3 ]2 C3 M0 `$ L! Q- J7 I8 `/ Q, L, v
      ::WSACleanup();6 f% e% v- A0 b* [3 n
      return;}
$ F* N3 g6 W# M- x   }( m1 Y; M0 }( j7 W- k
   //Send data
0 ]0 i# d3 Y( s$ R, D7 G# e   int nLen=TxtEdit->Text.Length();
) K6 K/ D9 H) j' S: j. l. r) o   if(nLen>4096){8 l  f) i6 K( Q, Q  E: `. u
      sprintf(szTmp,"The buffer is too size to send,it shoud not be more than 4096 bytes!");; Y/ c5 \3 O/ ?- f' W8 o
      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);; j# r1 n2 R7 q+ P) p- I2 U% x  Y
      closesocket(m_Socket);
) ~* r  l1 T! ?2 G      ::WSACleanup();9 Z6 \7 b1 T0 v: K2 J0 [
      return;
& z, m$ v1 ~- P: B- v4 o$ i! J   }+ b  d2 r; g) V! h; G
   strncpy(buf,TxtEdit->Text.c_str(),nLen);
5 f' A5 A/ v7 C! L; W   switch(m_Protocol)% l3 i  h9 W" d
   {
  p% w0 K7 P( ~; d- m5 E      case TCP:
, l9 q" e# U$ Q+ L0 c5 g' y         nSize=send(m_Socket,buf,nLen,0);$ ~& M/ b, c( I) d! Z$ J$ k1 g
         //ShowMessage(nSize);
0 e* Z0 o* z+ S) ^3 {         break;' \, {$ G) `" B- U3 g1 M
      case UDP:6 w4 M5 f7 w9 F; l
         nSize=sendto(m_Socket,buf,nLen,0,(struct sockaddr*)&To,sizeof(struct sockaddr));
$ M) c  K7 e" U4 A& n% o" \         //ShowMessage(nSize);
; \, e4 {$ ]' |" l         break;
) X; E& D" k& I6 q! @: J. y: Z4 ~$ W5 K" s) T
   }' W2 E9 }8 T% w" H/ r
   if(::WSAAsyncSelect(m_Socket,Handle,WM_SOCK,FD_READ|FD_CLOSE)){
+ o: Q7 a. w3 c% I( I9 C: X# H0 U      sprintf(szTmp,"Failed to register socket event!,error no:%d",::WSAGetLastError());
, b# y) O% }$ Q- O6 b      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);
, N0 e* w6 ?) z4 X      closesocket(m_Socket);1 \0 a2 y6 y' R8 q, ~  H
      ::WSACleanup();
0 x( P0 g4 B% b; M. I* c      return;}2 l( q- X- Z- j4 q" c& r6 Y
}' X2 y4 u6 n: m
void __fastcall TLANForm::FormDestroy(TObject *Sender)
. l) \2 Z* y, y5 C" ]3 R/ r{5 \. J5 I/ C6 F+ X3 N* C
   closesocket(m_Socket);( d) {/ F7 l! q
   ::WSACleanup();
2 Z5 f1 d8 f3 }  q}$ Y3 {2 A; N9 b+ o

$ W% u: v! b7 b& G4 hSocket api Server:
/ v3 l9 V6 t( C  n% u5 n/ R% g( \" Q.h File
) W. o6 h7 P+ o7 H#ifndef UDPServerH5 ?! R! j( E2 _- o5 n
#define UDPServerH
! j& |% ^+ v% u2 D) k#include <Classes.hpp>' b1 h4 `( B8 {% B" B% K! p$ Q
#include <Controls.hpp>
! W6 H- X& I8 B#include <StdCtrls.hpp>" [% N, x3 J( z8 g2 v* ?* j3 T6 B. @
#include <Forms.hpp>
& H" c% M. [! J' Q9 _# l#include <stdio.h>
5 j0 U1 P* J. c8 Y2 a( W#include "WinSock.h"5 g# `: S; T: K  H5 |
/*#define WM_SOCKET WM_USER+1000
# Y/ g. i# r8 v2 ]  @" W8 o#define INITSOCKETSUCCESS 0
, }( q3 v% H# x, v#define INITSOCKETFAILURE 1  N& D- R& V2 f9 {) y: j
#define CREATELISTENSOCKETSUCCESS 22 g, F4 G% w" b) k3 I9 C
#define CREATELISTENSOCKETFAILURE 36 N1 }$ g6 A1 @$ O. m: y, K
#define SETLISTENSOCKETSUCCESS 4. A1 B" q! k6 p/ `6 r' X) l8 s7 P# P
#define SETLISTENSOCKETFAILURE 5
7 q3 `; b2 E2 F2 b7 l$ X. F#define BINDLISTENSOCKETSUCCESS 6' `3 |8 v( c& B8 G
#define BINDLISTENSOCKETFAILURE 76 m; m$ P$ j# y& [
#define LISTENSOCKETSUCCESS 80 q7 w( F' ]8 [7 |. w
#define LISTENSOCKETFAILURE 93 p& y: d% W) V2 F/ \
#define ACCEPTSOCKETSUCCESS 10
( \, [) i1 j$ D$ m* Z/ z% z3 i#define ACCEPTSOCKETFAILURE 11
; A' L" ?% H8 J0 |, W4 i*/. p- v' S6 p4 \0 i6 e  f
class TPSTNForm : public TForm0 a! Q; n" d" n5 x+ W0 ?
{4 ?) @2 s6 R" `! B( e, I
__published: // IDE-managed Components
4 z+ q6 n2 I/ i   TEdit *Port;6 \0 P7 D' i1 c8 i, x' i$ p9 \, z- b! ]
   TLabel *Label1;: ]+ j6 O# o4 Z( i
   TMemo *Memo1;- l, T; B+ [: ]) W! N( @3 _
   TButton *Button1;
8 J6 t9 e, v8 t; \" l# W   TButton *Button2;
- w! r! v9 h( U. x: b   TLabel *Label2;, r. i, A- ~# J* d  S
   TComboBox *Prot;' x+ @8 b. X* ?/ f1 \& }. z
   void __fastcall Button1Click(TObject *Sender);
" ^9 L4 J; k1 W0 i% T+ J8 c" I   void __fastcall Button2Click(TObject *Sender);
4 f' J9 I3 p- r8 |8 a2 b   void __fastcall FormCreate(TObject *Sender);5 k- {- T3 z5 H7 b
   void __fastcall FormDestroy(TObject *Sender);* q2 Z& r( \. o" \* ]  t" [: x
private: // User declarations3 G2 Y1 \, s8 G6 d% x6 E! e
public:  // User declarations
# M2 K1 P) b3 J3 U   __fastcall TPSTNForm(TComponent* Owner);
- J( |7 D3 ?$ y, R0 J, C! N};
2 M9 B' I5 A( G) V( r, [+ M5 Eenum PROTO {TCP,UDP};$ p4 F7 B7 s. D. G* X/ u
class TCommunication:public TThread    //Communication Thread
+ @  c: h2 H" T. n- {6 b{
6 a7 P! r* D1 S4 r" Mprivate:) j3 R% O' p$ X! o1 p; Q6 B5 B
   SOCKET m_AcceptSocket;
: P# R6 j. Y  m# K4 W1 X   char szTmp[256];//ERROR MESSAGE( c" w. x  v3 W
public:
6 p7 h* L: c: [/ [   __fastcall TCommunication(SOCKET m_Socket,bool CreateSuspended);3 t3 g' z4 \% Q9 U" E
   __fastcall ~TCommunication();* I! q, X7 H# j
protected:* N& d8 m, p. v/ k" k1 m1 S
   virtual void __fastcall Execute();  b( k& s. J; P6 y( A# Q; N
};2 A4 {9 E/ N8 b; F" k8 A
class TListenThread:public TThread //Listen Thread
5 s% U5 X. M( L0 [3 G- q{& f% m; {+ c- a
private:
: G9 _2 N8 S9 l/ i# P   WSAData wsaData;% F6 u4 U& M' ^: T
   struct sockaddr_in server;
3 m8 ~) `2 W5 J2 _9 T- h   fd_set FDS;  J8 u& V  r1 [9 l$ j; {: N2 w" d2 |
   UINT m_Port;* R! v* A  b6 }; s
   PROTO m_Protocol;
: a5 d; X9 L: f* L4 M   char szTmp[256];//Error Message
& S# ]: P0 ?7 r# P3 O" |' }$ tpublic:% ^; Z# j) ~1 C3 T2 }
   SOCKET m_Socket;3 |. e; i* d  F( d$ B
   void __fastcall DoError();
0 W0 E- o6 T6 }: x# v3 m   void __fastcall InitSocket();
. B9 `0 A* r/ ?3 l/ `4 e  T0 q8 w   void __fastcall CreateListenSocket();
8 P& e+ s9 J! ~3 h' N& p/ g   void __fastcall SetListenSocket();
5 s, [# F  ]8 ]8 J   void __fastcall BindListenSocket();
0 K) H( i/ L; q; x   void __fastcall ListenSocket();
) |" Q: M- I  z. Q& O0 o  k
% r' Y( C$ v8 s: M' xpublic:0 f4 v+ r( T1 z" R  R& M. @- Q
   __fastcall TListenThread(PROTO m_ProtocolA,UINT m_PortA,bool CreateSuspended);
& H% k6 V7 J. r7 p% ^* v& p   virtual __fastcall ~TListenThread();
6 i" L0 v8 _2 S6 G8 t  x/ N6 oprotected:9 W9 Q: {; R: C2 \- c
   virtual void __fastcall Execute();
7 K: s! Z- |0 P* O: k9 x, n! l/ M};/ b8 z' v: l: D
extern PACKAGE TPSTNForm *PSTNForm;
5 N& Y* g& a7 ]+ v9 P#endif
/ [9 J' O/ F* {3 r  f.cpp File
# y8 D4 G) q5 Z6 S#include <vcl.h>
+ P" z2 A% q3 V#pragma hdrstop
7 n8 }8 k  O8 H1 {#include "UDPServer.h"$ H1 B) o( S  J1 ?
#pragma package(smart_init)4 ]- l3 r: j/ D7 P0 T# y
#pragma resource "*.dfm"! l0 S4 g. d! L2 B6 }- V
TPSTNForm *PSTNForm;# f. O' F( F/ @4 n8 G
TListenThread *pThread=0;$ j' [/ D5 w( h8 @$ c1 }
//******************************CLASS TCommunication For TCP****************************************************
# X( E. ?1 t; ]- {9 C__fastcall TCommunication::TCommunication(SOCKET m_Socket,bool CreateSuspended):TThread(FALSE); ^- O; q4 F7 U( [% a5 Y1 z
{
( ^" y6 {# p* m  D: e; A( X   m_AcceptSocket=m_Socket;+ G5 g! s4 {. A+ H( F; l
   szTmp[0]='\0';8 k3 t9 A" Y0 T# |
   FreeOnTerminate=true;$ ^. D* T" R- l) B0 p( _
}
$ ^* P+ J# @3 c+ G$ i3 z9 a+ A__fastcall TCommunication::~TCommunication()
8 D: s& C+ Q  g  E; T{0 |  t% O0 e/ [0 `
  // closesocket(m_AcceptSocket);$ O( }6 F8 C: R3 u+ L- [" U& }
}
* e' I4 u: A6 I, i5 _void __fastcall TCommunication::Execute()! K' {" [9 C" t4 G% D1 r% ?6 N, P) g* y
{
2 [: I# X9 e+ ~$ |5 c" s" ]! E   char buf[4096];1 B# Y3 u5 ^; U- Q5 T9 I
   int nSize=0;7 O. D, Z# F) n' H# y1 b/ C
   nSize=recv(m_AcceptSocket,(char FAR*)buf,4096,0);
5 F1 Z; y+ X. b& W; m' S1 F" e   if(nSize>0)6 M# `# @: b4 p4 P
   {
/ P3 ^" G) ~% l      buf[nSize]='\0';
: t/ @* r7 T" r" y6 n0 w+ `      //Display# K- f/ Q- f! `4 L
      PSTNForm->Memo1->Lines->Add("Received Length:"+String(nSize));2 T: a0 ^' N! X5 O1 e( d9 o
      PSTNForm->Memo1->Lines->Add("Received:"+StrPas(buf));2 ~2 F, [, f0 B' l" k; B5 f: j
      //Deliver
# [7 V2 K4 M. e+ ]      ::Sleep(100);$ [) \9 U7 k/ `; S6 @, b9 N
      send(m_AcceptSocket,buf,nSize,0);
0 u. B# F/ o$ c; ^# d3 w6 U   }  L& [5 g$ |6 p7 T" g& i! q

& m2 e8 u* m2 P& |# L}
8 O( v! V' Y: s. l  C5 L$ W//******************************CLASS TListenThread*****************************************************# L( S3 N; R! b0 f, f
__fastcall TListenThread::TListenThread(PROTO m_ProtocolA,UINT m_PortA,bool CreateSuspended):TThread(FALSE)7 O1 D  w& `! R: j
{' f4 z% i6 ]( X6 H! J4 h
   m_Socket=INVALID_SOCKET;
: r: d+ E5 ^. r: B" O5 _/ ~   m_Port=m_PortA;, {+ \: r7 Y0 J3 ]5 M1 z
   m_Protocol=m_ProtocolA;
0 Z0 J* `! b8 i7 _+ [& X   szTmp[0]='\0';  U8 C3 s% C6 B, g/ e) D9 ?/ E1 @
   ::ZeroMemory(&wsaData,sizeof(WSAData));
: b( c$ \. a; E" Q9 _9 H   ::ZeroMemory(&server,sizeof(struct sockaddr_in));6 {) E: l- L8 y/ b& u
   FreeOnTerminate=TRUE;//Automatically delete while terminating.: \! E! C! {7 d
}
+ w3 ^4 ~! A3 P8 N- @__fastcall TListenThread::~TListenThread()$ A# k0 {# [: e7 \- v0 c7 X8 @
{! z& n* D; Q2 [; p1 R  W' Q/ ]7 k) R
   closesocket(m_Socket);  u5 Z; x2 w- j
   ::WSACleanup();
9 U# i) Q0 J9 j7 a* |$ D   m_Socket=INVALID_SOCKET;
. g# S. R1 d0 m6 m   m_Port=0;
& n. d2 S8 q/ u. S   m_Protocol=TCP;$ d5 K5 v' c. R9 X$ D
   szTmp[0]='\0';
0 D! V4 W. v3 i5 _   ::ZeroMemory(&wsaData,sizeof(WSAData));* X7 q8 R' q% d% {
   ::ZeroMemory(&server,sizeof(struct sockaddr_in));( O6 f4 q" i% b) d1 ~& {
}
" n9 J! t& N, Z3 [; t; ]4 t. pvoid __fastcall TListenThread:oError()
. N/ [2 ^# }4 J8 ^! d  w{
7 ?( Y+ l7 c( r5 Z8 g0 w   if(m_Socket!=INVALID_SOCKET) closesocket(m_Socket);3 S+ X6 B( u7 O1 c. m5 P: }
   WSACleanup();( Y4 X: M: R5 [: d& J7 ?
   return;; |) R# v8 O  y; g0 y, E
}
7 C- B+ }. H  ]& }8 [0 O# Wvoid __fastcall TListenThread::InitSocket()
$ t, ~+ T! D9 ]: n/ o# G. c{
9 \8 G; I2 p. R0 ]( `5 O  y3 g   WORD version=MAKEWORD(2,0);
, t) D, n% K! j( C, v; x   if(::WSAStartup(version,&wsaData)){
0 ]8 L* B  Q# l) Z& [' k5 ~* Y      sprintf(szTmp,"Failed to intiailize socket,error no:%d",::WSAGetLastError());
* y; G* S' @; D0 f      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);
$ X- @/ {) n* i5 U) T" j! \0 E/ n      DoError();# J6 E7 u! `  W5 G
      return;# x( A' k- |0 ]5 {. [8 O- g
   }8 b2 B# l8 a- h! J7 D9 X: c
}2 k" c8 ?+ @2 ^3 R  u
void __fastcall TListenThread::CreateListenSocket(), O1 y3 q8 L+ B8 K, [% e
{$ o2 Q# d4 Y0 a7 w2 F8 _
   switch(m_Protocol)
% Q- F" G- Q; U* d- M   {
2 g% b" b" N, U2 z1 @( s      case UDP:
% n9 [  M0 Z/ L* t$ U         m_Socket=socket(AF_INET,SOCK_DGRAM,0);
3 i: x8 t( x  h  _         break;6 {) K/ M1 R$ W9 _  _8 G6 p4 R$ q
      case TCP:+ N& }4 w  h1 z
         m_Socket=socket(AF_INET,SOCK_STREAM,0);
2 H4 Q! @7 q9 L         break;
4 d+ B, E0 O( f$ c4 ?      default:" S: C. ?0 @6 A( W) h/ y% U
         sprintf(szTmp,"Error protocol!");
; h- e0 }% L' A1 `- E! I         ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);
2 U/ y! l+ E# ^  Z  O3 P4 g4 U9 [         DoError();1 s  N2 @( N3 h
         break;( j3 Z+ u* ^* k! z4 l& J: [. d
   }
  F+ d+ X9 U3 l  m/ z0 F. g0 b   if(m_Socket==INVALID_SOCKET){& _% X+ f% j( A/ v! Z9 z  u
      sprintf(szTmp,"Failed to create socket!");0 x7 d6 U' H/ X3 Z* @# A
      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);
3 U) f0 e, N! z7 ^; Q3 z      DoError();  N0 ~( L+ ?2 v0 Y1 T: r: m
      return;
1 s9 y! ?, U# H+ @, c   }1 ~7 V9 {) e, T+ y3 V
}: B; m6 j* `: q
void __fastcall TListenThread::SetListenSocket()
/ f+ A/ t% |$ s- I! v5 F{
, v" `8 A* A& ]) f- |/ L  i9 R   server.sin_family=AF_INET;
' Y! z2 Q5 N" p* v  H1 h4 Q9 J' d   server.sin_port=htons(m_Port);: l3 e* e7 B1 k# t; s) A0 j6 z
   server.sin_addr.S_un.S_addr=INADDR_ANY;  j! S% R8 h) ~
   int NewOpenType=SO_SYNCHRONOUS_NONALERT;9 k% {/ n! D5 z% o& k& \$ i
   if(setsockopt(INVALID_SOCKET,SOL_SOCKET,SO_OPENTYPE,(char*)&NewOpenType,4)){
. ^& C) z3 v: y1 B* i4 p& v      sprintf(szTmp,"Set socket option error,error no:%d",::WSAGetLastError());& K; j* w5 Z+ c' b# N; o3 x
      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);
/ H- z+ X/ E" [3 i0 F# G6 ^9 ~9 C7 v      DoError();  `& `, N3 U# o2 s+ {7 X9 a
      return;
+ p' ?9 Y& @/ \7 f' E   }! O' r9 x+ t; X  L3 p
}
' Y8 s/ s( d) }) t9 l2 z/ h1 C7 S1 ]void __fastcall TListenThread::BindListenSocket()
! g8 M$ g# _( [& o2 T9 Y6 j{
! @+ D+ d* ^9 E9 h    if(bind(m_Socket,(sockaddr*)&server,sizeof(struct sockaddr_in))){
7 i1 T8 D7 ]& R( r& E3 z      sprintf(szTmp,"Failed to bind socket,error no:%d",::WSAGetLastError());
( m- R$ b3 N7 @) I' k/ a      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);1 u* C4 V: E$ B- |4 N' P
      DoError();
' U: M3 h9 Y+ b4 ?0 U      return;
+ h* z% q: H, j* ?" p& x   }5 b5 ]$ M# _1 ^& L% H6 j

$ s2 p8 S( [7 X# s. F5 d/ Q3 B}% C  z8 D# O, r4 k) o$ q/ j# v
void __fastcall TListenThread:istenSocket()* k. m9 ~" \9 y* a
{3 r4 x, \$ C2 e" d
  if(listen(m_Socket,SOMAXCONN)){4 l- H0 ~/ u, l9 X
     sprintf(szTmp,"listen error,error no:%d",::WSAGetLastError());. u* q5 Z) z6 v9 P. ]: `3 V8 M+ c3 L
     ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);
2 H( Y7 y* I7 C. w8 y! X* z     DoError();; e2 d7 B5 |2 j: i' D
     return;% y3 r8 X9 b& h2 Z4 X' P
  }7 u# H6 q0 z+ z
  //Determine whether there is any connection
' c0 b) Z# Z% Q+ B# z3 b  FD_ZERO(&FDS);
# Q3 G' b2 b% O8 u$ p  FD_SET(m_Socket,&FDS);
% c7 y: c3 X7 Y" p  R}# ^( u/ b, |; N5 O
void __fastcall TListenThread::Execute()
* J2 b3 n/ p  s8 i6 J5 M! A. h{, Z1 u" N# m+ A  N& E0 R
   char buf[4096];7 @' L2 _3 d2 ~! F/ }& w+ s
   struct sockaddr_in from; //for UDP, B& D" Q" f% o0 d2 [1 }
   int nLen=sizeof(from),nSize=0;  //for UDP
$ h1 d% g. f# i( p   InitSocket();8 l$ _9 t, L6 z
   CreateListenSocket();
, o0 ~0 d* P" u3 N; l- p4 `' q   SetListenSocket();
3 q% E; O6 \- a   BindListenSocket();
+ `$ A2 h1 M$ X   if(m_Protocol==UDP){( F' `1 z' m/ K- E0 Z
      while(!Terminated){$ y0 K8 u5 w/ K# G5 z
         int nSize=recvfrom(m_Socket,buf,4096,0,(struct sockaddr*)&from,&nLen);/ Y8 N; ?) Y' l: W, \4 \
         if(nSize>0){
( T2 W+ C) h- z            buf[nSize]='\0';2 B& g7 k1 Y9 ~, Y) c# p" d
            PSTNForm->Memo1->Lines->Add("Received Length:"+String(nSize));$ s% [$ R0 f$ P: i: T
            PSTNForm->Memo1->Lines->Add("Received:"+StrPas(buf));
6 x6 J, U# X7 A3 \) w            ::Sleep(100);# |4 ?& {' Q0 O3 ]. C  j2 k
            sendto(m_Socket,buf,nSize,0,(struct sockaddr*)&from,sizeof(struct sockaddr_in));& k: G7 s- j# N# R3 h  w' U" v: U
         }5 o+ y# a) m& T; q
         else return;. v  f: @: K5 c8 }
) e) C. q2 N8 Z1 G* i6 H6 Y3 v& D
      }! D8 I  H7 q! `6 J! k* {  J; E
   }" b+ N6 G! S8 u. E8 d8 c! C
   ListenSocket();! }. H! m& V6 q" B5 i0 y& t
   struct sockaddr_in client;
3 V* z! e/ O3 E   int nLength=sizeof(struct sockaddr_in);4 h) d5 K6 y9 e' B$ e7 n
   while(!Terminated){
6 ?, L6 Y+ u3 k" N      int nError=select(1,&FDS,0,0,0);3 [$ ]0 b' ~0 N" N% d! A3 u8 D  |
      if(nError<=0) Terminate();2 e! N& r2 N7 I, W
      SOCKET m_AcceptSocket=accept(m_Socket,(struct sockaddr*)&client,&nLength);
: K6 @" f/ G$ i      if(m_AcceptSocket==INVALID_SOCKET){
/ l! w5 V; a% m         sprintf(szTmp,"Failed to execute accept,error no:%d",::WSAGetLastError());7 z5 g, U7 x( T2 Z: p9 x# n% V. h
         ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);" `3 f: ^  y, C! I. ~7 l, ]' k; G% d4 o$ w
         DoError();
: ~+ d  d8 b- ^" N: m2 |% X: }         Terminate();5 H7 k- I" ^( Y( I) W
         return;
! d! W4 N# o5 s% A      }
" m' u4 C2 B) K& l& v; o1 s* s      TCommunication *pCThread=new TCommunication(m_AcceptSocket,FALSE);" x) y3 K1 T  `; q3 I! d( Y+ w5 y
      pCThread->Terminate();" E0 y; C- R  I; ~1 z. d- v
      pCThread->WaitFor();
. ?3 n9 t& |. m# I7 S. _& r; a( M   }
# W, [$ R: \4 v5 P. _}
. t& ]7 [3 q9 g4 Y+ \//************************PSTNForm*********************************************//
5 U: C5 I* r) Z1 D5 H__fastcall TPSTNForm::TPSTNForm(TComponent* Owner)
# j9 r% @6 b8 k5 Q: _+ M   : TForm(Owner)
& M4 s6 R1 Q& M4 ^5 G% ~. j4 w{: E) X* w' h+ q/ F( |
}
. E( x- ], L2 r" g' Q3 gvoid __fastcall TPSTNForm::Button1Click(TObject *Sender)
7 H5 c2 n3 x( i1 }  X* {{
9 o5 P+ W9 C# {( i4 I# c2 N   Close();
5 [& U3 y. f/ {4 Z" L' }8 E6 l}" P/ J5 r; `% s. G( H' o; h
void __fastcall TPSTNForm::Button2Click(TObject *Sender)6 @) f# [) t0 c+ K% b. k
{) [( O/ M7 ^& |; c  o1 X
   if(pThread){, w1 @2 t0 D2 Q+ d$ ~& d1 q
      pThread->Suspend();+ N1 c; f# b7 p; I- o. z$ {
      pThread->Terminate();
0 q8 X+ M' }6 o' b/ r      delete pThread;/ m; i& A  i- S5 R+ ]: S2 y
      pThread=0;% T0 R6 E# g* V1 Q8 s, c1 t  H
   }
) E: \) L1 w4 g+ a7 w4 g( a   UINT m_Port;( F1 a- x/ T! s+ \
   try
/ s  c' c4 E: W8 y- Y   {
0 m5 E# q2 _( X5 b- d      m_Port=Port->Text.ToInt();3 P/ Y  H. p; G) W2 D! P
   }( t% u: C1 H+ `5 I2 Q8 W' r2 m
   catch(Exception &e)* C( J0 N+ n3 X) V2 K* \" ]6 ?8 p+ V; w
   {
: C! a! v  z! I' n& _. X; ?      ::MessageBox(0,e.Message.c_str(),"Error",MB_OK+MB_ICONERROR);: T% i8 b) B0 S6 X2 t; y+ f, |0 P0 `
      return;
3 M' m' j7 ^& R8 v4 H# G$ d   }8 x4 s* T8 [2 v  u. o& Q. T+ m% Y
   PROTO m_Protocol;. a8 e- i: u' f  ~' |- e5 j/ u
   switch(Prot->ItemIndex)
# h0 x( d) p4 @8 Q   {
4 K' T3 ^/ E& X1 r      case 0:
- I/ i$ [/ C7 a- q         m_Protocol=TCP;6 C- W# f$ b  x( f9 y
         break;
9 Z3 Q! @5 O" G3 S$ f% c% q      case 1:
3 S% I/ J; f, _+ l3 c) D8 P9 a' V         m_Protocol=UDP;
- M  {, P, P& O4 Y         break;
8 i  e. A& |9 l+ ]      default:
/ F3 }; T  c* K1 }. z( U         break;- P7 \% ^5 O$ f7 F- X
   }5 v  U3 H2 ]2 D
   pThread=new TListenThread(m_Protocol,m_Port,FALSE);
, S: t; F7 M: J; e3 l) ~   //pThread->Terminate();- w7 @5 w5 U' z6 W0 T2 H0 K4 m
}) Z! L- T& n' q
void __fastcall TPSTNForm::FormCreate(TObject *Sender); c; b1 }% S5 s3 K3 ?5 G3 t, i8 G% n9 _7 G
{
: E2 V9 v* G+ }# D( [   ::SendMessage(Prot->Handle,CB_SETCURSEL,0,1);& G2 G( P& r7 Q7 S; g/ ?) O
}& Q2 F/ H/ @- t' \; |$ _
% o4 _( q% A( m$ q0 W
void __fastcall TPSTNForm::FormDestroy(TObject *Sender)
" r- b7 O6 j* r) d8 [. X# r{
1 R" T1 i  w7 K' W   if(pThread){- p- c. M: w+ B
      pThread->Suspend();" y7 f8 ]/ D# e3 `5 L5 D: C
      pThread->Terminate();}
& c( z7 Z& ^, N2 A}+ o1 A( {+ P" H
上面的代码,各位可根据自已的需要和针对自已的应用,在数据处理方面加以改进就可以了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-5-4 17:34 , Processed in 0.021990 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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