找回密码
 注册
查看: 4363|回复: 0

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

[复制链接]
发表于 2004-2-15 14:01:13 | 显示全部楼层 |阅读模式
在CB中用socket api来写网络通讯程序9 B5 V$ S/ f& [
作者: kingcaiyao ,如转载请保证本文档的完整性,并注明出处。& {6 z) B+ E' d5 Q3 {# t; k
欢迎光临 C++ Builder 研究,http://www.ccrun.com/doc/go.asp?id=569% y' G* Y1 x5 U; U  p: q7 y
本文转自csdn,作者:kingcaiyao& t+ k5 K' N; Z( Z4 d( Q5 y" A2 d  E
原标题:在C++ Builder中用socket api来写网络通讯程序(同时支持TCP和UDP协议)
, K* z5 J5 T# K* |) Z8 C4 B原文:  http://www.csdn.net/develop/read_article.asp?id=19883
+ ]: S0 j1 l5 J3 q- u+ E% S& }# x) t/ l4 x- h
, i6 A$ Y: o1 \: d( f8 y
在7月4日看完sockcomp.pas后,我决定用socket api来写一个客户端和服务器并且同时支持TCP,UDP协议,于是我就去做,现将代码贴出来(已调试通过)
) s9 P) U; P5 L- j. b- WSocket api Client:8 ^0 M" J7 Z# n0 }& E- k3 Z; n

7 t# G  I' ~& R6 M& M#ifndef UDPClientH
( F7 h6 @8 L/ `/ s7 |/ B#define UDPClientH: {- }. V' Z4 q. w7 H. Y9 [
#include <Classes.hpp>9 g& e& Q8 f- u; U+ T# a
#include <Controls.hpp>
$ }& g+ v/ E' B+ R+ Y- m7 @#include <StdCtrls.hpp>5 y8 z/ K9 S! A# d' D3 N
#include <Forms.hpp>1 u9 q/ N" i% O# O2 M9 [# f9 S
#include <stdio.h>( Z. @9 _, o) o/ L) q
#include "CCEdit.h"
$ y2 }# N. Q2 }+ L1 P#define WM_SOCK WM_USER+1003 t% j- f7 A) D  K' x
class TLANForm : public TForm
, X# ~' j* U- x{# v( {- \9 j: ]$ f6 E
__published: // IDE-managed Components
  k2 K2 R0 d: z" ?! ~" D# e   TEdit *Port;1 S* g4 ]* i1 b" s/ [) j
   TLabel *Label1;
; t+ J' v1 z0 M6 h   TLabel *Label2;
; A* O5 I( F( |" z9 X   TComboBox *Prot;
% S9 Y' q& W$ N, {- p. ^   TButton *Button1;
8 Y2 y6 j+ K$ I- R! I2 s; {   TLabel *Label3;
1 @: o0 E1 V* ]# o+ S1 g   TEdit *Addr;0 a0 R4 C7 h. U9 K4 p& B$ t
   TCCEdit *TxtEdit;1 p5 v3 L  `; ?$ {
   void __fastcall FormCreate(TObject *Sender);- Y2 e& A2 F  ]3 j. r) T$ j3 c
   void __fastcall Button1Click(TObject *Sender);3 |1 S, x8 y3 E# a' @/ Y
   void __fastcall FormDestroy(TObject *Sender);
3 y* o" S, E) Aprivate: // User declarations2 X! p4 ]4 L/ Z
   void __fastcall OnRecv(TMessage &Message);
) s( l) h) H& g  p  U$ V; P1 I8 Hpublic:  // User declarations3 X# N- z( `! k- t
   __fastcall TLANForm(TComponent* Owner);' u; S( R( J" n+ |
   BEGIN_MESSAGE_MAP
) c% e; ~; N! n. T      VCL_MESSAGE_HANDLER(WM_SOCK,TMessage,OnRecv);" e. a. R3 {. P. a
   END_MESSAGE_MAP(TForm);
  \; D4 ^3 S/ L};9 J% A6 h2 j7 N% Q- a, I) _
extern PACKAGE TLANForm *LANForm;
! t8 o1 n% S4 s8 c#endif4 ?0 m0 X7 O1 [" J

6 ]3 M- c4 [' }' l: C) h9 R6 c1 j$ R7 A! B2 o
.cpp File
  b" T) \) D% f! ?/ D8 z1 O! G- A& P! w: q
#include <vcl.h>
7 K+ y& i! T% |" ]3 i( \) q#pragma hdrstop# e. u! T5 [) |4 H% u
#include "UDPClient.h"
' k# q& q# A' W/ Y#include "WinSock.h"
) m4 q3 b0 V# x' F1 r1 D" V#pragma package(smart_init)0 }8 @6 ~, J5 O/ x% I
#pragma link "CCEdit"' x) B, D# P! \! M) k; O
#pragma resource "*.dfm"2 a0 u. i( y+ V" d: i1 o
TLANForm *LANForm;
, c8 J( e8 S4 h0 A( oenum PROTO {TCP=0,UDP=1};
" n; c  }6 h* [" v* [* tSOCKET m_Socket=INVALID_SOCKET;$ X7 l4 F% C) k
PROTO m_Protocol=TCP;
: r0 D5 [( D+ [+ U' [' ~__fastcall TLANForm::TLANForm(TComponent* Owner)
8 L2 U" l& e! C! o% g3 }7 O   : TForm(Owner)
1 h) N- Q6 D8 q) @$ N& n# G3 A2 g4 X{
, m7 u; J# i0 `6 Y+ T5 V' n7 J  F2 @% d
}
1 \& a& K& g% ~2 |8 `void __fastcall TLANForm::FormCreate(TObject *Sender)- r$ D8 Y3 |6 U4 W. f( O9 d
{
" J* t3 L! Y3 Z7 ]1 @   ::SendMessage(Prot->Handle,CB_SETCURSEL,0,0);# M& X7 E6 b- j8 o
}/ J# x; d( o: t' F: p: {) T
void __fastcall TLANForm::OnRecv(TMessage &Message)
8 R) a4 R2 T/ m/ h3 Z{4 ]7 C4 ~3 X8 ?+ F
   char buf[4096];
5 o0 J: h! `- z   int nLen;$ @0 N" T2 L: }2 D
   struct sockaddr_in from;* C3 b7 c' |+ _( _# N
   int nLength=sizeof(struct sockaddr_in);! H7 z  ^+ n/ s1 a: h6 \- V7 v* P
   switch(WSAGETSELECTEVENT(Message.LParam))
% }/ }3 O9 X* d: @5 r- t3 P: ^- f6 n   {
% P1 q: R' x# h. M      case FD_READ:
+ n! C5 A( l6 w! g) U0 }( Z/ B         switch(m_Protocol)1 H) n# R, n" e/ o' @7 `8 p& D
         {
3 L* _- m. _- |' o            case TCP:# o% a( q5 \/ o8 z* l
               nLen=recv(m_Socket,buf,4096,0);
2 y+ ^4 q) [7 l$ G4 H3 u' L4 H3 T               if(nLen>0){
1 m  L# V4 g$ y0 i# c9 F' U- u                  buf[nLen]='\0';
6 r+ L, N1 V& x                  TxtEdit->Text="Received Length:"+String(nLen)+"\r\n"+StrPas(buf);
% {' r2 d6 V' i- \& A7 y               }
9 z( _1 Q) p# K* N               break;
! }: f/ H0 I# @6 m) t* r7 K* }0 I            case UDP:
/ `" m* n3 s, y$ z8 u' X9 E  {               nLen=recvfrom(m_Socket,buf,4096,0,(struct sockaddr*)&from,&nLength);6 l$ U2 ~  Q4 x2 ?+ q7 e
               if(nLen>0){
* T; g8 p" h* k' U' H% s" w                  buf[nLen]='\0';
% _  K, x, v" t/ k                  TxtEdit->Text="Received Length:"+String(nLen)+"\r\n"+StrPas(buf);8 l) o  T4 z0 w1 W" m
               }) u* E' _! |8 F% S" i. y1 M/ _# x
               break;% j( {* c5 P1 B1 A3 z1 C0 s
         }0 G5 F1 L: K  j$ `* l
         break;; w; @1 g/ [& w1 U; C) \: d
      case FD_CLOSE:  {! v; I. k8 u8 X0 l( @, u
         closesocket(m_Socket);  f8 ~7 q$ U5 A0 |8 x7 s' ~4 G
         break;
4 b% J, @/ }* s1 f1 f* {1 f; J   }
- W5 j5 b  W& e/ y}& k. d" ^6 C0 F

" q1 g. E, U" ?" X4 A3 z6 \" L; ~2 ^void __fastcall TLANForm::Button1Click(TObject *Sender)
+ g2 `6 M/ a# ?4 t7 X7 f# Y* v{5 i5 @9 {9 H- c2 X
   char szTmp[256],buf[4096];- Z* f! n- ^0 z' x
   int nSize=0;$ ?/ `2 ?8 H3 K
   UINT m_Port;
. x  D; e9 g5 ?0 {   AnsiString addr;; s2 M% h$ w; a' n2 o
   addr=Addr->Text.Trim();
) z( J, B8 v7 D- {  M   if(addr.IsEmpty()){6 b! e' P9 w9 K4 W; @9 X0 J+ K
      ::MessageBox(0,"lease enter the server IP!","Error",MB_OK+MB_ICONERROR);; y( p" ]! Z) X. s
      return;
; S& R6 @: c; \   }, A( ^9 h/ Q- K) M- K& T, C  W; _
   unsigned long nAddr=inet_addr(addr.c_str());
0 E6 ^! k# Z9 x4 K   if(nAddr==INADDR_NONE){4 Y: J# Z; p/ ?) a0 T
      ::MessageBox(0,"Bad Internet IP!","Error",MB_OK+MB_ICONERROR);
* A) x: X0 ]: P      return;}
" x6 U7 c, ?# {  X6 i7 Q( v/ \8 o4 Q- u2 I( C$ d" H6 V$ e
   try
8 _) F+ Z, m4 C- j8 a   {
4 Y# P$ X+ P5 W: v0 ^6 h/ q4 `& i" w      m_Port=Port->Text.ToInt();
  P  \% [4 i+ I6 `   }
1 t+ J, a* ~1 q( M   catch(Exception &e)( B" ~- M' }' G  |( p
   {
, Z% @7 Y/ U7 R9 f$ |      ::MessageBox(0,e.Message.c_str(),"Error",MB_OK+MB_ICONERROR);
' ~0 q! @7 ^' g& n3 ^3 f& {      return;5 q  N, U$ f# {, q4 B! c, `
   }9 R; \6 O8 F6 J. `+ p0 ^1 \
   switch(Prot->ItemIndex)  ^; ]3 \( y8 `+ [) v  n% v, _
   {, q& q: f) }# O
      case 0:3 R9 H) x$ M9 J) a
         m_Protocol=TCP;
+ V" U' H! h# B3 m; W  i7 M         break;
# b) L! I" r) P      case 1:# z" G1 m0 @, x7 C6 j
         m_Protocol=UDP;
- T' C# C# q- Y         break;, L; J9 a3 Z2 W2 R7 B6 }. l6 \7 W( a
   }4 X) ?1 l6 ]/ a+ S
   if(TxtEdit->Text.IsEmpty()){
% S# f8 [" `# x& g; ~, d, M7 a. J      ::MessageBox(0,"lease enter the text you want to send!","Error",MB_OK+MB_ICONERROR);' q0 m) `) A' O0 H1 a8 A- c5 N: c
      return;}
5 H. C* I: [0 G
7 a  I& e1 v" W7 I- x   //Initialize Winsocket
' f' v6 t5 v) ]% e  U5 M9 t1 H# W   WSAData wsaData;$ g- ^7 c' F' P) J
   ::ZeroMemory(&wsaData,sizeof(WSAData));
4 `- v1 w: a6 V6 M0 o   WORD version=MAKEWORD(2,0);
. e6 W0 }  i7 Z! q+ z: ^   if(::WSAStartup(version,&wsaData)){, F+ _* M2 S5 M8 i) G+ F: |% P5 S5 {
      sprintf(szTmp,"Failed to initial winsock enviroment!,error no:%d",::WSAGetLastError());
6 _6 X$ X+ k# v* {; @      return;}, J" B: @" l( n) s: U, g+ E. y

4 O' K" M4 f4 g% a$ ~5 v6 j# ]; i! ?   //Obtain the active connection
2 Y% U! ^% |/ }1 V4 P9 `   char ComputerName[255];& Q4 l7 \: B9 q/ T" S
   gethostname(ComputerName,255);0 M9 c. W6 M$ S+ J8 M
   struct hostent* he=gethostbyname(ComputerName);$ X8 u/ x, h/ `$ X" |" x
   if(!he){8 U7 ]0 h, y: s
      sprintf(szTmp,"Failed to get information to host!","Error",MB_OK+MB_ICONERROR);
4 R. \6 w3 K* O3 f) I2 o6 |" a+ _) b: q      ::WSACleanup();5 U5 P  [; ]7 |6 Y  w3 V
      return;: B( {1 ]' P0 E, d  s: k! W
   }
0 e0 R) c. `! y* J7 @; e( u4 K% g6 I   //create new socket, H. o# W, ?9 J( x* O; a. H
   m_Socket=INVALID_SOCKET;
" {5 b5 J- C7 G, l   switch(m_Protocol)% x% p' Q/ [7 n. c6 l
   {
9 C, e# I! f2 e- w6 |      case TCP:
& q+ b3 U/ h2 X0 Z8 b         m_Socket=socket(AF_INET,SOCK_STREAM,0);7 a1 y% F  ?3 z5 q6 X
         break;; P  s3 `2 X4 i! \: j4 m
      case UDP:% k# g! s, n7 w3 O% d
         m_Socket=socket(AF_INET,SOCK_DGRAM,0);  b6 m8 ?: u7 f1 T5 O
         break;8 K3 y! Z6 |9 p# I
   }6 O' j8 c1 ^7 ^; `4 s
   if(m_Socket==INVALID_SOCKET){6 V# i. }5 h& f4 [8 G" c# n
      sprintf(szTmp,"Failed to create a new socket!,error no:%d",::WSAGetLastError());6 Q: T4 z: \7 H: W
      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);$ Y: ?: u; v, ]) j
      ::WSACleanup();) u# A/ B  \. L
      return;" _* t+ m7 v2 ]$ z3 j' m0 ~- Q
   }
# m5 c8 s; \& @: g, M% U   //bind socket
# c; S/ ?  w6 B( y/ \) ~7 s) `( G   struct sockaddr_in client;; ^, G" p- K* M: j
   unsigned long nClient;  k" t/ U  M7 r7 c6 X) {4 g
   memcpy(&nClient,he->h_addr_list[0],sizeof(int));
" p& ?  W3 d" J   if(nClient==INADDR_NONE){2 @2 W8 S' G1 ^; W( B
      sprintf(szTmp,"Failed to obtain the local machine's IP!","Error",MB_OK+MB_ICONERROR);1 z! n0 J7 y; o4 S- f0 V/ e' l
      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);
: X& z9 a$ {# ?      closesocket(m_Socket);4 k$ _) a4 {' ^' Y% U
      ::WSACleanup();
( y9 L/ E, o# l! R4 @, o      return;
9 X# H3 D8 d" Q+ Z$ E- r   }
# J- q; ?: A7 j; ?. o4 Y+ }   client.sin_family=AF_INET;7 n0 K; `" V' Q7 h# Q+ l& }
   client.sin_port=0;
0 t% D& H( g- a' `9 _0 L& [# Z, W   client.sin_addr.S_un.S_addr=(int)nClient;
, A% W8 U, `9 x5 }' m0 e" j   if(bind(m_Socket,(struct sockaddr*)&client,sizeof(struct sockaddr))){7 |" s* r, ~4 B, i
      sprintf(szTmp,"Failed to bind socket!","Error",MB_OK+MB_ICONERROR);: K! T& t6 ~  E
      closesocket(m_Socket);
! i* P+ U! i" p+ y& s  m$ V      ::WSACleanup();
, {: {* K0 h1 y1 l9 w& P      return;}
7 p3 q9 L& M+ c& p1 j   //connect socket
! ?$ M& B# J, u* g5 s# q! |1 w6 w   struct sockaddr_in To;' @+ \2 R- h$ e2 J6 e' h
   To.sin_family=AF_INET;% ~7 m1 O5 T& F8 t- q9 a% V
   To.sin_port=htons(m_Port);
4 r8 p6 m+ y: m5 r1 j4 O   To.sin_addr.S_un.S_addr=(int)nAddr;
, R/ `6 q* W7 `. J% O# u' h   fd_set FDSET;1 T/ {. V) W0 y
   FD_ZERO(&FDSET);
4 g) e" t3 K1 }) }8 z( K- K   FD_SET(m_Socket,&FDSET);. g8 x6 V9 X- G2 ~  o5 h) E" V# T

4 a; d9 e9 @( [6 `; i
% I7 @: X7 ~! X- b! b   if(m_Protocol==TCP){
. V6 ~2 G( D6 r9 U3 m      if(connect(m_Socket,(struct sockaddr*)&To,sizeof(struct sockaddr))){" E0 ?! t+ X7 c
         sprintf(szTmp,"Failed to connect the object!,error no:%d",::WSAGetLastError());
# @% _* @# z7 f, p" m         ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);
) x9 j2 C5 ^% e8 i- S) S         closesocket(m_Socket);2 w, d; y7 g. \# v/ g0 D: ?
         ::WSACleanup();
: e/ W1 H3 N9 Y& l! G         return;9 U* h& M2 ?. ?; B3 {3 u8 N
      }5 \5 n# G% L7 E  ^- P( V
      int nError=select(1,0,&FDSET,0,0);0 X$ Z/ z' M& f# o
      if(nError<=0){6 c, D  v7 ]* G/ ?6 D! @
      sprintf(szTmp,"Failed to select socket!,error no:%d",::WSAGetLastError());" D, r8 T3 ?( S& P$ Q8 Y
      closesocket(m_Socket);
6 c1 I. {1 |) ]7 l0 _0 ^* z      ::WSACleanup();/ i- L% _9 f: J: M3 j; E
      return;}5 u* |. S* m3 ?/ _# {& n3 n+ \& J$ v
   }
3 a( a! s: Z0 m% d3 r% G   //Send data
' o; V7 f3 S5 G) p" B1 N. R6 e6 Y2 ~2 A5 {   int nLen=TxtEdit->Text.Length();
# k: ^8 G" ~: F+ g. I# f   if(nLen>4096){4 c3 N7 A4 f( Z1 p" _$ w/ K
      sprintf(szTmp,"The buffer is too size to send,it shoud not be more than 4096 bytes!");
: f- x' d5 t, ]* [      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);: ?2 C( e4 y& o: y; u  Z: |6 K
      closesocket(m_Socket);+ Q6 Z# D6 [* m7 ?: `
      ::WSACleanup();! J7 R' y  U, @3 {5 O
      return;
9 x0 P1 j" k3 V   }
2 c% A: |" ?# W" X$ A0 s1 W   strncpy(buf,TxtEdit->Text.c_str(),nLen);
6 U& b$ ~- R% a4 Z+ I   switch(m_Protocol)8 J( Q0 q  J1 r$ B4 {' P  W5 V" i
   {3 x. ]% m: j5 J5 f# [
      case TCP:" L5 _  J' s2 L" S) S5 t& d
         nSize=send(m_Socket,buf,nLen,0);
) j$ q8 a( w( F  d) x         //ShowMessage(nSize);6 K8 j  Z' U; @; I# }
         break;
+ K- Z5 e) Q$ z- G1 b      case UDP:
% |, e+ M, k2 M0 f: T         nSize=sendto(m_Socket,buf,nLen,0,(struct sockaddr*)&To,sizeof(struct sockaddr));4 Q9 e# t1 s5 v+ V
         //ShowMessage(nSize);7 Q* r0 R9 F) A/ @
         break;
& E9 g- u5 X1 G' d, y. r6 y/ [5 y- Y6 x, \9 R/ a/ i
   }/ Z4 |' L8 C* U5 [
   if(::WSAAsyncSelect(m_Socket,Handle,WM_SOCK,FD_READ|FD_CLOSE)){
( G8 Y! Z/ y- J3 c: `      sprintf(szTmp,"Failed to register socket event!,error no:%d",::WSAGetLastError());7 p5 a7 I2 u) C) e' f+ j
      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);
, \  J6 c+ ]/ p( M6 k% o0 u8 n      closesocket(m_Socket);
; s. a( `  X* u) X9 @) l      ::WSACleanup();
4 K5 [/ C0 X$ ?- W% r% O      return;}/ ^' A6 n1 X! h0 p
}
! I& O, s8 h6 Fvoid __fastcall TLANForm::FormDestroy(TObject *Sender)& b8 c1 O% ]2 K" k4 h! P* E
{3 s8 Z* }4 j. I+ q" ]- N
   closesocket(m_Socket);; L, |" y  }# N) E3 p, ^
   ::WSACleanup();
; N5 `4 h% ^! g1 u& G' G) G9 C}
; F$ [" w; h% t6 m8 ^% q, a4 U* R- _% `! O9 r2 C
Socket api Server:
" O' G1 |- ?% N- L! Y/ h.h File
7 k) X( f# z" _1 D. x#ifndef UDPServerH
, j- s; H2 m1 y- |#define UDPServerH
3 C( _/ \/ J/ P#include <Classes.hpp>
% Q. J) `+ Q# \#include <Controls.hpp>
( u4 y% H" `" b( `* F/ }2 {) a* \4 \#include <StdCtrls.hpp>
* v6 h7 ]$ G) {. i- {* B#include <Forms.hpp>. ~7 w* J" X1 h# t5 J5 W# X2 d- \
#include <stdio.h>+ G  W3 M! F7 H: L1 c0 ~4 W
#include "WinSock.h"
. M& _* e! g0 U* f) B. C/*#define WM_SOCKET WM_USER+1000
9 Y' e/ _/ A& ?, b6 u#define INITSOCKETSUCCESS 0& j) x; i# i& ~1 U% E* T6 ~
#define INITSOCKETFAILURE 18 c. i/ g& s# M5 e* f; h. A
#define CREATELISTENSOCKETSUCCESS 2  @& j+ D. Z6 x5 e
#define CREATELISTENSOCKETFAILURE 3
. ]; O" N5 V+ S0 C#define SETLISTENSOCKETSUCCESS 4# \7 Y! O9 M! _, H$ H
#define SETLISTENSOCKETFAILURE 5
* k1 o6 P5 m. u% X* M6 L% P: d#define BINDLISTENSOCKETSUCCESS 6, e/ B! i1 T' J! d% ~; u
#define BINDLISTENSOCKETFAILURE 7  o& g+ v. V$ j8 F/ ^# c
#define LISTENSOCKETSUCCESS 8
) x" V4 D3 J- }$ f) U6 V/ z#define LISTENSOCKETFAILURE 9
6 j+ b# h% n: j7 v, {#define ACCEPTSOCKETSUCCESS 10
+ e! g( I$ V4 O#define ACCEPTSOCKETFAILURE 11& O5 w3 h% G) m4 P
*/2 ]2 B) J* T; b& P; W% X: U5 v4 [) D
class TPSTNForm : public TForm
  n+ d: r  M6 q: I  `{
  h/ L, p/ E, n! x1 W* I__published: // IDE-managed Components
) B* C* B8 n9 G1 K; F8 F   TEdit *Port;
% o' s  `7 j8 ]6 a- F- |   TLabel *Label1;
- w) P/ }' ]; ~: k   TMemo *Memo1;
3 b& n& H( t3 E8 C   TButton *Button1;
: e; q0 v7 v' Q3 j; J* W+ Q   TButton *Button2;
0 m; |( v) J, R, E   TLabel *Label2;6 m0 t# `- t9 Q& Y1 t3 |' q
   TComboBox *Prot;
5 a. M& I3 q  f4 C' W# o   void __fastcall Button1Click(TObject *Sender);( {5 t% H; ^6 m5 k
   void __fastcall Button2Click(TObject *Sender);" f& c. _' w5 j" ?) G
   void __fastcall FormCreate(TObject *Sender);
+ H+ u' i# `4 V   void __fastcall FormDestroy(TObject *Sender);3 l5 g3 U% I0 p
private: // User declarations* s$ M7 z1 P( y; u+ _1 T7 w
public:  // User declarations( `7 L2 o* V. x+ c
   __fastcall TPSTNForm(TComponent* Owner);5 z8 b- h+ m$ F, o  ^8 c7 T4 A
};& h, @9 `( E. h0 N
enum PROTO {TCP,UDP};4 Z& F1 ]7 ~  Q5 A! u  U& ?7 S
class TCommunication:public TThread    //Communication Thread& K! w1 ?+ Z, c7 G7 F& s. g2 c
{
  q. j+ w9 n" G8 wprivate:
9 G0 e9 v4 s4 I/ ^# S' Z   SOCKET m_AcceptSocket;
5 K# w4 O' b; x$ o, ]' w* `   char szTmp[256];//ERROR MESSAGE: f& B& }6 l+ L& l1 q
public:
0 z, V0 C6 z: H, W9 `) [" f   __fastcall TCommunication(SOCKET m_Socket,bool CreateSuspended);6 F3 ?4 U5 e0 o6 ^! s- M* b& M
   __fastcall ~TCommunication();
( E$ Z! E2 d5 h, H' B+ tprotected:
# B1 l9 z# @/ |  {   virtual void __fastcall Execute();. F* `/ _/ g  o+ V
};3 q8 k$ H* b3 h! d
class TListenThread:public TThread //Listen Thread
. |* z% c: B8 `{
% o1 K- X* m" p' Wprivate:# R9 z( c; G- V6 l0 i/ W
   WSAData wsaData;
& ]( P' \6 W0 K   struct sockaddr_in server;
% _' @4 M. T1 h/ A6 l   fd_set FDS;
, Z% b2 G; S# P   UINT m_Port;
+ m  L$ d# C& w) Y' o   PROTO m_Protocol;
' f$ m6 a7 j. o3 g3 }! [+ |. @   char szTmp[256];//Error Message" C9 J5 k1 F! i2 I% I# U( e. M8 W
public:
* O( Q3 a  o; m5 p# t4 [, a   SOCKET m_Socket;( `6 l/ G" V, ]: l1 L8 F
   void __fastcall DoError();0 A4 @0 N2 {+ x& G7 W
   void __fastcall InitSocket();
, [! [' {* R$ A2 O- s   void __fastcall CreateListenSocket();% R' Q4 Y/ }) |
   void __fastcall SetListenSocket();; ?9 H' d: R# S. ?, G
   void __fastcall BindListenSocket();. D( {9 p8 h( K% L
   void __fastcall ListenSocket();
. i' t! G8 A9 v6 Q9 `
) [6 ^; @/ P. J% x0 L$ Mpublic:
5 E! ~  k1 C2 k6 _   __fastcall TListenThread(PROTO m_ProtocolA,UINT m_PortA,bool CreateSuspended);+ n! t9 k# b$ R  A: r4 ^/ A
   virtual __fastcall ~TListenThread();
  W" ]/ M2 C/ E/ g1 e! Sprotected:
( G% d0 B7 f- B% Y   virtual void __fastcall Execute();
3 M: p3 K0 ~: |- ~/ w& B};
' r) x) }. G0 ]* J+ T5 mextern PACKAGE TPSTNForm *PSTNForm;
. A. R. Q) E! z3 d1 X#endif
! l: o( |0 e3 \! w) G.cpp File4 u& I! s$ v3 T& n0 U
#include <vcl.h>
- G9 U" J' D9 H7 O' Y9 A#pragma hdrstop+ ^9 y( P8 m+ s+ Q
#include "UDPServer.h"5 P% y4 F% A4 }% ~* K; a
#pragma package(smart_init)
5 z3 e3 L7 ~& I/ G#pragma resource "*.dfm"* v" e' @8 t, K1 D
TPSTNForm *PSTNForm;( \1 ^* j: j, b0 }0 V6 {9 B, O& z
TListenThread *pThread=0;
' _; x8 H- k! _7 W9 O8 U8 n) y, z//******************************CLASS TCommunication For TCP****************************************************/ [; s7 B% i* Z, U
__fastcall TCommunication::TCommunication(SOCKET m_Socket,bool CreateSuspended):TThread(FALSE)
8 K" r2 S* q' {" u$ q9 K: p; g& u{
9 m8 e2 U& Y  s; W) B; t   m_AcceptSocket=m_Socket;
. ?) X& V4 l( ]4 t+ b, p  h   szTmp[0]='\0';
" c8 h6 G- [( ~9 a: x4 l' U+ X   FreeOnTerminate=true;; b3 ]3 l; {" t7 j5 u
}* a7 a- t# P6 M- D, g9 d$ i
__fastcall TCommunication::~TCommunication()
1 r4 s, B3 B1 K{
" L% y8 G8 m% L! g  // closesocket(m_AcceptSocket);9 P; A" k- v3 \8 z0 c& ?1 Y7 ?
}
" o2 p  A( d7 B$ Nvoid __fastcall TCommunication::Execute()1 X5 H0 p8 @1 A+ {
{2 P) h1 ~% S5 ~
   char buf[4096];- k0 n* W% Q' R% a: B: e# K; T2 @
   int nSize=0;+ n6 e7 `$ t3 m+ a8 W5 u
   nSize=recv(m_AcceptSocket,(char FAR*)buf,4096,0);' Z/ {. {# z/ H+ l# v# N4 T1 w
   if(nSize>0)
8 B9 G# f7 q) o+ R0 |. y   {* V* C9 \" m7 f& P: B$ o
      buf[nSize]='\0';; ^" {4 ~, _) E
      //Display# u6 A7 j; o( @# e4 n3 s
      PSTNForm->Memo1->Lines->Add("Received Length:"+String(nSize));4 h  c; |9 ?2 v0 D" C6 a: L
      PSTNForm->Memo1->Lines->Add("Received:"+StrPas(buf));
% _2 x0 d/ }3 E% S      //Deliver5 E! `% L' B  g% b- B
      ::Sleep(100);3 c; R5 h2 r/ \
      send(m_AcceptSocket,buf,nSize,0);
3 b: Z; \- K5 R/ g   }5 O3 l; n. k" E
& N$ l% r- p; e9 ?& t6 ?2 w: }3 F
}
& u' R- t8 H% i( ?: L. b" V* W3 h//******************************CLASS TListenThread*****************************************************" P2 f  H/ k" {) W; v" @6 b# `) ?
__fastcall TListenThread::TListenThread(PROTO m_ProtocolA,UINT m_PortA,bool CreateSuspended):TThread(FALSE)7 l# G* S( Q' Y/ t0 ^6 C. {- l/ ~
{" }" k5 w7 Z) @8 j) s
   m_Socket=INVALID_SOCKET;
4 ^+ ~, Q3 U3 b6 X! U   m_Port=m_PortA;
0 t! O, A. D. s9 Q: p   m_Protocol=m_ProtocolA;" w, i. P0 J# W# j4 e  a8 Y
   szTmp[0]='\0';' Y8 G$ |( j* m# A/ k0 P) n
   ::ZeroMemory(&wsaData,sizeof(WSAData));$ H- |) z3 k! M5 p# p
   ::ZeroMemory(&server,sizeof(struct sockaddr_in));
8 a. R6 g' p0 g& \8 b   FreeOnTerminate=TRUE;//Automatically delete while terminating.
& Q  n6 T9 [; f4 I( R}5 _' E, R8 _! H/ w
__fastcall TListenThread::~TListenThread()# g2 ?! Z$ u& z8 x9 N; @/ M! ^
{
5 w5 y' R# b* t   closesocket(m_Socket);
3 h. X, P1 A  z! U7 p* _0 t   ::WSACleanup();3 n  P8 e# W6 ]5 x
   m_Socket=INVALID_SOCKET;
8 h' ~) W; ?0 v; q4 Z   m_Port=0;
; g' F; I/ T) a; A& S   m_Protocol=TCP;
5 L% a5 l4 E  H1 J- G2 ^" @; b   szTmp[0]='\0';5 [. q2 U0 j. D1 b+ w, A% z
   ::ZeroMemory(&wsaData,sizeof(WSAData));
, b3 M0 U$ l4 ~  C; |  D, U; z   ::ZeroMemory(&server,sizeof(struct sockaddr_in));
3 ]) H7 |) `! N6 P2 A- A" W6 h5 L}
7 f2 Q* _+ D5 ^6 L4 {void __fastcall TListenThread:oError(). O* Q1 N9 D3 C* [* T8 e
{
9 J7 k5 [0 x! s% L) z9 k! Q   if(m_Socket!=INVALID_SOCKET) closesocket(m_Socket);
! ]. A, `& u' L   WSACleanup();
! B  R! S7 X  ^$ |   return;
( Z6 a$ A& M: i}
8 K: O  m1 \3 e+ J. k% Xvoid __fastcall TListenThread::InitSocket()
! |5 C8 Y8 M1 B  L  C! ]3 H* h2 b{" K7 @! g1 u- z/ u! T) m5 \2 K
   WORD version=MAKEWORD(2,0);' S$ X0 u. M% Y" Z/ {% S
   if(::WSAStartup(version,&wsaData)){
6 h, p" L) U5 K, b: L9 y& u- r7 x      sprintf(szTmp,"Failed to intiailize socket,error no:%d",::WSAGetLastError());
& A  O$ f  T! F/ x# j# ~      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);
! n" o' e7 l* N+ G  C" O6 ?$ _      DoError();
. n: L  C. P4 c2 S' i      return;
; ?; ?3 G( C( W; X9 {   }0 J! @! c& _0 E& U: w- K
}8 c* x3 s; b% a% Q. ~& s4 T
void __fastcall TListenThread::CreateListenSocket()6 ~7 M5 p1 f  r/ }- d
{
$ I2 s/ y6 B4 r& R; |   switch(m_Protocol)' y/ i) M$ [, {
   {8 h4 Y4 e2 D% h/ u' Y6 p
      case UDP:" B1 v! V" S  i2 d2 L( N; d
         m_Socket=socket(AF_INET,SOCK_DGRAM,0);+ x7 x# \) n  q. @
         break;' G' F9 Y8 q* N9 g
      case TCP:
$ C* ^# R  s; G1 s+ X) e6 |         m_Socket=socket(AF_INET,SOCK_STREAM,0);
0 }8 s: Q4 V6 H1 `& z3 u& A3 T& l         break;
* T1 j" s  v$ Z- L& O$ }: k! w  S* b      default:
4 H. `7 S1 `7 }- H1 W         sprintf(szTmp,"Error protocol!");. O$ q9 R1 p* z( [) e
         ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);
& J( j8 P: ^. X. c         DoError();) L$ O$ X. x' B# {4 c+ W; k
         break;9 v% x; t- L; U
   }0 D8 j5 W0 `9 ~( M
   if(m_Socket==INVALID_SOCKET){$ n% X* K* S8 ~  N9 f, }
      sprintf(szTmp,"Failed to create socket!");
/ J# H/ [( E) B* F      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);$ v4 A7 i! Y, Z2 x# t# n0 r
      DoError();- f" x9 R- P5 `5 ~
      return;& A7 t# [* f5 B$ u
   }) f( [. B. b$ H3 a( @& P0 W9 G
}  o. m- J' b% _' y6 ^
void __fastcall TListenThread::SetListenSocket()1 G) |$ `& v: t1 A5 H
{/ d9 D: x" a' l* g3 W
   server.sin_family=AF_INET;
: C; m6 p- [$ ?& H( O   server.sin_port=htons(m_Port);
- y, L" [2 v2 Z1 }   server.sin_addr.S_un.S_addr=INADDR_ANY;
( ^4 M6 ^( E1 U7 T   int NewOpenType=SO_SYNCHRONOUS_NONALERT;7 m! w( D) d5 X! V2 |
   if(setsockopt(INVALID_SOCKET,SOL_SOCKET,SO_OPENTYPE,(char*)&NewOpenType,4)){* N7 f" S- J2 S8 ?3 c& i! j9 w: g
      sprintf(szTmp,"Set socket option error,error no:%d",::WSAGetLastError());
/ R6 d" s. \4 Z$ ?  u$ p3 M2 F8 f      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);4 D0 T: a* |8 D
      DoError();
- ]2 H' `2 A8 Q1 v      return;
# z/ f3 S3 h* V/ S: S, q   }$ s$ }, q) M  F& u% J& k/ U
}
; D( \7 w! E' K6 q5 mvoid __fastcall TListenThread::BindListenSocket()$ `* h) F  R0 p+ U
{3 ?) x& |4 h2 W/ [8 {
    if(bind(m_Socket,(sockaddr*)&server,sizeof(struct sockaddr_in))){: I' R. z9 \0 `
      sprintf(szTmp,"Failed to bind socket,error no:%d",::WSAGetLastError());
+ r9 s. }- u" o; X% j8 \; I      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);
# J4 O& E/ w* n9 ?. a* c      DoError();
* i( o7 f; M1 N1 Y6 M, z      return;  i6 o: g6 p- q6 q* J& A* T; N
   }
- i  a% l, y: R+ ]4 N8 v' g8 \- ^1 y' p7 I" f
}
$ Z7 {. d0 T2 u2 _- Y1 F8 |void __fastcall TListenThread:istenSocket()
# |" y5 A4 b$ O$ f{, g6 s6 g1 a# j9 d
  if(listen(m_Socket,SOMAXCONN)){" W' x. P2 m1 A3 X, d5 J! n
     sprintf(szTmp,"listen error,error no:%d",::WSAGetLastError());% X0 L5 [) J7 t5 M) n
     ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);0 Z( R/ G  r6 J1 ^$ }) ]
     DoError();) V/ W: K* p! G" L. ^, [
     return;) b9 [$ I/ O6 d8 h" q' L3 }
  }
0 [7 [& u. M8 d2 B1 M% f1 D  //Determine whether there is any connection
# Y8 O5 b5 B1 B; Y/ F  ]2 f# F: P  FD_ZERO(&FDS);; d2 i6 ~7 X* ~
  FD_SET(m_Socket,&FDS);$ T& T; W! W4 W7 A. v
}
6 ?2 N4 ~2 e1 \  T# N! Lvoid __fastcall TListenThread::Execute()( `7 g1 z/ s$ a) n1 _
{+ S# X! C# q7 G# n0 Q
   char buf[4096];
2 k3 o2 m+ g$ D: D) Z   struct sockaddr_in from; //for UDP
) A3 z% Z  y4 S   int nLen=sizeof(from),nSize=0;  //for UDP1 j( V( d7 c, Y, @+ c
   InitSocket();$ e8 |3 ]* w$ J; X- I- Y
   CreateListenSocket();$ b( z6 I; p2 k4 D- @
   SetListenSocket();4 C  m2 o/ g8 O7 ^* q/ W% D
   BindListenSocket();5 M9 A& h4 i; R- ~  h
   if(m_Protocol==UDP){1 @- Y  [+ D- z2 H
      while(!Terminated){2 o7 X( Q4 M$ g2 J# q7 L+ Q9 h
         int nSize=recvfrom(m_Socket,buf,4096,0,(struct sockaddr*)&from,&nLen);- C( i2 B" H6 g0 P0 h. y
         if(nSize>0){+ S3 Q2 }8 w) d1 o& U8 I. c
            buf[nSize]='\0';( x: Y/ Y5 q/ D! F: o
            PSTNForm->Memo1->Lines->Add("Received Length:"+String(nSize));
$ A& Z( g4 m# ^- D- g* f- Y            PSTNForm->Memo1->Lines->Add("Received:"+StrPas(buf));* ]4 ^4 {. j! [3 a9 X+ y7 g  r" k
            ::Sleep(100);
' E7 b5 g' G) s/ f* e% o' i- d' I% _3 Z            sendto(m_Socket,buf,nSize,0,(struct sockaddr*)&from,sizeof(struct sockaddr_in));1 u5 O5 f4 e! K7 y( Q
         }
$ S0 h: D) x, E0 B8 W         else return;
5 q* }( W( J( m' [4 E- _/ V/ }; u  {. o% @+ x
      }! i+ I" d2 R% v; H
   }
( h* M- @* o6 q4 E   ListenSocket();9 o  w  ^* d5 W8 w8 {' }  M
   struct sockaddr_in client;5 h( {# M4 O' T+ q' `) O. |8 s+ P
   int nLength=sizeof(struct sockaddr_in);" Q5 Z1 A% {0 p) F6 F! F
   while(!Terminated){$ b* w. y# {4 h$ L5 h
      int nError=select(1,&FDS,0,0,0);2 Q5 w+ h: Q: d" G9 A
      if(nError<=0) Terminate();
* h/ F! r/ h& {( o      SOCKET m_AcceptSocket=accept(m_Socket,(struct sockaddr*)&client,&nLength);
+ j5 F( c& V  f7 E' T      if(m_AcceptSocket==INVALID_SOCKET){
/ l4 I$ n3 [' e1 J$ P6 l7 G% G6 l         sprintf(szTmp,"Failed to execute accept,error no:%d",::WSAGetLastError());
7 P! L% ]- z6 x$ |7 K         ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);
, m' q' b4 y4 x- {7 Z- U  v         DoError();; V' R5 T6 @( g. h
         Terminate();
7 s* r% U) E$ [" r* l: v         return;
2 ^7 n) {* s3 \      }/ A1 @2 l) c3 i4 p
      TCommunication *pCThread=new TCommunication(m_AcceptSocket,FALSE);
% {- ~# ~6 X& n) Y0 X; b" w      pCThread->Terminate();
4 N# B! d% k& R4 }      pCThread->WaitFor();
8 o' a# V$ n% k* e$ p3 r. k   }# Z& v6 @# b* X/ e$ C
}
) ^7 y" {6 i& E  a  u$ L//************************PSTNForm*********************************************//
3 V6 X$ J6 ?4 T__fastcall TPSTNForm::TPSTNForm(TComponent* Owner)" v) b# P6 ], W8 Q1 o
   : TForm(Owner)
) C' n8 Z9 Q9 h$ E{
; ~) g: R# m7 d& M: @: C}
) J! ^& {5 e- P" ~. qvoid __fastcall TPSTNForm::Button1Click(TObject *Sender)% P: m% N/ ]3 o
{
) ?$ ^8 o# v% ~1 J9 ?5 [3 j   Close();5 Y2 h9 `3 ^" y0 J
}
9 c6 w2 G# L$ F( ?2 _3 F# S- l2 B% Z2 [void __fastcall TPSTNForm::Button2Click(TObject *Sender)
+ P$ K/ j. e8 Q& K+ v9 W* n{
! @' a# Q5 b( x; A; I% {5 K   if(pThread){
- ~% ?: D5 ]: K- ]$ X7 l      pThread->Suspend();
! s+ M/ r" d6 Z. ^0 i2 n      pThread->Terminate();
3 z. L" p+ h2 U2 J+ Y7 G: J      delete pThread;
- Y% \9 q, }5 O; V  h      pThread=0;; R# r& n; K7 K% O" u" C  |
   }
$ |/ S" H6 E1 ?/ O% B, [& A   UINT m_Port;
, O+ w& k0 w  r) r% v4 B   try# x# ?4 q: V1 P% R+ |/ `
   {5 N4 d- Y. K2 w$ j3 X! D
      m_Port=Port->Text.ToInt();
1 F9 ~: I8 _2 e* g4 K" o0 _   }$ }8 R- L* z* _+ b
   catch(Exception &e)3 o( U4 N) \! r% t
   {
1 w7 |2 z, B& S6 {$ _      ::MessageBox(0,e.Message.c_str(),"Error",MB_OK+MB_ICONERROR);2 l' \* [+ R/ g- u' P
      return;) b6 Q, ?. ?% O& G, ?8 |
   }4 j) C$ W1 v) M: |
   PROTO m_Protocol;
8 e% a. E  ^! \, y   switch(Prot->ItemIndex)( n, }6 y& T; q+ ~
   {
0 h! y. Q4 v8 k; a      case 0:- f) y) w, L4 Q2 d( M; a+ c
         m_Protocol=TCP;
1 \! ^& m9 i* D+ g& F         break;* P1 z) V! e+ t0 v* O
      case 1:6 h+ [: n& K7 i' F0 M! C
         m_Protocol=UDP;
+ b' U4 t; D" B& B! `         break;
% r+ o; \! _9 E7 @* a! h# V: q; @      default:
' U$ F* F2 h# V! z; ?         break;+ _) y6 Z7 \+ o. j, B7 @
   }
( K( s- O# x" s* ?8 l. t& z0 y/ O   pThread=new TListenThread(m_Protocol,m_Port,FALSE);
0 v2 _8 J+ U; P4 F( h   //pThread->Terminate();" c# v1 A) M; L
}
9 A- S9 R: T2 {void __fastcall TPSTNForm::FormCreate(TObject *Sender)
/ D2 U" ~1 z+ _  b" f+ |% X{% |  W+ r9 @+ d" c9 S; n" A
   ::SendMessage(Prot->Handle,CB_SETCURSEL,0,1);1 S5 x. Z: P; H3 e/ u! z
}% T1 g# f2 z6 q$ H% |8 T: \7 b1 a
  {( w1 H1 z  f. F! [5 M; ^
void __fastcall TPSTNForm::FormDestroy(TObject *Sender)
* _6 d6 s3 \" o, i7 m) y{2 q" n& A4 z+ z9 s
   if(pThread){
" L& V( Q8 s7 N  \% u      pThread->Suspend();
& n. q# k/ C& F6 N      pThread->Terminate();}
( t$ D6 _* x1 @3 ^- _}$ w6 q2 I( ~$ B3 Q( l: g
上面的代码,各位可根据自已的需要和针对自已的应用,在数据处理方面加以改进就可以了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-10-2 04:22 , Processed in 0.019468 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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