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

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

[复制链接]
发表于 2004-2-15 14:01:13 | 显示全部楼层 |阅读模式
在CB中用socket api来写网络通讯程序8 D4 ]( H' v2 @% `4 H
作者: kingcaiyao ,如转载请保证本文档的完整性,并注明出处。
8 W1 m. l/ h/ L; Z  B; t1 I3 |欢迎光临 C++ Builder 研究,http://www.ccrun.com/doc/go.asp?id=569# ]* P9 n) N- L( F6 r2 ?) Z+ X
本文转自csdn,作者:kingcaiyao
5 |7 k  N7 t, n% r原标题:在C++ Builder中用socket api来写网络通讯程序(同时支持TCP和UDP协议)( |3 |$ h+ r3 b
原文:  http://www.csdn.net/develop/read_article.asp?id=19883
) ^$ S2 r0 a  L+ q' S7 B3 K+ s5 W" W! X% k' a

; A' _: l8 H& S# x% i$ {  A在7月4日看完sockcomp.pas后,我决定用socket api来写一个客户端和服务器并且同时支持TCP,UDP协议,于是我就去做,现将代码贴出来(已调试通过)
( V3 Q: Z# i: C4 ?; lSocket api Client:
2 o" y; }4 Q" a* h6 c: H& W2 r  C* J0 z2 f: d3 P- |. Y# _5 W$ ~
#ifndef UDPClientH
4 X/ L3 b! k2 G4 I#define UDPClientH6 ~/ i+ y9 o( K. S7 W5 z
#include <Classes.hpp>0 l$ [- j6 B  o
#include <Controls.hpp>
1 ?* F! i6 Z# }/ e#include <StdCtrls.hpp>
  M3 Z+ f8 g7 H9 M  P#include <Forms.hpp>
8 m! c* X& R# f. d#include <stdio.h>
( `' p* Y  c% |9 |; x  x* H#include "CCEdit.h"0 o- t, d8 |  s
#define WM_SOCK WM_USER+100
( f$ C: ~5 R- S& H) ]* Y) w* Z" Wclass TLANForm : public TForm
% e$ }8 s+ T+ c2 J{3 w0 j2 A0 f& q' y/ A, k
__published: // IDE-managed Components- A( z0 ]: _7 {; A. v# q% E5 |
   TEdit *Port;9 z6 j( Z5 a9 a, N( Y' V4 C" S+ w1 T
   TLabel *Label1;
; x) j& G$ q5 L9 {   TLabel *Label2;/ N; Y) E: Q, N, A' [% s* h
   TComboBox *Prot;( ?5 \* A3 s1 ?% y* k( x
   TButton *Button1;' @% T8 G/ r1 C- d# J  Q5 E
   TLabel *Label3;
  L# `& k, l' L3 X/ n   TEdit *Addr;
" q: _# u8 e- q   TCCEdit *TxtEdit;
1 F7 ~+ C8 {4 r" p9 i( N   void __fastcall FormCreate(TObject *Sender);
1 I- b# W) U* u) ^5 o   void __fastcall Button1Click(TObject *Sender);: U( o* m  Z7 w* s
   void __fastcall FormDestroy(TObject *Sender);4 i5 r+ G/ S7 S, \. V4 ^
private: // User declarations
! i1 Z+ O4 A2 |  X' f) }! q   void __fastcall OnRecv(TMessage &Message);
# h. f8 n/ }$ ?6 D0 \( ppublic:  // User declarations3 a  w  X# k0 z! W$ W* \3 S9 }" h
   __fastcall TLANForm(TComponent* Owner);
) q$ t3 g8 V; X* t   BEGIN_MESSAGE_MAP! O; S; S# z5 N/ ~: L  x9 Z) [
      VCL_MESSAGE_HANDLER(WM_SOCK,TMessage,OnRecv);
3 @% |9 f8 x% T1 Q5 h8 _5 z   END_MESSAGE_MAP(TForm);6 o7 h; F2 O' w( }! N( S4 `
};
1 ^+ i3 B& d6 F) ^- Hextern PACKAGE TLANForm *LANForm;
: n# C8 R4 U! |- I& U#endif( R3 v& W8 J" S! m" {+ [1 i6 c" \- _3 o

+ [1 y8 Q- \9 z9 A2 u9 u: y- U: _9 f3 h1 c3 }% j. I
.cpp File
* ~- s1 f2 J3 P
0 B; r9 J# G" w1 ?#include <vcl.h>
! [0 v2 |* T( b, ^1 w+ S#pragma hdrstop
# o* t# }2 r. s#include "UDPClient.h"3 z+ k* r  N4 \
#include "WinSock.h"
1 p$ i8 o' t( A4 p: p7 @#pragma package(smart_init)
# x7 y) ]* X+ i#pragma link "CCEdit"
4 a' s/ A0 J9 }5 p% U: n" q9 C# S0 I#pragma resource "*.dfm"* }7 y  \2 h0 u7 Z7 m
TLANForm *LANForm;
( z. x! O9 z% ~6 t* @" c  T$ {enum PROTO {TCP=0,UDP=1};4 ?+ m# I! D  ~; Y/ ]; _
SOCKET m_Socket=INVALID_SOCKET;# _6 y5 e, _; X. s8 \
PROTO m_Protocol=TCP;) D- `& W2 R2 C4 A$ S' M/ u4 w
__fastcall TLANForm::TLANForm(TComponent* Owner)
4 y2 u* ~* O% d( ~0 y2 n3 ^   : TForm(Owner)% o9 I9 R7 x- b, v6 C
{
3 |6 R- r7 P9 t: |
- P5 W$ i: ^8 e9 K' y5 q* E) U6 P}
6 k% v  R2 K+ W- D4 J1 x, gvoid __fastcall TLANForm::FormCreate(TObject *Sender)% L7 c4 S9 D! p& I1 X7 K; t9 l
{
* }! |4 x4 Z1 e6 m, M   ::SendMessage(Prot->Handle,CB_SETCURSEL,0,0);: R- h) l; o- C) T* B+ d; s
}
  E+ L$ N. Z/ @3 |; `! d9 ?5 z6 Yvoid __fastcall TLANForm::OnRecv(TMessage &Message)$ U5 K, u1 d% b8 b
{
2 v: c( b- [$ J   char buf[4096];3 Q& n& v: D1 x+ z% P
   int nLen;
3 S( g% d' z4 `  E6 K   struct sockaddr_in from;
  z$ K9 l) V# F   int nLength=sizeof(struct sockaddr_in);; {. t3 s$ P$ H/ Z
   switch(WSAGETSELECTEVENT(Message.LParam))) m9 r3 N3 y9 e1 ?( W
   {
; b' @7 F9 i# {) b. p, w1 S      case FD_READ:
. c) _8 C/ B5 Q5 b" N/ P0 `4 D         switch(m_Protocol)0 \4 F* w/ c: ^! r" X; L# P
         {
) L' m! B& ]7 Q9 r; r            case TCP:
2 z4 l) c/ E% y. ?               nLen=recv(m_Socket,buf,4096,0);
1 Y! C# e' }, ?6 n9 {- |" F, }               if(nLen>0){: E2 B5 E. G& ]4 n
                  buf[nLen]='\0';, r' k4 C. j8 `( J( ?' _
                  TxtEdit->Text="Received Length:"+String(nLen)+"\r\n"+StrPas(buf);
( I# f2 X/ A9 o( u               }
& q& u, H$ l+ e6 ^  d" t( _               break;
" x& ~. k4 t8 x! t            case UDP:) c+ [9 ?& K5 V+ k
               nLen=recvfrom(m_Socket,buf,4096,0,(struct sockaddr*)&from,&nLength);1 t3 e9 I9 p$ H; `9 X4 ~
               if(nLen>0){
5 ]% U7 I  E/ B/ [, O# @                  buf[nLen]='\0';  f- o- X9 Z  R3 i+ k# o
                  TxtEdit->Text="Received Length:"+String(nLen)+"\r\n"+StrPas(buf);. B* h; E2 E5 F! Z. c  f
               }- h; S9 T* R" w$ Y) s
               break;
6 i# L& ?2 n* C! f/ \6 V7 F         }
, v0 H$ n0 l2 |         break;3 v, t, H) M+ y$ H2 F9 F2 k" C  C8 I
      case FD_CLOSE:
2 D0 j7 p. h6 l# j3 o! n7 s* i$ N         closesocket(m_Socket);
  \" s' Q1 w2 k         break;
3 I# M) T! {4 E9 X7 o! h  l   }8 K  O( \% v# T$ X% U$ W
}. |/ e) E1 @& x5 \

( ^! u4 z0 \! J- hvoid __fastcall TLANForm::Button1Click(TObject *Sender), u3 C. U$ J* c
{
/ m! _% d1 A& b+ H& t- y& I   char szTmp[256],buf[4096];9 C5 H# o" o' I% ~
   int nSize=0;
4 d4 X% A9 q( }  i, t3 _4 l   UINT m_Port;! [% a. m2 k1 E/ Z% n
   AnsiString addr;
6 c' S% l# G1 z7 J) O# k& p   addr=Addr->Text.Trim();
  `6 o( r' U- d7 }/ M- J! L1 Q   if(addr.IsEmpty()){; b% e2 i4 S9 `/ u7 h! i
      ::MessageBox(0,"lease enter the server IP!","Error",MB_OK+MB_ICONERROR);
! f: }$ Z, [5 f/ `+ C/ g      return;  _* Z# G2 j+ p& g- P; R4 c
   }
# c% m/ G6 v+ u# b( S) n' K8 A   unsigned long nAddr=inet_addr(addr.c_str());
* _6 j4 I9 w6 j  F5 I3 C* f: w2 c   if(nAddr==INADDR_NONE){+ F3 |$ p# {5 e4 E2 v; t
      ::MessageBox(0,"Bad Internet IP!","Error",MB_OK+MB_ICONERROR);
/ o) x# h7 k' O; o, f      return;}0 C0 N2 h9 L  f7 C& l7 ~0 b$ r

# O3 E4 ]8 L. B8 d7 O   try4 t3 n7 G. @$ x( G
   {* Q3 k( P+ B# O+ Z3 C! s, ^5 B
      m_Port=Port->Text.ToInt();
' ?* x: z9 |$ F   }1 O8 l& _, D9 E4 m
   catch(Exception &e)
+ ?% Y9 \: u& l( W8 z. Z   {0 j; ~# }! H! P9 ]
      ::MessageBox(0,e.Message.c_str(),"Error",MB_OK+MB_ICONERROR);
5 L9 |" z9 Y9 k, L; z      return;
9 s3 ?- t' Y; H   }. s4 y9 [& X6 @, v  `; Q6 p
   switch(Prot->ItemIndex); l; U9 ^+ d  t8 I  e8 E* h' h
   {
2 O7 A" o! h9 Y+ K) P* X% g      case 0:
5 Y. _% @+ ^% o; ]# R4 S2 }         m_Protocol=TCP;
* h8 J8 C; g: T& X- y$ M8 |         break;
9 E( ?, @. c# P+ }      case 1:5 {6 u. J( r& s. W
         m_Protocol=UDP;+ ^$ s# l/ j7 B% G
         break;( t5 B  Q' a# z& |
   }
" N7 z6 s, I4 x" Y" T   if(TxtEdit->Text.IsEmpty()){( S" G- F% s  g3 q  I8 z( Q1 s
      ::MessageBox(0,"lease enter the text you want to send!","Error",MB_OK+MB_ICONERROR);
0 k; ]6 Q  I8 v6 i      return;}, L/ ~- m( m3 V6 N& a' _

* K7 T  @. X; K+ i3 }   //Initialize Winsocket
+ ]' n% `2 l  S  C- [# h: }# |: a3 e   WSAData wsaData;, g$ n4 D; Q0 e' V, v4 l
   ::ZeroMemory(&wsaData,sizeof(WSAData));
/ v3 j' s4 T& D4 a8 N3 ]   WORD version=MAKEWORD(2,0);  |6 _; H  |$ X# w$ ~6 J  o6 |
   if(::WSAStartup(version,&wsaData)){
4 J" F5 ^5 w" w. m4 z3 n      sprintf(szTmp,"Failed to initial winsock enviroment!,error no:%d",::WSAGetLastError());
+ I- @3 B  A2 h: Q, w/ d      return;}
- i4 W. u) Q9 I/ w
' |- ~+ b" ?4 G* t7 b; G0 F   //Obtain the active connection
0 S: U0 j4 @5 L: s% `# r   char ComputerName[255];; L0 k; i6 O3 I0 o! x! E0 o
   gethostname(ComputerName,255);7 _) [- J7 N6 }/ J2 S
   struct hostent* he=gethostbyname(ComputerName);
5 X9 ?- F: Z' p* F   if(!he){2 `6 q+ g! i$ J( ^1 Z
      sprintf(szTmp,"Failed to get information to host!","Error",MB_OK+MB_ICONERROR);
* }1 _1 F" o1 d      ::WSACleanup();
. V& q8 A. O# M* l. d7 R      return;" X7 x& z+ Y* x# U6 R
   }* o: F% g/ Q& K3 T7 o& [# f4 x
   //create new socket2 n. _8 _9 p- D8 m9 \
   m_Socket=INVALID_SOCKET;3 I- e$ d, g0 U  y: [- g, o$ q5 ~( w
   switch(m_Protocol)
8 R& f5 B& r3 h4 O; A5 k% s   {
( c  f0 f! n8 m  ^0 j" W& i      case TCP:
3 I2 G  e% Z7 @! O% Q) D+ C3 u         m_Socket=socket(AF_INET,SOCK_STREAM,0);: l/ O+ b7 }# ?4 j$ g
         break;
! F! @$ ^& Q8 e* k+ [8 e- A- ^6 T6 {      case UDP:
, r4 e3 ~7 {0 V" C- b' _' |9 I9 b4 A         m_Socket=socket(AF_INET,SOCK_DGRAM,0);
* ^  r9 _2 {( ^" N3 ?         break;# w4 X4 O# f( L; R* U" ]8 Q! [
   }
6 I7 q/ |3 N3 h/ X- \   if(m_Socket==INVALID_SOCKET){
# ^9 r5 @/ m2 U8 C      sprintf(szTmp,"Failed to create a new socket!,error no:%d",::WSAGetLastError());- r& j3 `" L+ C' B* A* Q! N
      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);
7 h2 j2 j+ C, f2 t; p; x      ::WSACleanup();
9 Z; u9 t8 l2 r, d+ b      return;- z% T0 H9 t' u- Z" W+ R3 E% f
   }
* b+ a  n) j& F/ K; o- Y   //bind socket4 ]- d. ^$ {2 h; _9 n2 Q
   struct sockaddr_in client;
! ~! ?5 N( D& N# I   unsigned long nClient;
& \: D) f* L3 d. q+ v7 z, }4 I   memcpy(&nClient,he->h_addr_list[0],sizeof(int));
, R. a5 {4 \# |4 q2 |0 S. J& ^6 n, s   if(nClient==INADDR_NONE){1 X& H* Y( _0 B* {% M' y  N
      sprintf(szTmp,"Failed to obtain the local machine's IP!","Error",MB_OK+MB_ICONERROR);. A1 e; @: L# j' T6 n! W% d
      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);1 y0 G5 D6 r2 p1 U0 p
      closesocket(m_Socket);
. V7 k/ c2 u. a* }9 n8 q. {      ::WSACleanup();
1 n7 Q- f. w' Q5 |, e# x6 I      return;9 C7 [, q: M. L
   }: O7 z0 B& d" v1 o6 t* n; L
   client.sin_family=AF_INET;0 F- E7 m( d  w6 P* v  L  ?. Q
   client.sin_port=0;3 \$ U+ e& z5 D; S" `& }
   client.sin_addr.S_un.S_addr=(int)nClient;
% h$ v& F4 ^6 n. Z0 q% D   if(bind(m_Socket,(struct sockaddr*)&client,sizeof(struct sockaddr))){
, o2 X4 b) \6 j! d) f- j      sprintf(szTmp,"Failed to bind socket!","Error",MB_OK+MB_ICONERROR);
% G7 B! {+ l0 G* v      closesocket(m_Socket);' g3 L9 q8 S0 l$ Y) ?% L
      ::WSACleanup();8 u1 R) Z* A0 g! ]7 Q
      return;}
* i* X9 Z3 i! q2 u+ Q   //connect socket8 G6 y6 X' p4 Q6 d. H: ~) \9 Y# Q
   struct sockaddr_in To;, b3 T9 T& U, K5 X3 Y
   To.sin_family=AF_INET;% h+ h( i' e( U' q/ b) M
   To.sin_port=htons(m_Port);
, e6 i2 i7 I2 c0 b* f   To.sin_addr.S_un.S_addr=(int)nAddr;
+ I# ]% S, t& Y# N- ~: X6 J) z   fd_set FDSET;
6 k  j* q( A( W! A2 J$ b, u! ^   FD_ZERO(&FDSET);# r9 Z! ^$ E% M7 t0 r, P) u1 f
   FD_SET(m_Socket,&FDSET);5 k! k6 T# d; H/ x! l4 _
* a8 w; B  }. K9 z0 p1 K

% |: o6 m. w& k2 _' I& S/ z   if(m_Protocol==TCP){
/ B- [0 w  f1 t& Y) `( x      if(connect(m_Socket,(struct sockaddr*)&To,sizeof(struct sockaddr))){
6 _% H$ F+ v% l         sprintf(szTmp,"Failed to connect the object!,error no:%d",::WSAGetLastError());  x" m1 U! i( O+ t: v
         ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);9 s- D! G  I1 h5 c- J5 P
         closesocket(m_Socket);
( U0 k7 O- B( V$ M5 l* P         ::WSACleanup();
; w! {, |# h0 A% q4 ]* |         return;5 y+ Z4 D& H8 c  R! j. l5 d
      }
5 D- Y- a1 Z* Z9 B; ~      int nError=select(1,0,&FDSET,0,0);# K! h! n4 t. }; y1 R+ P
      if(nError<=0){
/ `7 L1 B8 ~! X      sprintf(szTmp,"Failed to select socket!,error no:%d",::WSAGetLastError());
5 x6 P8 r, }$ ], n; t  o      closesocket(m_Socket);
. Y8 q$ g* E6 F; x& F" s      ::WSACleanup();
- Y' V4 P+ R1 C      return;}
3 T' F4 s7 E9 T4 G   }& ^. r* g8 A2 E' k3 M$ e
   //Send data
3 }) d: {1 g! d% Q6 J* W. q   int nLen=TxtEdit->Text.Length();
+ t! X' {6 r4 L+ ^5 B8 m   if(nLen>4096){3 r  G' X; P' S6 a
      sprintf(szTmp,"The buffer is too size to send,it shoud not be more than 4096 bytes!");8 I% f+ N; h$ ^& T2 B! |! D
      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);8 L; n# G! M" v' _
      closesocket(m_Socket);( @0 S) }# z) n5 E% V+ ~& J" y
      ::WSACleanup();0 c+ B8 e& j2 {, Q& t
      return;
0 _; v; n% Q: r! c   }
  G/ r- {. Q4 g$ F   strncpy(buf,TxtEdit->Text.c_str(),nLen);+ b) g' g+ N1 _* g
   switch(m_Protocol)- f# w) e* I2 i+ Z0 X2 Y) h4 ^
   {7 P6 Q$ f- u2 _. Y7 |) {/ g4 e$ p
      case TCP:
5 N- z  s0 M# S5 r# [$ C0 U! y         nSize=send(m_Socket,buf,nLen,0);0 g9 p/ N; P. w% o$ V
         //ShowMessage(nSize);
* J, z7 ]8 e# J( w         break;, V. {* O  a7 N1 Q
      case UDP:" c6 B8 ?, p5 b" Q: c% e
         nSize=sendto(m_Socket,buf,nLen,0,(struct sockaddr*)&To,sizeof(struct sockaddr));
: {+ C/ M. t1 K9 V1 ?. e7 i9 Q$ I9 I         //ShowMessage(nSize);
1 L4 W3 J/ C& k8 p3 @         break;
0 {4 y, _, j. b7 ]
8 N% M- c4 P6 z8 \0 b; V+ L4 I   }
9 e+ z' ~& W6 M$ _: m& P4 S) j   if(::WSAAsyncSelect(m_Socket,Handle,WM_SOCK,FD_READ|FD_CLOSE)){7 X- e  m3 t" C+ O0 R- Q; h; k) L% b
      sprintf(szTmp,"Failed to register socket event!,error no:%d",::WSAGetLastError());  }2 o2 h+ _. W' O: W
      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);* Y8 Z4 `! M& H/ s
      closesocket(m_Socket);6 {; \3 o/ a, p
      ::WSACleanup();
4 L; W6 V* `# v3 H0 F      return;}5 h9 h# S9 {% {2 I7 |$ P
}3 b8 d/ O6 I; J) V9 q1 {. x
void __fastcall TLANForm::FormDestroy(TObject *Sender)
% b, U2 C0 y6 a0 S7 a7 v{
: N- c6 n+ Y7 y: s: c   closesocket(m_Socket);
' o% Z! a6 P( d1 X/ p& O9 m* `* C0 C8 h   ::WSACleanup();
. d; T' y" [. z% o" o}
( t! b" w% w1 A  @9 k9 z" M. C; V' E8 ]9 T; U2 K9 D; L& c" `0 d) Z6 U6 w
Socket api Server:
% I/ ^) T/ e6 S3 Y.h File: `1 H. l- J* h0 C4 H2 J
#ifndef UDPServerH
& q, [) p" b3 H2 w" M#define UDPServerH
  A4 S/ A/ H% j#include <Classes.hpp>$ m1 S! }2 l2 Y' n
#include <Controls.hpp>' _- }; O! G9 b5 o  h2 h
#include <StdCtrls.hpp>5 v: l2 R  |" `+ @0 a1 @7 H8 X
#include <Forms.hpp>
" S8 |6 m# k5 u0 m2 c& L+ f#include <stdio.h>
" v" |4 z6 ^! u* M0 c- w$ t#include "WinSock.h"1 F# v1 ?" w* S4 h3 o; v) F1 r4 W
/*#define WM_SOCKET WM_USER+1000
4 b, H/ r1 G9 R5 d/ j( e+ B#define INITSOCKETSUCCESS 0
# q5 s: x, n* X7 P" W; u#define INITSOCKETFAILURE 10 @, @+ P( b) n% k) L4 `0 z( k% E$ q
#define CREATELISTENSOCKETSUCCESS 2+ ~2 C" B6 d/ i2 `3 t
#define CREATELISTENSOCKETFAILURE 3
& j! U5 h* B( g2 N8 Y& v0 t' P" Y#define SETLISTENSOCKETSUCCESS 4
& C! T+ V. T( ?#define SETLISTENSOCKETFAILURE 5
& O7 w& `+ t+ j7 \' n) v: x#define BINDLISTENSOCKETSUCCESS 6" N0 d+ p; r3 F5 ~2 @3 ]$ m
#define BINDLISTENSOCKETFAILURE 7
" ?5 f; O: Q3 {2 \#define LISTENSOCKETSUCCESS 8
5 |1 j" n% W, H* L#define LISTENSOCKETFAILURE 9
- T# v1 T8 _' ?  s#define ACCEPTSOCKETSUCCESS 106 b' t5 X3 k+ Q- F8 R
#define ACCEPTSOCKETFAILURE 11! s2 O" S: G5 N! d+ Q( b  ]* T4 G
*/
2 ?# P$ b6 ]4 L- h+ o% c- Rclass TPSTNForm : public TForm
$ z" X' A5 P9 N7 X{
( l3 W8 S: I/ e: g2 W2 `# m__published: // IDE-managed Components; C5 m) e; N0 ]4 s1 A2 I/ T, S
   TEdit *Port;' V4 z' ^; ?2 A( O
   TLabel *Label1;5 L% }5 a8 k( b, |
   TMemo *Memo1;( h6 k7 B* x2 c2 z* A
   TButton *Button1;
( i: [2 T# U( c9 F" `   TButton *Button2;% s* G. t% O8 f- x$ Z6 b- R; z& {% O9 }
   TLabel *Label2;; x- B( V* l9 P7 E2 _$ w" j
   TComboBox *Prot;
8 P0 _, F9 w3 X* e, L' k   void __fastcall Button1Click(TObject *Sender);
. n- r" z* \0 }8 g: B! C# e3 B9 }9 R   void __fastcall Button2Click(TObject *Sender);: y* s, ]2 M2 f6 k. Q  _; O
   void __fastcall FormCreate(TObject *Sender);
2 c* ~; p8 r! q6 _) O   void __fastcall FormDestroy(TObject *Sender);
1 P8 t- }  y/ ]private: // User declarations
; c* [$ d& b, \" w6 g5 [public:  // User declarations
: W* y; d/ ~" r; D/ @2 c* F   __fastcall TPSTNForm(TComponent* Owner);
+ G2 y/ i& |3 }6 N3 e& J: m};- X, {3 f4 n, L: ^+ b+ @9 m7 e
enum PROTO {TCP,UDP};# S7 O. @1 N% x6 O
class TCommunication:public TThread    //Communication Thread) Z; e  C) P5 O0 H8 _
{3 Y/ v0 G( W3 J
private:$ c& ?8 s7 G% d) j' h- w
   SOCKET m_AcceptSocket;
9 P( a* U5 O5 L. k5 @) v/ w   char szTmp[256];//ERROR MESSAGE1 o, _# k1 {* T, p/ i' X' ?
public:! d- F+ I' x1 W6 B
   __fastcall TCommunication(SOCKET m_Socket,bool CreateSuspended);# O, ^- A$ k% }4 H
   __fastcall ~TCommunication();
5 ]7 B. t9 N! \7 Y7 M7 l$ T9 E+ \. D9 xprotected:
) v, }! \3 `: B9 p   virtual void __fastcall Execute();4 j3 K& Z: j* b6 m$ h6 m1 [6 k; C
};9 U1 P  r  c5 U7 j) [
class TListenThread:public TThread //Listen Thread+ N7 y, Z& _" O: N3 L
{( M3 B$ s3 S' L7 [; x$ _5 {! E
private:$ j. O6 C' w; J1 M
   WSAData wsaData;
4 M* n3 u3 A2 }0 K   struct sockaddr_in server;
8 S* W2 m7 }0 u   fd_set FDS;
* W% Z7 G7 A( P: l; J  p, p   UINT m_Port;7 K# Y: }+ `  ]$ @4 }
   PROTO m_Protocol;
) R8 k  }. R2 J6 [) H   char szTmp[256];//Error Message8 j9 W% O9 |; q( R6 G9 M
public:
1 ?& r5 q# F( }" ?, C. p   SOCKET m_Socket;' b! @0 p5 @  ?: N. E
   void __fastcall DoError();
) d" H6 x) Y) M" O  I# n7 |   void __fastcall InitSocket();+ Q# }& I% |* Z' h
   void __fastcall CreateListenSocket();
* ~) p& O2 t1 @$ K( A- ^# @  D   void __fastcall SetListenSocket();
7 O7 P3 V* ]' h3 W   void __fastcall BindListenSocket();
$ R  Y& T) Y  u. c# ^7 y& v( }   void __fastcall ListenSocket();
1 W+ i# ^! ~0 e4 p+ `) J/ x2 d; V5 T5 D) S. q/ W3 @# ]
public:
  ~: M0 U+ o- {2 H; q$ G; W; C. _   __fastcall TListenThread(PROTO m_ProtocolA,UINT m_PortA,bool CreateSuspended);
' O* y3 ?+ P# [6 e4 }, b   virtual __fastcall ~TListenThread();. n& O- q9 g! {8 O
protected:7 k# P9 d! s5 O0 |1 Y4 x# ~
   virtual void __fastcall Execute();
. E/ Q. p$ E# _7 X/ l  S};; M- u- f$ X) d  c
extern PACKAGE TPSTNForm *PSTNForm;6 z7 @3 f" }" Z) _. U8 z
#endif) W& f+ E6 k* i5 s/ g/ s0 }
.cpp File7 ~, C" ?" @" S1 t& d8 n$ [
#include <vcl.h>
4 ~* H  b0 {* \' U/ O- J5 \, Y#pragma hdrstop: o% g% n# O. [
#include "UDPServer.h", W& p5 Z. N8 L: E
#pragma package(smart_init)
2 S: I. d; f+ Y* n7 q#pragma resource "*.dfm"0 e) S8 o, F% Z8 P( _- f
TPSTNForm *PSTNForm;
/ M4 R5 ?0 [, Z; S$ w6 z' vTListenThread *pThread=0;
7 K) u8 t/ T( k//******************************CLASS TCommunication For TCP****************************************************' I( ~: |$ ^* @+ I- v9 |' @0 K( S% l
__fastcall TCommunication::TCommunication(SOCKET m_Socket,bool CreateSuspended):TThread(FALSE)
! G6 p$ U3 K# A& A, R( F{
) \% ~8 I- d8 r  G5 D2 l   m_AcceptSocket=m_Socket;% e1 q/ q8 ?6 C8 Z
   szTmp[0]='\0';& o% C6 X, T$ Q' p/ v/ J/ v
   FreeOnTerminate=true;
% A2 k# W$ E- y( x: Z2 T}
+ o4 H8 v2 C, @6 @. u__fastcall TCommunication::~TCommunication()$ J4 p- e, Q2 x. R
{: e. a, R* {  `+ D0 R1 M" h( [* K
  // closesocket(m_AcceptSocket);' g6 [$ U; m3 f7 B2 W; h
}
. `, i3 E3 x+ E2 u2 fvoid __fastcall TCommunication::Execute()! r5 ~& H" P1 w
{1 C7 G  X& J; C7 d" L4 G
   char buf[4096];1 M# u5 O; {2 }( v; W$ K
   int nSize=0;
1 R5 R4 }( ?1 x   nSize=recv(m_AcceptSocket,(char FAR*)buf,4096,0);6 v  `% Y& @/ h  t+ s% V
   if(nSize>0)
; m2 {0 q! H5 |# V0 z5 r* v3 _1 `   {$ Q& Y' r% O. o& _% L! [
      buf[nSize]='\0';1 ]2 K4 X/ e" g
      //Display' z; v+ C% ~. |
      PSTNForm->Memo1->Lines->Add("Received Length:"+String(nSize));7 J' @- j$ p( w: H( h% V
      PSTNForm->Memo1->Lines->Add("Received:"+StrPas(buf));0 F2 j+ k; E: q9 K3 E" B  m' f
      //Deliver
" Y* J% s% q* J# i; r      ::Sleep(100);# p: N, j5 U6 \$ e, _" N  G# H
      send(m_AcceptSocket,buf,nSize,0);
0 f, ~# r8 X) D/ ~   }/ f  B& {( h1 |0 b/ C' U

% k$ O( N, I3 M" i* b}
0 O3 u5 Z0 P9 E//******************************CLASS TListenThread*****************************************************( }% S1 S4 }+ A# V  m$ q9 `
__fastcall TListenThread::TListenThread(PROTO m_ProtocolA,UINT m_PortA,bool CreateSuspended):TThread(FALSE)
4 U, y7 e- H: B& P! d) U{
3 p" {, `: l, `' v& i6 X   m_Socket=INVALID_SOCKET;$ U; O& v+ l, b# X
   m_Port=m_PortA;
4 o+ a+ B+ x! Q' ^) N   m_Protocol=m_ProtocolA;
8 {: j. i) [* S  ^, p( p3 Q   szTmp[0]='\0';0 X1 d6 B. W% u6 w7 U% R
   ::ZeroMemory(&wsaData,sizeof(WSAData));
$ p: ^+ z. K! h2 G0 l$ M   ::ZeroMemory(&server,sizeof(struct sockaddr_in));: E1 {0 q. \% q7 b2 @" k7 ~
   FreeOnTerminate=TRUE;//Automatically delete while terminating.9 u5 \/ S& Y$ o# l7 e
}; k8 h' }: o* W0 @' x
__fastcall TListenThread::~TListenThread()
) t/ \4 S7 _/ o* t2 ?* ?  w5 X{; [7 m# o: O4 W) x4 o* e/ d
   closesocket(m_Socket);6 t% S2 E3 e8 F7 ^- [9 Q( O2 x
   ::WSACleanup();: ^' p9 ^6 J8 S" a) O
   m_Socket=INVALID_SOCKET;
% j1 U4 `& t% ~/ _8 N2 [. ~( `   m_Port=0;4 ?! V8 B5 M" e( {- m3 v
   m_Protocol=TCP;
6 T0 X4 `/ c" y* L& ]6 I4 {   szTmp[0]='\0';. P+ N) l" L3 G8 g8 [5 J8 G) p
   ::ZeroMemory(&wsaData,sizeof(WSAData));' y) `, f( ]  m' @1 k
   ::ZeroMemory(&server,sizeof(struct sockaddr_in));
! j3 f0 _( T6 `% u}
! G" N3 C3 s/ _2 T! O0 f# o3 Rvoid __fastcall TListenThread:oError()
- O. W6 X, Q7 D% T4 M{
! U1 }" _! c; t4 ]* P5 t   if(m_Socket!=INVALID_SOCKET) closesocket(m_Socket);( q: E6 C& }9 M% s7 h0 o9 B
   WSACleanup();& j; z7 M3 }1 p
   return;, c5 i9 {0 l* R# A6 s
}6 u' W$ p# h+ E# \
void __fastcall TListenThread::InitSocket()
- s, }% @- g( K7 I5 h1 D{
9 O. A. W- r) x' h3 c   WORD version=MAKEWORD(2,0);
" [% O* n. C4 b6 R+ U$ m0 [   if(::WSAStartup(version,&wsaData)){6 ~" p3 U# R# u1 `
      sprintf(szTmp,"Failed to intiailize socket,error no:%d",::WSAGetLastError());) g! R1 c* I+ J( E. g3 E6 C! I
      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);
8 @3 b& X. T; Z/ c! A% |) i      DoError();
7 A: X1 n2 P. c' U' H& v      return;) S9 B5 i, i6 o. j
   }
- E+ i/ X, b9 A2 I6 |}5 o! t: Y& u2 l) b' d" t
void __fastcall TListenThread::CreateListenSocket()! c6 h8 ^* ?1 k8 d& T
{! n3 c* V. G, F" v9 U
   switch(m_Protocol)
2 C+ R% x; s, p- Y6 v! l   {( v$ C1 Z8 d! d9 {7 A
      case UDP:
0 \$ |" A  W! A- n         m_Socket=socket(AF_INET,SOCK_DGRAM,0);
' q% n0 y4 K' _; P         break;
( m3 t+ t% n; A$ b      case TCP:
" N" G5 q" z. {" J* @1 @         m_Socket=socket(AF_INET,SOCK_STREAM,0);' ], h" _7 g  ?; t9 o
         break;
4 M$ G. C6 i4 R( [      default:  R  Q5 @5 b0 r' h4 e4 M. E
         sprintf(szTmp,"Error protocol!");
0 v7 K  f& p6 h4 w! p& J2 k3 {1 q: K         ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);
7 B8 N$ H1 q4 i0 [         DoError();
1 S8 O) ~/ O$ H, e         break;
) H5 r9 s7 k/ q6 \6 d4 f/ a; n1 D   }# B1 F2 F8 Z% m3 b7 G% P6 ^
   if(m_Socket==INVALID_SOCKET){
/ ?; \4 A% T) Q, M* ^0 L      sprintf(szTmp,"Failed to create socket!");
# ?9 Z& c5 z7 x# U      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);
! _0 \+ S, Q5 \  T$ b1 |$ L; i6 S      DoError();
& G) s! T  {) q' x) G4 p  P; |      return;# g6 w4 J5 z  \$ N
   }0 x2 k: Z! G$ Z; @& u! J
}
; S" H9 M  Y% n& a6 B4 D! S) Xvoid __fastcall TListenThread::SetListenSocket()9 R) `3 w. c9 h: x5 t& ~
{
  H5 \: f% e' u' x5 `3 z, F   server.sin_family=AF_INET;1 n9 M, e3 r! I) |# w
   server.sin_port=htons(m_Port);" f' ]9 S" l% \7 a7 o# h
   server.sin_addr.S_un.S_addr=INADDR_ANY;
. D- S" @# j0 b5 i) L! p! |   int NewOpenType=SO_SYNCHRONOUS_NONALERT;3 L* {+ X5 }( a% H% q1 [. E
   if(setsockopt(INVALID_SOCKET,SOL_SOCKET,SO_OPENTYPE,(char*)&NewOpenType,4)){* b; \6 w3 b! |
      sprintf(szTmp,"Set socket option error,error no:%d",::WSAGetLastError());( n  Y( k6 r  ~
      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);
3 X# U5 d$ Y' j$ J      DoError();0 s# a+ R( w0 m7 U0 H
      return;
4 ]& a, C6 x. r. C   }
, @' g7 Y- m% k3 i5 j}! }- z* C% K4 p- M- P1 U0 K# \/ Q8 t
void __fastcall TListenThread::BindListenSocket()2 S0 i( J" m& k- |- {' }  u
{% h1 l) o+ n5 k  h. h
    if(bind(m_Socket,(sockaddr*)&server,sizeof(struct sockaddr_in))){
) }% h+ S& d6 B1 }' u      sprintf(szTmp,"Failed to bind socket,error no:%d",::WSAGetLastError());
& I2 C* s* \- o9 p      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);
' B+ i3 z8 G- {1 b# Q% H6 x  Q! N      DoError();
. f1 [4 O& u$ O3 q3 M& A      return;
7 }% {2 X/ r( `. _3 i   }2 ?- H  F! e/ R
5 W: U, ]$ l; v$ N5 r# e( a
}
/ p  U0 C% `' ?( A9 S$ P1 S0 m. X; {void __fastcall TListenThread:istenSocket()
- r+ |/ F0 k; U! H! ~/ [4 |{
) t* L8 h9 J' X8 d3 r0 G  if(listen(m_Socket,SOMAXCONN)){4 H" ]3 _7 a- K
     sprintf(szTmp,"listen error,error no:%d",::WSAGetLastError());
: ~! `, J; b# ]. i8 i     ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);
3 `( u5 r5 F) F/ K, n: A2 b9 ~9 g# r     DoError();
  j  {4 N- g8 z3 R* R     return;$ H2 l7 M/ M: N
  }8 O3 O7 |7 a9 ^; R
  //Determine whether there is any connection) v$ C# E! O2 o2 o, t% J. ]
  FD_ZERO(&FDS);
0 Q5 e/ Q/ q0 ^  G6 r# i7 l" C  FD_SET(m_Socket,&FDS);
1 |1 U* B; W. |2 E}
* b- M6 I7 n6 n6 D" q/ jvoid __fastcall TListenThread::Execute()( F7 F2 V; R9 s! [1 N; |9 W( w
{3 U5 s$ z: o; K! Z9 N" o  u) q
   char buf[4096];
( Z" ]# y' h# P( L. }5 j   struct sockaddr_in from; //for UDP
+ }  }! X' i- H   int nLen=sizeof(from),nSize=0;  //for UDP3 F' k, k% S- \& e9 J) M
   InitSocket();
) k0 m) O( s9 U1 L, ?+ p9 ^( r) R   CreateListenSocket();% l4 J2 B# ^: G8 f* H8 j  s
   SetListenSocket();0 E; M5 }6 t8 D" S* k- v" e; ~
   BindListenSocket();
  q4 N8 P( P8 X' d) m. u% J0 J   if(m_Protocol==UDP){" B+ w& l" d, ^) \) I/ F
      while(!Terminated){. u  i& T  w% ~, |' l" Q9 o
         int nSize=recvfrom(m_Socket,buf,4096,0,(struct sockaddr*)&from,&nLen);
$ a8 j; A! g% G0 R7 g2 c         if(nSize>0){* h+ f" H8 _  t2 w; h$ p7 s
            buf[nSize]='\0';
. e" E1 E7 O5 \6 U# p$ O            PSTNForm->Memo1->Lines->Add("Received Length:"+String(nSize));
" Y) B" `- v- C, Z7 o            PSTNForm->Memo1->Lines->Add("Received:"+StrPas(buf));9 S) `% v- h# V. H4 t
            ::Sleep(100);7 \7 s1 U8 _+ [# _) S6 f; c
            sendto(m_Socket,buf,nSize,0,(struct sockaddr*)&from,sizeof(struct sockaddr_in));5 s# Q4 ^7 A. {0 }' l0 X0 T
         }8 b  F' r0 L. s" b  o0 n$ I1 a
         else return;/ k) }3 N- f9 }
: G2 Z$ B3 R7 ~7 V2 s; [
      }$ \, t! x: H* `% p% A
   }9 J, ~, j1 t! A
   ListenSocket();
3 W# l" A# w8 ~$ t   struct sockaddr_in client;
; U5 `$ f: ]' }, u5 ^1 ]! e   int nLength=sizeof(struct sockaddr_in);
3 P' f9 x* t  Z. \4 C2 T2 y2 W2 P   while(!Terminated){! [9 |/ U' Q3 U+ p8 n
      int nError=select(1,&FDS,0,0,0);; I- T4 R, g# ^5 h- r
      if(nError<=0) Terminate();5 ]( f* q* [- ^$ o
      SOCKET m_AcceptSocket=accept(m_Socket,(struct sockaddr*)&client,&nLength);
* V$ ^1 M  t' T, Z* l6 b5 P      if(m_AcceptSocket==INVALID_SOCKET){
$ V' G: E- D4 ^         sprintf(szTmp,"Failed to execute accept,error no:%d",::WSAGetLastError());* I0 d# [) H$ t3 E6 z9 r
         ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);
9 `. ^$ v1 C' d1 C         DoError();
! d  r* ?7 ^* z; C8 R" T4 r         Terminate();& N* G* ]7 h- d2 e# {4 b9 `& O
         return;5 J# X9 {# v$ A- d) ?# e
      }
4 t0 G9 m9 X5 T( n+ N+ o  I9 L  o      TCommunication *pCThread=new TCommunication(m_AcceptSocket,FALSE);
4 a+ ~9 B8 s/ p0 p      pCThread->Terminate();) g& N/ p- d& y7 M; f* o" @
      pCThread->WaitFor();
" c; b: L7 o$ O) N" ~, n/ S   }; C3 u2 R4 N! K8 z9 A! C
}
& k" M1 k. N; J) `//************************PSTNForm*********************************************//  |2 ^. C* H$ u
__fastcall TPSTNForm::TPSTNForm(TComponent* Owner). l: I; B7 w- i* Q$ _
   : TForm(Owner)0 h( l: m& O2 [+ n5 O6 B* ]8 |
{
* M2 P  \- R1 T: m, m7 h}6 |& c) y$ e" Z2 L% s) X4 P
void __fastcall TPSTNForm::Button1Click(TObject *Sender)" M3 S4 F6 \+ z9 k7 H1 ~0 q
{
5 g3 g1 w/ o) Z. g, q6 h6 O   Close();& z  q) D) B. ^9 O& e- O9 u: j
}
! o3 N; |( t2 d, |( u  dvoid __fastcall TPSTNForm::Button2Click(TObject *Sender)9 _8 U" S) D& n  o( E6 s( l
{
2 Y# v* p' p$ d5 ^! Y2 `  i   if(pThread){1 i1 R# ^" Z3 h' E9 G$ `) X! l* p
      pThread->Suspend();: A* s, z* T# I% T+ S: \" O: k
      pThread->Terminate();
9 r: r; r% W+ [3 w6 y. e5 B8 K# B      delete pThread;
7 |& q# _' e( N! b      pThread=0;& {4 {4 K* K( g3 {. M' h5 m3 K
   }. D' }9 O8 ~( ~4 X" C
   UINT m_Port;! m8 b* e1 S. J' M* V
   try0 |6 w1 P- V4 t3 E
   {# A$ B7 G: C6 V% `, P8 u: f+ p! ?
      m_Port=Port->Text.ToInt();) y9 _# K  {- G  g9 }
   }$ j. M/ Q& V- z
   catch(Exception &e)
5 B% Y* _( V! M* Z2 h   {
. b) E8 b. N! U( C* \      ::MessageBox(0,e.Message.c_str(),"Error",MB_OK+MB_ICONERROR);
& |9 b3 D5 V8 h% P9 g  _6 k      return;
: W+ C0 w3 c& F2 D   }; s) _$ ^, x* T/ C9 j- a# L
   PROTO m_Protocol;
, N2 Y/ @; K8 K2 W6 A2 p   switch(Prot->ItemIndex)
- @! y- r& w& j% @' D   {
3 S- ^! A" Y  e7 J5 d9 Z      case 0:6 t1 \: g) F6 I5 |% Q
         m_Protocol=TCP;
" ~4 w% W( n" u         break;
0 v# V( P. q$ n  p. c: @% a% \8 u1 ?      case 1:
% e2 Z0 @2 p# \1 ?* K/ `         m_Protocol=UDP;
5 l: A& e! a- `- O         break;
! |, U; N& N: M. ~$ X      default:- P9 _2 v7 s2 x2 d" u  \6 h/ z
         break;1 [% M3 P* F$ _
   }
$ s6 D( n. O! O& z4 O   pThread=new TListenThread(m_Protocol,m_Port,FALSE);
' {  p* J' F: `- y1 Y* o' W+ v! L( t   //pThread->Terminate();
0 g# A( X) Q* j4 t- W4 O}
' k8 ^8 G: S, t- c' X& H& jvoid __fastcall TPSTNForm::FormCreate(TObject *Sender)
* I. Z- `8 U: U1 S{( u- ]0 O5 }* Q/ c* {# q9 F
   ::SendMessage(Prot->Handle,CB_SETCURSEL,0,1);7 g9 W! e' [' F  i% a/ ?; j, S
}3 J/ |) [2 z& [% C1 p
% S7 m7 A3 Q* {. a
void __fastcall TPSTNForm::FormDestroy(TObject *Sender): V  I; M7 i0 Y% S1 \5 F3 F
{: a% x: G+ T& G
   if(pThread){
+ u1 F) A3 e& J% u# d3 |8 X% K3 e      pThread->Suspend();% C4 \/ Y& p! b+ ?" P
      pThread->Terminate();}
8 B, Q" ?6 E1 ]5 {' o) q}
) I% i1 T: Y# \) H" r上面的代码,各位可根据自已的需要和针对自已的应用,在数据处理方面加以改进就可以了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-11-14 20:10 , Processed in 0.021918 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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