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

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

[复制链接]
发表于 2004-2-15 14:01:13 | 显示全部楼层 |阅读模式
在CB中用socket api来写网络通讯程序
+ q& y/ F! `9 c1 O8 L6 I作者: kingcaiyao ,如转载请保证本文档的完整性,并注明出处。
& C% x  a6 f( C+ }! [: @( A. i# E; ^欢迎光临 C++ Builder 研究,http://www.ccrun.com/doc/go.asp?id=5695 _+ ]6 T5 w3 B6 g7 u
本文转自csdn,作者:kingcaiyao
5 y/ |& |7 S+ t/ W% i: t原标题:在C++ Builder中用socket api来写网络通讯程序(同时支持TCP和UDP协议)
- v1 W& X0 U. T$ L原文:  http://www.csdn.net/develop/read_article.asp?id=19883
8 a% s+ V  `6 z6 S
3 O7 O; l% S% a+ w$ d' `* V+ _& @
. T8 F8 [  t6 y1 D在7月4日看完sockcomp.pas后,我决定用socket api来写一个客户端和服务器并且同时支持TCP,UDP协议,于是我就去做,现将代码贴出来(已调试通过)  {  t8 Q: p- n* s) S5 P
Socket api Client:
6 J9 {& ]3 Z" j/ s. T) r; {/ ^( c6 J' Q
#ifndef UDPClientH
% G' g1 B1 }& c#define UDPClientH0 ], M0 I8 E# P% f/ m% F
#include <Classes.hpp>
# @) y; u5 K' N2 }+ B& ?#include <Controls.hpp>: L9 R5 M3 g% d: R/ F2 M8 b5 ?
#include <StdCtrls.hpp>
8 f2 U8 f0 G4 m5 g) o#include <Forms.hpp>
" H% ]6 a9 N( ]$ o" E/ R#include <stdio.h>4 R' z" H1 A# V- a- L3 N
#include "CCEdit.h". j& N: G, T% F6 _
#define WM_SOCK WM_USER+100
' G8 ?; t1 r$ rclass TLANForm : public TForm- s; b3 ~; Y. [3 |
{
3 T* H& I5 K6 {, r  ]' R__published: // IDE-managed Components; G! h+ J( m6 h2 Y  r
   TEdit *Port;0 C( w* z+ H, ?9 ]' u
   TLabel *Label1;1 l6 ~) C/ K1 h) y5 h% Y; m
   TLabel *Label2;' E" Z& p. v4 A
   TComboBox *Prot;
$ n! f( w# a& U* |+ J   TButton *Button1;* P# {; z8 x" i( x1 \2 g
   TLabel *Label3;. f( Y" N( h' z  ]: e& j4 t
   TEdit *Addr;
: X- N6 F, M. z4 K   TCCEdit *TxtEdit;
4 M# g) d. G6 e4 Y3 }, X   void __fastcall FormCreate(TObject *Sender);
# n/ Q  R& T+ B: t   void __fastcall Button1Click(TObject *Sender);% B& ~% Q( E2 M  V( [. G9 g2 L
   void __fastcall FormDestroy(TObject *Sender);
* U& }' l; @2 p6 w- S) cprivate: // User declarations% ~2 ~( d, N* m: e0 f! `& K
   void __fastcall OnRecv(TMessage &Message);2 J, A  G" N0 \( `
public:  // User declarations8 x& @& Q: m5 a) W
   __fastcall TLANForm(TComponent* Owner);( B& t; ]+ Z0 b7 E/ L$ N5 k8 {
   BEGIN_MESSAGE_MAP/ k7 E: ~* u8 O, q+ y) p
      VCL_MESSAGE_HANDLER(WM_SOCK,TMessage,OnRecv);
, b! L( F0 F* y# m0 {& a   END_MESSAGE_MAP(TForm);: I. @, G. S+ P' |! R% C" c/ E- s
};: p; @9 s3 Q& K
extern PACKAGE TLANForm *LANForm;
' p* f' v3 `) a+ k. M#endif
4 F9 p! }$ n! x1 Q2 `
0 w# X0 x& o# y1 S1 u1 I2 q5 j1 J( t/ y8 F" u
.cpp File% A4 A  ]4 n6 Y! {% \% a$ H# p
) D9 _  V- F& `! ]" m
#include <vcl.h>
4 [/ D: H) K" e' V( j1 T#pragma hdrstop
1 B% ~% e- V$ X% z#include "UDPClient.h"
0 |( D+ k! \( B0 i7 I9 ~1 T* ?" `; x#include "WinSock.h"
# e* B( V9 G. f& W" `0 L#pragma package(smart_init)
  i+ X) L$ S$ U! p' [! ]% h' r#pragma link "CCEdit"
& A0 X* o4 j! K- `5 j' A#pragma resource "*.dfm"  B0 s+ t# o+ U  {( q+ ^0 d6 \
TLANForm *LANForm;
# q3 _4 u: b( l( H1 D4 u% J# renum PROTO {TCP=0,UDP=1};! e4 U& }1 V7 m( ^# {5 T
SOCKET m_Socket=INVALID_SOCKET;
' }  `. v5 k4 [* M" FPROTO m_Protocol=TCP;
* B  a8 J- M/ r__fastcall TLANForm::TLANForm(TComponent* Owner); l5 I: j, n6 k! S8 ~! G5 B+ |
   : TForm(Owner)8 f1 N8 F/ h- U& x' F) I- _
{! _8 ]6 |. M# ], Z. M# e

' {6 r( C* P$ [2 c! _1 @$ P}
) D# ^' a+ q3 ~# uvoid __fastcall TLANForm::FormCreate(TObject *Sender)* K! C0 j7 S# F
{, s, B% E+ {1 G
   ::SendMessage(Prot->Handle,CB_SETCURSEL,0,0);8 s9 F1 W; G  m( ]. b0 ~
}- U* ?8 p$ b# \4 O+ @
void __fastcall TLANForm::OnRecv(TMessage &Message)
3 |3 ]2 C, X% W* _. D{
2 [6 L$ C% W$ E6 F- I& G   char buf[4096];
' n  S) P0 W7 z   int nLen;) n/ \$ P% Y2 N: q) t# R( h$ w/ d; N
   struct sockaddr_in from;
9 l& X" L- A$ l" [9 K2 G   int nLength=sizeof(struct sockaddr_in);
% i$ ]4 A9 h7 M: N( C   switch(WSAGETSELECTEVENT(Message.LParam))
: n" c" E5 y4 T, i) y7 ]/ s# Z   {1 b, j8 |  V! k
      case FD_READ:+ C- @% e6 J3 [' v+ M. I! ]2 W8 z
         switch(m_Protocol)
2 i* J/ S% w, f3 }* D         {" _. G/ C8 u0 w
            case TCP:6 C- Q3 Y1 T) `; {+ n( P
               nLen=recv(m_Socket,buf,4096,0);! @% E4 @3 A8 K  {/ N0 A: a
               if(nLen>0){
: f8 ?% m/ `. x4 \/ `                  buf[nLen]='\0';6 x5 _4 r( Y" k& Z) J5 }+ E, p: d
                  TxtEdit->Text="Received Length:"+String(nLen)+"\r\n"+StrPas(buf);
* o, y+ L# [4 Q: I               }
0 m' |2 b# m6 V$ l. l- C$ o0 K               break;
3 d* f7 S; p- f5 J1 g+ g            case UDP:
8 p5 r$ o& y* F$ S% x2 d               nLen=recvfrom(m_Socket,buf,4096,0,(struct sockaddr*)&from,&nLength);! L* @5 G" ?$ \# s) p
               if(nLen>0){
" m$ [2 N9 V8 K6 D5 ?# a                  buf[nLen]='\0';
% E, X* ]! ^7 [  I+ ]. Q# [                  TxtEdit->Text="Received Length:"+String(nLen)+"\r\n"+StrPas(buf);
3 {& M2 [+ g. w% P# u               }0 g2 _8 v( }; ?% K: u
               break;
/ M. P# ?  r( I; t         }/ G, ?* |0 l% h( H- Y: T5 d
         break;7 S* N. G3 |# L1 B
      case FD_CLOSE:
5 t# F, t# |7 i' u( U         closesocket(m_Socket);
- T7 w% f. T8 z' U% I7 r         break;& i9 H1 M! P/ v/ g. X% }
   }
2 P0 J4 m2 u# X4 `! b4 o1 W, W# X}
. S* t! G* X% A) G1 e1 X7 ]& {6 u# y
void __fastcall TLANForm::Button1Click(TObject *Sender); [+ c: e5 H; w) g. |! z, j
{
7 O0 {  I; n8 B  {( S5 L   char szTmp[256],buf[4096];" |  X8 d- h4 m7 k
   int nSize=0;
; f+ W. ^. K5 J1 T% ~   UINT m_Port;. }- U- x! o* w7 [7 b. }- z& Y
   AnsiString addr;
, e+ b3 I$ P) P   addr=Addr->Text.Trim();8 K- f- L  F, y" I3 \
   if(addr.IsEmpty()){
3 [; @+ P: @" p7 r      ::MessageBox(0,"lease enter the server IP!","Error",MB_OK+MB_ICONERROR);" j+ X9 s6 o* o
      return;8 J0 i3 A5 A' ]
   }
' y- y1 S6 F( _8 s   unsigned long nAddr=inet_addr(addr.c_str());: h& z2 J5 R% \9 A' J: {
   if(nAddr==INADDR_NONE){! b' K" V# w' ^5 a8 x4 o5 B
      ::MessageBox(0,"Bad Internet IP!","Error",MB_OK+MB_ICONERROR);/ {1 R; L, E. A7 ]1 M9 {1 @
      return;}: B9 c% S; g: v/ Z& e

- {+ R0 F- u8 \7 L# _4 I& b& u: ?9 C   try, |7 X0 j: C3 b& [% l8 t$ ^
   {
8 }- v. @. u1 n( i5 D      m_Port=Port->Text.ToInt();) c& Z/ @6 n- n" g
   }* r/ R% |% |% o/ V
   catch(Exception &e)5 k5 Z- E# b# n& }& o
   {$ }, D; Y+ m; x8 @- J) y
      ::MessageBox(0,e.Message.c_str(),"Error",MB_OK+MB_ICONERROR);
6 M6 P6 K5 p1 r" G: u' [3 u" x      return;
# R' H, G! I" g' O1 J  u   }; u4 O% T8 N6 Z: ]" O0 E" \: h
   switch(Prot->ItemIndex)
; o4 ?  B' h# t2 e( H7 v   {
  I! V, X5 s; e% B+ ?      case 0:" v0 X$ h  T, ~- u6 f; Z6 W
         m_Protocol=TCP;
; z: S8 a$ }7 {$ T/ O         break;
4 ?$ q3 m7 m+ K  P, i6 R! b      case 1:% N. l4 e0 P* ]" R
         m_Protocol=UDP;1 R/ I" J6 @% D- K
         break;
6 _; y- H* }9 h/ c5 v& q   }1 ^! z2 c; ]' k
   if(TxtEdit->Text.IsEmpty()){
& R, h( F! |, J+ K( T. v3 x4 h      ::MessageBox(0,"lease enter the text you want to send!","Error",MB_OK+MB_ICONERROR);
' y( }- X/ O+ [  C# C  G      return;}/ E+ g6 K9 S9 b0 a( X

; Q1 J% b- C% r9 k8 j6 s   //Initialize Winsocket9 X' L) ^: |+ @% F( @
   WSAData wsaData;& V, x* @3 E, l% ?: C+ l5 l6 D
   ::ZeroMemory(&wsaData,sizeof(WSAData));
' ^" a- E" i& P   WORD version=MAKEWORD(2,0);
( M# T# r" t! g   if(::WSAStartup(version,&wsaData)){
; ^$ f6 w5 |! x      sprintf(szTmp,"Failed to initial winsock enviroment!,error no:%d",::WSAGetLastError());1 W7 P, F3 n: k" D
      return;}. t7 ?2 j2 m! c/ A9 ~, X9 \

3 D- S' q/ N/ i! S; z   //Obtain the active connection2 L+ `/ m3 X1 Q  x
   char ComputerName[255];) N. o* V, q6 H! M- A& }9 x' w
   gethostname(ComputerName,255);
  @9 L2 N5 l1 @9 j" S, V( A! p   struct hostent* he=gethostbyname(ComputerName);% Y6 F% Y/ [, |) V( M8 j
   if(!he){
+ F$ |  d+ }/ g# ~5 L      sprintf(szTmp,"Failed to get information to host!","Error",MB_OK+MB_ICONERROR);+ n+ t" X2 F4 p6 R6 q0 s! X( E
      ::WSACleanup();7 s+ R9 E' G* r; J
      return;
9 _! W+ a3 z; _$ h   }, B; E. Z1 J& |$ Z$ B( ]
   //create new socket6 W9 L- Q4 f; b7 a7 `- B
   m_Socket=INVALID_SOCKET;3 l# W2 j' a( s* P3 S; Y
   switch(m_Protocol)
( Q7 N) O* `5 B0 |8 w# H   {
5 W$ R/ A6 q7 J1 h/ t1 ?7 C      case TCP:
1 H3 ~6 C4 A" d% a         m_Socket=socket(AF_INET,SOCK_STREAM,0);. @( _% v- V# B4 D) a% v5 j; ^
         break;
6 |2 V; d7 k* [      case UDP:
/ A; w0 T% b5 G. a  k8 F         m_Socket=socket(AF_INET,SOCK_DGRAM,0);
+ p" K3 B0 w* ^+ @         break;
: x; v+ N+ B" ~   }: [5 g! Z( P  \
   if(m_Socket==INVALID_SOCKET){
- H( l* P3 I8 R9 P% {      sprintf(szTmp,"Failed to create a new socket!,error no:%d",::WSAGetLastError());
; D# Q% y- \' ~9 c      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);! x$ t# p' z- X& e9 j0 v% y
      ::WSACleanup();! M" q3 g1 K3 \5 Y
      return;* H' L; Y% l0 i3 e$ S
   }
" j& v% G# N  R% \) U* q3 w   //bind socket9 y& h& n7 p% |4 ?
   struct sockaddr_in client;
  E* w$ `- O( \3 q   unsigned long nClient;; z: e+ Y+ i3 o$ u* Z: S  G2 f1 |
   memcpy(&nClient,he->h_addr_list[0],sizeof(int));. i7 Z5 a. q  M  @
   if(nClient==INADDR_NONE){
- N7 c0 h( h8 l  W9 j* R' u      sprintf(szTmp,"Failed to obtain the local machine's IP!","Error",MB_OK+MB_ICONERROR);4 Y: o0 b+ l8 D: t  ]- w# b
      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);% G* w+ j: e' N/ l. M
      closesocket(m_Socket);% b, ~7 D5 Q# Y* p) T2 G  q! n! h6 B
      ::WSACleanup();
* ^" q- W: M8 e. ]7 s9 f      return;
1 s3 B- [/ b  H  W. ^6 {   }8 l& L3 ?; c$ j( p) \- }8 {
   client.sin_family=AF_INET;
2 d# e$ {& r+ J   client.sin_port=0;: V0 I+ @! U$ v/ E# X1 G  v1 q
   client.sin_addr.S_un.S_addr=(int)nClient;
; D1 i+ z/ Y1 n  U9 D! x   if(bind(m_Socket,(struct sockaddr*)&client,sizeof(struct sockaddr))){
: F5 m) N! Z  Z      sprintf(szTmp,"Failed to bind socket!","Error",MB_OK+MB_ICONERROR);
' k+ b) g- m1 y0 E7 W, k1 n      closesocket(m_Socket);
8 M2 k8 U6 s6 y9 z: w5 X; l      ::WSACleanup();- A* B* M( u9 ^/ Y$ f
      return;}
4 F7 `- H& j) g4 z7 U. [# g) _# ]   //connect socket
: q% [* U* X' x: e# v3 F2 w" e3 o   struct sockaddr_in To;
' M6 _4 {+ _4 E2 e- D   To.sin_family=AF_INET;, A; J% t- K8 A, \* C
   To.sin_port=htons(m_Port);
* Q% g* j$ O- @+ {6 b5 P   To.sin_addr.S_un.S_addr=(int)nAddr;
! N- T7 _' `+ D  Q6 r   fd_set FDSET;4 c# F# ]: u; C8 w/ `4 h1 _
   FD_ZERO(&FDSET);# b1 G/ [  D& |  X6 g
   FD_SET(m_Socket,&FDSET);
1 I! m( r6 j5 }4 g1 @7 p5 d0 F
) _; X7 V4 }" I; G% }+ Z) Q" _6 P* ]9 [9 @/ c9 V
   if(m_Protocol==TCP){) s1 B, G( z, ^7 z
      if(connect(m_Socket,(struct sockaddr*)&To,sizeof(struct sockaddr))){
( ?3 L  x2 }! _+ M         sprintf(szTmp,"Failed to connect the object!,error no:%d",::WSAGetLastError());1 S* c; b. A; F+ V
         ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);6 Z7 p( g; r! J8 H9 }: S$ ~
         closesocket(m_Socket);
, P& z6 F' ?& B- w         ::WSACleanup();$ F' j, E, G& {1 v+ w
         return;
# z/ Z' B3 e/ l, C$ t* D' ~  z      }1 p) M- B1 o0 |) F1 z; r
      int nError=select(1,0,&FDSET,0,0);4 s( n+ Y" S- R
      if(nError<=0){
6 o" E% Q) a. w7 m" L2 C      sprintf(szTmp,"Failed to select socket!,error no:%d",::WSAGetLastError());
: l1 P6 ?' l: q3 Y      closesocket(m_Socket);; i" Q9 z- r! w, q+ N8 ~
      ::WSACleanup();
5 e2 }; \3 |$ ]4 R- a      return;}
7 }; o( A( y* \2 m, T   }
! s" _( F4 _2 V- Q9 X7 }6 f   //Send data1 H% ~6 T- U! k: k9 P
   int nLen=TxtEdit->Text.Length();* |3 a# \, u3 e  c7 Q
   if(nLen>4096){
0 V7 H+ M8 K/ |1 P5 L      sprintf(szTmp,"The buffer is too size to send,it shoud not be more than 4096 bytes!");
4 |* @5 a0 V8 f0 q* e      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);6 X" `5 B6 `0 v4 Y
      closesocket(m_Socket);
, I" G, M7 r3 V: K( d3 k      ::WSACleanup();
( o! ^6 \" [/ f, F/ j      return;$ V3 [, P6 ]" @6 e
   }
5 ^- _9 o" k7 D! p/ r; n   strncpy(buf,TxtEdit->Text.c_str(),nLen);
) x/ j! z$ K8 T# J0 A$ D8 ~   switch(m_Protocol)
- @; X  d$ R4 T% n9 {% f) a4 X   {. @7 c9 I1 {/ m
      case TCP:( n# y; n, N. s
         nSize=send(m_Socket,buf,nLen,0);
- t2 W/ t* B0 W0 b) Q# O' z+ f         //ShowMessage(nSize);
+ a2 L$ d3 a7 r# f0 R5 G         break;
/ P- p$ S( e; U- k5 S2 z      case UDP:
! q4 d8 u9 |# N! F: v0 ]. K/ r         nSize=sendto(m_Socket,buf,nLen,0,(struct sockaddr*)&To,sizeof(struct sockaddr));. ?  g% I& ]- e9 p3 ^8 x' `' D4 V
         //ShowMessage(nSize);9 z* W0 s- V7 A7 @9 T( J; W& \0 \. A
         break;" f$ T3 {9 j- e+ T

/ L. O3 h& L% n( s7 B( i/ Z9 ?   }
/ D2 b3 p1 v9 R. X   if(::WSAAsyncSelect(m_Socket,Handle,WM_SOCK,FD_READ|FD_CLOSE)){
: E) e6 A: y2 o! \5 U) _1 s7 }      sprintf(szTmp,"Failed to register socket event!,error no:%d",::WSAGetLastError());+ l$ h0 S! h7 q
      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);
& t8 w5 A7 @* U( _- x0 I: ^4 U" Y      closesocket(m_Socket);
. I" H3 z6 M. M6 A' _& t! Q      ::WSACleanup();. |* N- z; _6 A3 B2 b/ f0 [
      return;}
1 X4 j5 h6 \5 P3 j6 l}$ s$ |* S9 J( ^9 \+ G
void __fastcall TLANForm::FormDestroy(TObject *Sender)
; z( {. H7 ~; |0 E% V. E{  e- k4 Q6 V( @! x$ o! ^/ L8 L7 ~: d
   closesocket(m_Socket);6 \3 G6 {+ m( P! X7 y/ E0 G' B
   ::WSACleanup();
1 L# ~+ }3 {+ M! B7 j. c; a* _}3 v+ W3 Q) f3 f8 {) h8 p2 O
& J3 R" f7 x" v" b
Socket api Server:
/ L( x* ~; I/ }8 f- ?7 x: Y.h File
5 z- K6 b; B3 _' F) C. W#ifndef UDPServerH
0 ?4 t: t1 i! v6 W: g7 _0 Y. \#define UDPServerH
  t9 @& P' S- S( Y#include <Classes.hpp>
: a( P: \4 a  w# G7 M0 f# B#include <Controls.hpp>" H# a" q; B! C- o* [/ ~
#include <StdCtrls.hpp>
1 L- h' `6 E& ~, E$ }- r) d8 _#include <Forms.hpp>( N( t  \1 y' h& @( D5 h
#include <stdio.h>) j9 d+ C+ L0 A
#include "WinSock.h"
4 R* F) E2 n( v, w/ C6 L/*#define WM_SOCKET WM_USER+1000
  N8 g4 N7 c+ k#define INITSOCKETSUCCESS 0; P: f) p% r2 c( e
#define INITSOCKETFAILURE 1: V" @0 K" T  ?4 K. Z. u, C/ \
#define CREATELISTENSOCKETSUCCESS 2
+ _+ V0 y0 V0 H. B- M  B0 x4 k" v+ {- H#define CREATELISTENSOCKETFAILURE 3
/ b+ N; e+ V$ S4 U#define SETLISTENSOCKETSUCCESS 4
0 _/ \9 a! N- j, k4 o/ z7 _! x#define SETLISTENSOCKETFAILURE 5) f  z! A* D- s1 s
#define BINDLISTENSOCKETSUCCESS 6& ?6 B- X! m8 ~. M3 `# S9 E
#define BINDLISTENSOCKETFAILURE 7" k$ u9 ^$ S7 r! ]4 L" Y. Z
#define LISTENSOCKETSUCCESS 8
8 w7 i) k6 k9 v2 e1 O0 \- q#define LISTENSOCKETFAILURE 93 Y! r4 \. Z% i/ o0 N. N- k
#define ACCEPTSOCKETSUCCESS 10
$ h. P4 y/ @, j) L  l#define ACCEPTSOCKETFAILURE 11
5 ?4 @% u) V' K: Y, O3 z) \*/
9 @" R4 i$ V7 ~5 w$ @1 R/ {class TPSTNForm : public TForm
) Q# H$ d- f/ p* W' c) @/ l{
% G: k- Z$ ~2 Z__published: // IDE-managed Components
$ r$ y, Q9 H! n1 ]7 X/ t   TEdit *Port;2 i, `9 _- T# R. o8 Z& N7 O
   TLabel *Label1;0 F1 E  D9 ^5 P+ \! F- _$ q
   TMemo *Memo1;
8 S( ]% n: z- r. t. r3 m. W   TButton *Button1;
# [9 ?8 c! j, K1 c$ Q& }   TButton *Button2;
7 ]3 C" h. j* z0 R. n+ \! {# P+ {/ t   TLabel *Label2;: y/ @" Z; z6 l% `) l, j7 {7 M7 }
   TComboBox *Prot;
$ K* R" m$ d* s6 Y. [' f% ]   void __fastcall Button1Click(TObject *Sender);
! ^% L1 w5 x$ X- W0 |! b   void __fastcall Button2Click(TObject *Sender);
9 _& ~* X; X4 I6 X   void __fastcall FormCreate(TObject *Sender);9 B' A: f  m+ c' a  |# n8 X
   void __fastcall FormDestroy(TObject *Sender);
! P+ n9 v) [$ m3 Y9 `- [; s" G6 gprivate: // User declarations
7 i+ k# J% y+ W) ^public:  // User declarations
1 n8 R8 [$ m) v3 y  V   __fastcall TPSTNForm(TComponent* Owner);
) Q, w! I4 J! q' @};
/ N# h; g- t; ~7 Q; W5 \enum PROTO {TCP,UDP};5 I3 x* M) ]7 l6 e
class TCommunication:public TThread    //Communication Thread
; L/ m7 J) r4 r1 q2 ~5 _/ S{
: v8 l7 g& d  uprivate:! o( d) W* O) E3 `0 ]7 A
   SOCKET m_AcceptSocket;0 o8 U' z3 }1 M: F8 t+ B% k
   char szTmp[256];//ERROR MESSAGE
% g- `( @2 e" |, _public:
: a9 r+ C( q- u. N+ {   __fastcall TCommunication(SOCKET m_Socket,bool CreateSuspended);
8 A; Y$ G7 b, ~   __fastcall ~TCommunication();
5 N. ^2 D" l0 ]1 q% yprotected:
6 ~& H& @5 Y; B: l* K   virtual void __fastcall Execute();5 _5 S  A  |7 D( [+ i
};) w7 {  z- Z1 _5 M+ r( g
class TListenThread:public TThread //Listen Thread
- K0 @! V9 Z; e+ J: w{
6 U1 T+ t: O6 X  B' Y- gprivate:
$ m: l, L0 X# x9 w   WSAData wsaData;
- x+ `4 _3 ^( v! {8 R   struct sockaddr_in server;
) S4 J0 j& n* `; `; `4 [" g$ `, @   fd_set FDS;6 H" w, b5 H, a
   UINT m_Port;+ S! B: Q8 u2 ^1 Z
   PROTO m_Protocol;* b& n" I1 A. v2 K2 u: j! ]( h7 j$ [
   char szTmp[256];//Error Message+ Z0 o) s4 U5 C5 O8 R! Q
public:/ y' C3 Y" [2 s* Y9 @2 g/ [% m
   SOCKET m_Socket;5 F0 K/ J. D) I3 e
   void __fastcall DoError();
  W- @) C2 I; a. i. g' Q   void __fastcall InitSocket();
& o' Z  X8 C4 t' f) x3 y, O   void __fastcall CreateListenSocket();5 ?4 j3 t3 r( x+ ^8 @) n" V1 h
   void __fastcall SetListenSocket();- X+ A- s, j* b! O  ~4 f  ~; P: U
   void __fastcall BindListenSocket();1 F& G" i& F6 X1 F% {2 Y# z+ e' |9 V
   void __fastcall ListenSocket();& S: O9 y. L$ S+ b" f( ~9 A
& S; `7 W7 W$ Y1 G2 d
public:" @5 ], l  k, Y0 A/ j. P5 P
   __fastcall TListenThread(PROTO m_ProtocolA,UINT m_PortA,bool CreateSuspended);
; q# Q$ F' y, y. ?/ Z1 ~2 g) n   virtual __fastcall ~TListenThread();" k& O8 J# h- |0 a9 j" i( V
protected:1 X+ Z; s5 |7 F
   virtual void __fastcall Execute();( r8 c8 F8 x" b- K# J
};
$ L3 b( h- J: a. B1 ~) O! `8 Vextern PACKAGE TPSTNForm *PSTNForm;9 R9 A. ]7 H# P3 T& g% K
#endif
+ q8 j$ \+ S- F.cpp File
% c9 B( @4 A8 w! f#include <vcl.h>) a3 @: l/ m4 s
#pragma hdrstop" e+ }. Z% [, }. W1 F
#include "UDPServer.h"9 T* ?* C$ Z. W$ G
#pragma package(smart_init)% ]/ B4 l* i7 q8 X  W+ \
#pragma resource "*.dfm"! O7 w  k' ^2 x6 [
TPSTNForm *PSTNForm;
' N# f4 C' G" Q- L, x5 S$ fTListenThread *pThread=0;
5 O: L9 w4 }! c9 o* B! }//******************************CLASS TCommunication For TCP****************************************************
( Z) C) \4 r/ g! f1 V: q' U__fastcall TCommunication::TCommunication(SOCKET m_Socket,bool CreateSuspended):TThread(FALSE)
$ n# X& A: {9 s4 ~, B. Y{0 r; t! b* Q4 p* q* `5 O3 W
   m_AcceptSocket=m_Socket;
- _6 U1 v  v0 H- w3 H4 g# N: c   szTmp[0]='\0';
0 N1 B- J- Y# ^# a/ z. _  V   FreeOnTerminate=true;& ~4 ]0 N8 h/ ]/ b& j
}
# c" ^. g# C3 L$ |- q__fastcall TCommunication::~TCommunication()
( @# N( I+ O5 a0 L# l& I$ B{
; \( W5 r, P1 C3 F6 y1 ]( r, m+ s- _+ x  // closesocket(m_AcceptSocket);
! ]2 u. h1 N$ d$ p3 [8 r}
( X  F! y: h6 c: W: D6 W# j3 Kvoid __fastcall TCommunication::Execute()! a  g9 W. L1 ~0 r8 l
{
1 r! G* _/ F( [; ^   char buf[4096];2 T/ F4 u, g  u/ n! j
   int nSize=0;% z* V# w( Q/ c
   nSize=recv(m_AcceptSocket,(char FAR*)buf,4096,0);
0 v2 _0 R4 G# |1 u4 h1 _: ^2 j   if(nSize>0)
$ Y2 J0 m- |- ?  h   {
" v( S& l/ S& D' G* j. _2 x      buf[nSize]='\0';# ?" U5 y9 ]9 Q8 ?( i3 U
      //Display
1 w7 u+ Q- W9 W4 Y3 `9 W! ?! {7 ~      PSTNForm->Memo1->Lines->Add("Received Length:"+String(nSize));
; J9 d. d  p, N* s- R' C, M      PSTNForm->Memo1->Lines->Add("Received:"+StrPas(buf));
* m  C+ L/ u$ w      //Deliver# l# U( l0 f7 _2 w! _
      ::Sleep(100);
& F/ ~  u5 Y7 l2 w      send(m_AcceptSocket,buf,nSize,0);2 d, F9 s0 r: T# d8 ~: d$ B6 E6 @
   }9 F2 F1 |& H+ e0 Z0 p: M8 A

% W% k4 `, t( V# i1 I5 Y}1 ]3 Z" t8 A* T: M8 Q! [8 Y- e
//******************************CLASS TListenThread*****************************************************/ O$ u& d# @6 t) w* D  i& g
__fastcall TListenThread::TListenThread(PROTO m_ProtocolA,UINT m_PortA,bool CreateSuspended):TThread(FALSE)8 j8 C6 J" j- P: p5 Q' Z
{
2 U2 X/ z  {  Y5 J2 m$ o- Z* p   m_Socket=INVALID_SOCKET;
! V1 e- V/ h* j   m_Port=m_PortA;4 A) U+ s6 B& d
   m_Protocol=m_ProtocolA;
, I! j" K# v8 G" O! u7 s$ Q   szTmp[0]='\0';9 u8 }5 `& a8 C8 a# C8 @% i& R- u
   ::ZeroMemory(&wsaData,sizeof(WSAData));
/ c7 p( _6 Q3 S2 U   ::ZeroMemory(&server,sizeof(struct sockaddr_in));" L3 h7 `" G( I' A9 ~
   FreeOnTerminate=TRUE;//Automatically delete while terminating." C3 G9 S8 }  D; M
}/ Z8 ?7 H# l' M+ w
__fastcall TListenThread::~TListenThread()
) S4 e. P4 X0 M{
4 y: `: ?* q# O  X   closesocket(m_Socket);
5 Y% M2 d( a: y# Q' v! ~   ::WSACleanup();
# D" {& d  ~# {7 y  {   m_Socket=INVALID_SOCKET;5 w. s' D' K8 s% j: z
   m_Port=0;
: s+ e, A. b4 l  ^' X1 r& M6 Y; V   m_Protocol=TCP;1 N: Q$ c" w, M- y( e
   szTmp[0]='\0';
  l2 L# d3 C8 U0 y- W) s7 |: n% g   ::ZeroMemory(&wsaData,sizeof(WSAData));
& g5 [6 U3 |$ g! j8 k/ d5 i$ A/ q   ::ZeroMemory(&server,sizeof(struct sockaddr_in));
( V4 p5 g9 n4 B}
/ x0 Z% l* ]" K9 y! Avoid __fastcall TListenThread:oError()
7 [7 H( f9 D, t) l" L) W  E. Q{
; V, r; I1 a: `# C) l   if(m_Socket!=INVALID_SOCKET) closesocket(m_Socket);
; Y& }  x  F5 n& q1 c* N+ d   WSACleanup();! k. V1 V# W: n+ h9 h4 q$ L5 C
   return;
$ F4 l* P$ d) X( w" k! N}# D) @8 |1 `* k8 r( h0 k
void __fastcall TListenThread::InitSocket()
) M- d. Q; @8 m% N4 j7 V{" k/ `) d" R% `4 x3 k; J; H1 y/ A
   WORD version=MAKEWORD(2,0);
( C% K3 W# t1 [$ {" ^2 _   if(::WSAStartup(version,&wsaData)){7 I5 k0 g2 V- @
      sprintf(szTmp,"Failed to intiailize socket,error no:%d",::WSAGetLastError());
$ ~+ p* C/ Q: K1 ]4 t      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);" S) Z+ }7 r( E  p9 ^! H0 r9 x
      DoError();
$ n' _# g( n* h& y      return;; k; p0 b/ u- c% a. M
   }
: @8 M) @, }2 q2 `  W}
/ [6 H5 U) X2 A3 R, h/ Kvoid __fastcall TListenThread::CreateListenSocket()' u3 H$ v: g4 `: S0 D5 J+ k
{. m" M( M% Z% v# z. `  d1 B
   switch(m_Protocol)/ X- G% J3 G5 _, j
   {* V! I+ f) h9 P, ]5 S
      case UDP:
0 L7 N/ \& K$ Y% Z. I8 h, k- e         m_Socket=socket(AF_INET,SOCK_DGRAM,0);, \& `4 x; [1 q( v: k. @6 I
         break;/ x4 \1 k/ M2 N* i  m  g# m
      case TCP:) {! Z$ k6 S0 p. H- C; |
         m_Socket=socket(AF_INET,SOCK_STREAM,0);' k, u6 Q. Q3 Q7 C6 [1 i& }; ^) Y7 ?, l
         break;
4 i) N! _" u4 B3 {" R; s      default:
6 k' n) [7 v: T$ B( {/ [         sprintf(szTmp,"Error protocol!");
- r0 H0 s. Z- z  u8 k1 I; P: V         ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);
; t: O# O( {  R) O         DoError();
6 z  ?) I6 z- _- W7 T1 i7 a$ w5 L         break;
6 J* N5 J: V: M4 A# _- z2 f. |  Y! c   }
9 T! n* V# F$ x" t0 Q) a( o   if(m_Socket==INVALID_SOCKET){
/ Y( Y0 U, \3 `      sprintf(szTmp,"Failed to create socket!");
$ ^% n  c/ J& Y+ D      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);' @( V# x* e2 R8 G+ U
      DoError();- @2 c! X. O" H1 f  \% Y( e2 O5 @8 B) g
      return;
; v9 `" z* t; s; M! l( y# n8 k+ ^   }
8 I6 j: ~* r! {" g}& U2 I& I3 C3 {
void __fastcall TListenThread::SetListenSocket()/ W9 k8 J+ F$ I4 C* I2 I$ g4 A
{
- f! S/ k* |4 f; g# V& A   server.sin_family=AF_INET;2 z+ F8 f% A  z/ B+ C9 f4 w  P5 u
   server.sin_port=htons(m_Port);# h' E, @% E2 y& D, C
   server.sin_addr.S_un.S_addr=INADDR_ANY;
+ d6 u9 l" e7 \8 L$ t5 k   int NewOpenType=SO_SYNCHRONOUS_NONALERT;
" R6 H  S, {; L   if(setsockopt(INVALID_SOCKET,SOL_SOCKET,SO_OPENTYPE,(char*)&NewOpenType,4)){5 D; k; `7 i2 ?
      sprintf(szTmp,"Set socket option error,error no:%d",::WSAGetLastError());  |' K5 R3 x1 R5 Y+ G  \3 L  R
      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);
$ w5 U3 H$ n9 o- }      DoError();6 N6 `, r- {9 H; L& a
      return;" f! w% I0 |1 |1 a" H4 Y% h
   }! E; j1 ~; I- ~' i6 V0 V2 s" A
}0 }& u, r/ P' G3 y: M5 ~
void __fastcall TListenThread::BindListenSocket()
( a, Q; W; P9 ]( g- J! R{
5 N" ^- |. f& B1 R    if(bind(m_Socket,(sockaddr*)&server,sizeof(struct sockaddr_in))){
5 m$ @% t2 x3 D0 s% Z# z      sprintf(szTmp,"Failed to bind socket,error no:%d",::WSAGetLastError());
. P, j. p% n6 z( ?% }      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);4 t3 J, u4 M& e* s/ p3 N
      DoError();
+ U* o1 L* E: m      return;
+ v" X( S1 F6 ?% X   }
; `. N; H0 |5 v" j3 A, H% l  m: \2 [& p, T) ?; k
}, |9 _# Z5 r7 [9 o* }3 S  I! r
void __fastcall TListenThread:istenSocket()
# Q& Z2 C- s% K/ \0 k' x{# Q! ?0 {- D6 f1 z. e# s! l: \
  if(listen(m_Socket,SOMAXCONN)){
# z( H5 N$ D- M0 L+ Z$ f     sprintf(szTmp,"listen error,error no:%d",::WSAGetLastError());
* y+ e# w/ |5 B$ a9 c2 I0 d6 a0 S, e2 q     ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);: c- s" j$ E3 e0 I- n$ _: L. G
     DoError();8 K: `5 B8 o# f5 B) g) y6 `; i
     return;
% Q! r# b5 |7 ?" p; h/ d4 Y  }7 @. }2 o) Z1 W- E- ?
  //Determine whether there is any connection
0 B: C! ?# z) s* E5 l: b9 Q  FD_ZERO(&FDS);
# L& L- O! c+ m' w: \1 F  FD_SET(m_Socket,&FDS);; ^1 \- z- n7 [" t8 G, F
}: }# |, G% ?" y2 D* P  ]5 ~5 B1 d
void __fastcall TListenThread::Execute()
8 k6 {( N6 d! f7 ]0 a0 W9 o; n{
7 w- [& `" B3 ?3 G# C   char buf[4096];( N! O* {% ~  |9 n4 b
   struct sockaddr_in from; //for UDP& L( L. x& ~. R0 k
   int nLen=sizeof(from),nSize=0;  //for UDP) C. p0 m7 L4 c) g
   InitSocket();
, H& a1 g; p) _7 h   CreateListenSocket();, ~" \0 T  T4 Y- R
   SetListenSocket();2 T1 @: X$ M1 O$ e! Y' ^  N
   BindListenSocket();* ]3 C: `# j5 J* f8 L; |
   if(m_Protocol==UDP){
% n2 P8 ^& e( i; n: y# O6 y      while(!Terminated){
5 R3 H9 n* ]# I6 H; K/ b         int nSize=recvfrom(m_Socket,buf,4096,0,(struct sockaddr*)&from,&nLen);  H/ w9 c; T  f* ]& j
         if(nSize>0){$ \+ V/ `$ G! r- C/ P! k4 y6 }4 c$ e
            buf[nSize]='\0';
/ }& F( d- S; H* g* }( e            PSTNForm->Memo1->Lines->Add("Received Length:"+String(nSize));6 _0 b- G6 T2 u- k7 ?/ u
            PSTNForm->Memo1->Lines->Add("Received:"+StrPas(buf));& T1 y! F1 l/ T; b! Q
            ::Sleep(100);
4 C4 c: C! a  w7 Z8 D7 A            sendto(m_Socket,buf,nSize,0,(struct sockaddr*)&from,sizeof(struct sockaddr_in));1 f/ S) u/ j6 J! v
         }1 k# e/ u" l0 h  r+ q# K
         else return;3 ^9 i8 O# K/ |9 {0 D

1 e, [% B% [4 `      }% a1 T9 s0 ~  \. K8 I! J6 e0 S* w/ P
   }
/ Z5 R8 L+ g. I1 l& |   ListenSocket();- x) P% [$ M" F. B
   struct sockaddr_in client;
$ g% H4 R* R- \' L   int nLength=sizeof(struct sockaddr_in);8 P, c6 e3 s) Q
   while(!Terminated){, H$ a6 I& E. k8 q' c. T
      int nError=select(1,&FDS,0,0,0);/ x9 G( y& W  N- i# ?0 m" z, d
      if(nError<=0) Terminate();
# l5 v6 N7 w) J9 ^0 y& F      SOCKET m_AcceptSocket=accept(m_Socket,(struct sockaddr*)&client,&nLength);2 p) z" D9 L3 {( m/ |/ k
      if(m_AcceptSocket==INVALID_SOCKET){2 a6 ?- y! P# n. p9 b
         sprintf(szTmp,"Failed to execute accept,error no:%d",::WSAGetLastError());1 M3 S3 {3 K9 I' G- C
         ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);0 [  G& n" m. ?  h" n$ F
         DoError();1 ?9 d$ G5 G8 k$ ~
         Terminate();+ t0 |4 J$ W, N8 }& E8 l
         return;
: |4 b: P& B- I$ |; V/ \# j' |, w      }, @8 V$ c5 l$ {1 l
      TCommunication *pCThread=new TCommunication(m_AcceptSocket,FALSE);4 ~4 _+ z" a; `$ C+ Q, v
      pCThread->Terminate();; u5 B" }3 a" s+ Z
      pCThread->WaitFor();
3 s0 l5 v: a# i   }( e; Z4 W1 z: z: @
}
- z5 D+ K' a  A; L" q//************************PSTNForm*********************************************/// z* k: n5 c& C: a
__fastcall TPSTNForm::TPSTNForm(TComponent* Owner)
7 n7 n6 E  ]5 K   : TForm(Owner)
( V& F' X% t: X7 g9 O* k{
7 I: t  o: ?$ a7 m/ N9 N}
, K  V: M& G4 R3 O& W! A2 L2 _void __fastcall TPSTNForm::Button1Click(TObject *Sender)
& Y4 F9 w  h7 h{
$ M5 @# N! V$ m6 Z9 l  _' ~   Close();
/ h' l! R6 O" S3 \; i}
, o# _' ^, p8 I9 M9 p: G( cvoid __fastcall TPSTNForm::Button2Click(TObject *Sender)9 `; X% }8 K+ b9 C. M9 y" Q
{9 ^) t  J1 K. u+ R: C. ]) S
   if(pThread){# q) X; }9 `9 f& W! Q4 W4 Z! W' \5 h
      pThread->Suspend();
/ V# J( D& S" K" w( U2 X* v      pThread->Terminate();
8 O% L1 R2 }: M/ I2 [! r6 |/ w      delete pThread;! L  b+ T  M2 @' ?% c. F7 U' e( F
      pThread=0;* Y! v0 ^& R4 F" u5 b  c
   }' l  o* g: h% A4 L
   UINT m_Port;
* R! |! `- _/ Y+ v) p* ~7 n+ H7 |   try( a) }7 t# G  N4 o8 ?: b
   {) K* h" E! D4 e5 p( K8 M' z
      m_Port=Port->Text.ToInt();
) `; Q+ a! [# o( B% L" s7 \6 ?   }
* ^# I$ }$ T: D6 ^  g0 W   catch(Exception &e)
1 D. ]# I& I: e' b# j. @   {" ?' q1 \) G# c0 e: T7 J! O
      ::MessageBox(0,e.Message.c_str(),"Error",MB_OK+MB_ICONERROR);
7 c' F& N% m- @3 T      return;
  @- E3 k$ @6 A8 o" M& D   }6 H8 V& S1 S) `! A4 o. o' V4 b* q
   PROTO m_Protocol;, D" r8 E- P; Q- Z% {; F, i, K5 r
   switch(Prot->ItemIndex)
9 `& o9 q8 Y0 a- n( a6 `+ N   {
4 y9 Z2 [( r+ O* T4 R& e3 `      case 0:
) ~7 m2 r6 t: ~3 B         m_Protocol=TCP;
9 O' a! n2 t2 M: V- A         break;2 v# \# U: A( o$ \3 j- ]
      case 1:
* L# @4 @  ~8 Q/ v: ?         m_Protocol=UDP;2 y0 y( r1 ?0 e( `* _8 s% E! ^( J: X# a
         break;
+ D( r! c/ h( k! v! u+ u7 h      default:
( I9 G& S; n0 Y) ~         break;& ~2 V& \1 \$ O4 L
   }
" x: G. ~- V  f4 D. a9 l" ~   pThread=new TListenThread(m_Protocol,m_Port,FALSE);
- e  D2 n* g7 u* L; w$ q   //pThread->Terminate();! I$ X4 ]* O- ~3 E& b
}
, M1 a# U* ~1 |1 h9 }( ivoid __fastcall TPSTNForm::FormCreate(TObject *Sender)
0 V/ h$ M; _5 X* Y' t{! z& {# q: `& p8 e6 Y
   ::SendMessage(Prot->Handle,CB_SETCURSEL,0,1);# V( [, ^9 u1 W' U/ P
}
+ Z( b+ b* n: w' o! B3 ^
; [( x" S4 j- x  R7 J) C" g  fvoid __fastcall TPSTNForm::FormDestroy(TObject *Sender)
# o7 j9 G$ m1 Q/ e+ t{2 |) U# v! L7 Q- R: {* t' b- o; O
   if(pThread){
0 P" F# ^3 P$ F8 F& e9 |. `& Q      pThread->Suspend();
  G. [+ f" _4 r      pThread->Terminate();}
7 u% h6 n9 p3 Z6 B1 j% X}
8 M( r8 ^- {+ X. u0 `上面的代码,各位可根据自已的需要和针对自已的应用,在数据处理方面加以改进就可以了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-8-15 09:20 , Processed in 0.021891 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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