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

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

[复制链接]
发表于 2004-2-15 14:01:13 | 显示全部楼层 |阅读模式
在CB中用socket api来写网络通讯程序: M- L8 K0 e; {7 R9 Y6 d
作者: kingcaiyao ,如转载请保证本文档的完整性,并注明出处。% P1 E) ~, ^1 }
欢迎光临 C++ Builder 研究,http://www.ccrun.com/doc/go.asp?id=569# I" v% n' H, C
本文转自csdn,作者:kingcaiyao
6 u0 D6 O" I& ~/ Z2 i' S. r& n原标题:在C++ Builder中用socket api来写网络通讯程序(同时支持TCP和UDP协议)
* Z; R! w+ s/ |原文:  http://www.csdn.net/develop/read_article.asp?id=19883
- a1 L) [4 f$ ~9 x+ }0 `! j& a: ~1 e7 G  K: Y
' g) j$ @- V- q9 N5 s7 K1 O
在7月4日看完sockcomp.pas后,我决定用socket api来写一个客户端和服务器并且同时支持TCP,UDP协议,于是我就去做,现将代码贴出来(已调试通过)! m; j9 Z6 Z6 B+ s: H
Socket api Client:
0 I. P( v$ Y9 @( i* M4 t! b
/ V% T) B: o1 S: k7 M( j#ifndef UDPClientH% ]0 P! W; W# }
#define UDPClientH
* `% E: `8 z$ K; E5 v" L- `3 @( p#include <Classes.hpp>& D7 @3 z% `# b5 I% w
#include <Controls.hpp>& ?  H# I+ p" L1 K4 K: r# `: y% D
#include <StdCtrls.hpp>! Z: |& d2 q, j. q* t8 `  S' K1 k
#include <Forms.hpp>
" P3 u# W1 z  _+ A7 f7 N#include <stdio.h>
- W; Z1 P% B# p* l+ j#include "CCEdit.h"
; e. Z  J# F% w#define WM_SOCK WM_USER+100
) }! w: a3 W2 y9 Vclass TLANForm : public TForm6 Z' y+ g, M1 U" M) k$ J9 [
{' }7 Z# a) e  y% N( y
__published: // IDE-managed Components- }) |+ s) f: \9 Q1 t
   TEdit *Port;9 k- F' L) `, N" b. q
   TLabel *Label1;/ ?" ^- _/ {( N- _& c
   TLabel *Label2;
# ]' _. ^+ ~* ?0 [; g, G& B   TComboBox *Prot;1 ~( {# T& F" d% x# b3 ~
   TButton *Button1;
% _/ g, V6 e- c: N* l   TLabel *Label3;3 I' D, z0 ~/ v0 I$ _/ u; O
   TEdit *Addr;+ q- X/ _  p- ~* L
   TCCEdit *TxtEdit;
/ I* Y& t( i' O9 i   void __fastcall FormCreate(TObject *Sender);
. r; k8 ^$ n+ X% O, j( m  @   void __fastcall Button1Click(TObject *Sender);  q* a% }$ Y: L
   void __fastcall FormDestroy(TObject *Sender);' T) N2 [" j2 _0 ^
private: // User declarations( i) ]6 g4 B) A+ Q  A
   void __fastcall OnRecv(TMessage &Message);
8 W- h& X' ?  Y# ~public:  // User declarations0 p" X3 s. {8 \6 i) G. G# ~
   __fastcall TLANForm(TComponent* Owner);7 S: B& S& g/ E, z
   BEGIN_MESSAGE_MAP/ O( J6 I- P: r4 @4 R) w' g
      VCL_MESSAGE_HANDLER(WM_SOCK,TMessage,OnRecv);
+ X+ Y0 y' T) x, W9 y4 y   END_MESSAGE_MAP(TForm);, K7 {: j8 l: ?! H3 D' i6 U
};
% I7 \) a0 C5 L2 |% N; h) l9 ^extern PACKAGE TLANForm *LANForm;
' y+ |2 E* a" J# M#endif
( T  t1 Y, ?9 U0 r( B1 n7 ~
0 R( E: k  Y' n
( }- ^0 t$ D+ q9 P; n.cpp File
2 q" v' b  E! L0 V, ^  I5 V9 c( d; g. a$ N3 F5 {8 Y0 J
#include <vcl.h>8 }2 w% i5 X7 {
#pragma hdrstop6 [) Z3 @3 z& I5 T, r1 F
#include "UDPClient.h"" b" ]) G( ]1 p) m" H
#include "WinSock.h"
6 O% m; V5 Y  ~" i+ K! h#pragma package(smart_init)5 m' X2 w& X% {) F  r+ f$ a
#pragma link "CCEdit"$ a# [/ C1 w; O/ R7 e" i+ p* O
#pragma resource "*.dfm"- a/ d+ I9 e0 z5 J7 K1 U: G
TLANForm *LANForm;. o) ]2 ]- ~) U* b1 X' C
enum PROTO {TCP=0,UDP=1};
7 Z2 e  M9 U( a3 y; ?4 G0 o7 D( rSOCKET m_Socket=INVALID_SOCKET;* b0 D" M- v) [: C# p4 D* b( [7 h
PROTO m_Protocol=TCP;  |8 [! p+ a+ ^4 [, `
__fastcall TLANForm::TLANForm(TComponent* Owner)
8 }. z# i$ D/ v   : TForm(Owner)
% X5 @* Y/ w2 E& o) c5 C% X{4 x  Q1 Q( i2 [, ^, w
+ l! E$ D6 q" [( g- R# x+ b
}$ r+ }! e2 s4 O5 u6 k" Y7 l) @
void __fastcall TLANForm::FormCreate(TObject *Sender)
, P% c7 l, |! ~) C" m2 t{
; c- l8 m' `# L1 @: x& m   ::SendMessage(Prot->Handle,CB_SETCURSEL,0,0);( q# ?, f7 M% V; g
}' @4 A( x! y9 g9 i" A
void __fastcall TLANForm::OnRecv(TMessage &Message)
* F2 j* l2 f4 L7 _{
' j& x$ n6 m! g- J   char buf[4096];0 L, Z' O. c& A9 ~3 o0 [
   int nLen;. J* o. s8 X4 m* C& f% ^9 C' \
   struct sockaddr_in from;
3 ^" \2 P1 h, J; a   int nLength=sizeof(struct sockaddr_in);
/ h& l) J4 k/ s) u3 s   switch(WSAGETSELECTEVENT(Message.LParam))% _( S8 k* w; f' |7 y5 @
   {8 a9 f! c3 b5 g. U6 t+ ]$ Q
      case FD_READ:
; _9 J. i0 N" R5 B& R# J6 J3 Y, ]         switch(m_Protocol)# F3 T, Y2 Z9 r' X; G: _) T; P4 A6 F
         {
) h% r/ z3 S% R% a) L0 f  A1 l            case TCP:; z; Z# q6 {2 q& C7 y
               nLen=recv(m_Socket,buf,4096,0);, F- {) [; B1 c/ }4 F
               if(nLen>0){
4 T, m) \0 B% j, h: M1 p                  buf[nLen]='\0';
# b4 _6 B4 N& [                  TxtEdit->Text="Received Length:"+String(nLen)+"\r\n"+StrPas(buf);
* ~* O+ b9 [* f4 Q( W               }
7 Q' K* ]0 N' O               break;+ t: y4 k0 q  ^1 U* D- d
            case UDP:2 @5 x# x& t/ N* C3 y9 J8 s; K
               nLen=recvfrom(m_Socket,buf,4096,0,(struct sockaddr*)&from,&nLength);
- Y9 m3 v  ?! H" z/ v  A               if(nLen>0){% R" Y- Q) M1 X( a& {3 [
                  buf[nLen]='\0';5 x  K) E- L2 u$ w, W( [
                  TxtEdit->Text="Received Length:"+String(nLen)+"\r\n"+StrPas(buf);
- F! a, W6 b: `. X( h( V               }
- ?+ d/ G& x6 i0 w$ }  G  W               break;% G0 u2 s. {2 L7 ~* _
         }4 E/ ^' R* y7 u& A
         break;  d3 f* i8 a) f! e0 G* ^
      case FD_CLOSE:
$ v6 Z* H! h3 _5 X! t5 M         closesocket(m_Socket);
. M! W: C' Q( U         break;
, C7 c2 g3 S; x5 |8 V   }  e; W% Y) v, l9 h; a* M3 \4 ]3 B8 _
}5 f( ~' A1 `( p/ o
6 W* _2 R7 f" n: ^0 A: w
void __fastcall TLANForm::Button1Click(TObject *Sender)
) ]7 L* D1 x# L1 m9 ^2 _) V{- O7 n  {( w. z2 a& M: K9 z
   char szTmp[256],buf[4096];; d5 ?  Z1 J  n$ U; ~
   int nSize=0;! H% a$ Y" H9 ^9 X/ J, ?
   UINT m_Port;! t! e: t7 C- W1 E. r$ a1 S
   AnsiString addr;6 V# |% y$ j0 ^3 G1 e) K; k
   addr=Addr->Text.Trim();/ H3 K. S! K# X% l
   if(addr.IsEmpty()){( y4 X9 [# o$ k, J
      ::MessageBox(0,"lease enter the server IP!","Error",MB_OK+MB_ICONERROR);
9 v5 l# I% {& @, d4 t5 [: P3 U      return;
! E5 ~7 {' A$ M! ~; i. e   }4 a3 a8 q1 ]3 p; X2 K2 S  |
   unsigned long nAddr=inet_addr(addr.c_str());1 Z, l' t) l  d- z
   if(nAddr==INADDR_NONE){
' `' l1 I% o1 [" x2 }3 [* Q      ::MessageBox(0,"Bad Internet IP!","Error",MB_OK+MB_ICONERROR);
& G  s- {/ D/ Q) [5 ^6 `2 w      return;}
) H7 I, F; e1 \  i) E5 l. L
" W' O6 d  N, S! I/ O1 x' K   try
6 v: B9 M. s$ L0 \. f: T   {
# e9 l7 @. h( R9 t* m9 f4 n      m_Port=Port->Text.ToInt();
) L" b5 l* |  E& }   }
$ F2 F. w% t3 [, ]   catch(Exception &e)
: i& j6 [) L' d2 B8 \   {
. Q" q6 z+ R1 S& o2 _3 |# H      ::MessageBox(0,e.Message.c_str(),"Error",MB_OK+MB_ICONERROR);
( g9 C: q" v. Y      return;
# [! |' T( q- A   }$ n& M4 u) o/ u: n* U
   switch(Prot->ItemIndex). M8 C8 P6 x5 \1 R
   {# ~' X6 J' u; D! A
      case 0:+ {& v: z9 z* X- h; {
         m_Protocol=TCP;. H+ A9 J5 q8 g3 y; N
         break;% u- `4 m# \8 G% M* E2 z7 y) J( y
      case 1:( N, _+ {. k4 G+ K; X
         m_Protocol=UDP;
9 l* d7 @: i8 N6 c4 |         break;* i2 A! |. a& |$ ~+ W. H
   }
7 P, v# c, J  |   if(TxtEdit->Text.IsEmpty()){8 K6 X  x& x- f6 _
      ::MessageBox(0,"lease enter the text you want to send!","Error",MB_OK+MB_ICONERROR);
; ?/ h3 G3 p; i, P. ~      return;}8 `! i3 @2 {) J$ w0 {9 ?& p, K$ s2 L9 {
$ x4 {( E$ D) W$ E% C" L& h
   //Initialize Winsocket' `$ B2 v, e) Z# O; h9 p- R
   WSAData wsaData;
7 a6 {3 Y# o( m* v+ B/ v. I   ::ZeroMemory(&wsaData,sizeof(WSAData));
5 C1 x3 ]$ O0 t8 [0 x. k   WORD version=MAKEWORD(2,0);
! {. {) Q! ~8 e$ a. W2 b- P0 f   if(::WSAStartup(version,&wsaData)){
- ~& f' _0 F$ g& q5 Z! s      sprintf(szTmp,"Failed to initial winsock enviroment!,error no:%d",::WSAGetLastError());
& ~! Z  i1 _/ i2 J      return;}+ v* \$ T6 S  ^& d4 j
9 Z" k; L$ g2 Q5 r
   //Obtain the active connection% z  r; y' I$ o
   char ComputerName[255];  n( N3 J: ]# `/ Y( r6 x
   gethostname(ComputerName,255);1 |" j2 k4 o, b0 B( M5 ]: d. i
   struct hostent* he=gethostbyname(ComputerName);
) t4 u9 j! y" r1 @5 _   if(!he){5 r' H( j9 F$ f' o, q" }
      sprintf(szTmp,"Failed to get information to host!","Error",MB_OK+MB_ICONERROR);6 E! Z# i' a0 ~2 c" B% r
      ::WSACleanup();
) p; w. S0 @7 T# f: |3 c      return;- x( u7 V2 ^! e" e9 l. ^
   }. M5 ]  t, ^6 x$ [4 N4 K
   //create new socket
# f$ L, C8 o' |   m_Socket=INVALID_SOCKET;
  i- J5 e9 \5 V/ w- {2 R& x   switch(m_Protocol)
  X8 N4 M" I3 I$ E. H' U   {
7 u$ Z( i/ Z. a) K9 T! |5 ^9 {      case TCP:
+ Z' w. Y5 b) {1 q& U         m_Socket=socket(AF_INET,SOCK_STREAM,0);
$ W1 f+ Z7 b- j8 u         break;
# p9 Q0 d! o& H! ~# a$ I$ E% s      case UDP:# j$ @) u+ t2 B0 u
         m_Socket=socket(AF_INET,SOCK_DGRAM,0);
9 F$ q) c5 x1 n& M, [4 V         break;
9 `3 x2 M' u% _- \, _   }
0 s! U' T7 d0 l0 h) ^# K2 N   if(m_Socket==INVALID_SOCKET){7 E+ @" F1 t8 Z- E2 Q5 A! e
      sprintf(szTmp,"Failed to create a new socket!,error no:%d",::WSAGetLastError());; t; _6 q" z7 T
      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);" j. l+ L# X) {) H9 g" b! `
      ::WSACleanup();
) E- l/ E- q6 k4 \0 y      return;
4 H8 Q. M% i4 G  t4 v9 [   }# C' F, l; l- d
   //bind socket
$ K$ u% j+ }6 K* O6 A. i( C# u% {0 A   struct sockaddr_in client;, I# x/ o5 E6 v" e& d& b# I5 X1 C
   unsigned long nClient;0 z) ~; C9 p) b; r
   memcpy(&nClient,he->h_addr_list[0],sizeof(int));
8 @8 i# P, ?# Q( f   if(nClient==INADDR_NONE){; _3 @8 s" V8 o  o( A* q
      sprintf(szTmp,"Failed to obtain the local machine's IP!","Error",MB_OK+MB_ICONERROR);
7 I% d( f2 a/ g3 c+ V# o      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);. y+ m% ]* H) }  |* Q$ y9 j5 h
      closesocket(m_Socket);
3 h/ a9 c6 W2 B. R+ V# x0 O. @      ::WSACleanup();
- p) Q# A5 o7 S      return;+ h. f- X( ~, G
   }
! \( B4 K$ |  j1 b1 a   client.sin_family=AF_INET;1 M2 h! _" [! V, x2 o1 S
   client.sin_port=0;
) r7 b5 d- Y8 i   client.sin_addr.S_un.S_addr=(int)nClient;4 y; K0 u; \4 j; ]: W' ]: z
   if(bind(m_Socket,(struct sockaddr*)&client,sizeof(struct sockaddr))){
9 e  G/ w1 X4 c- T* |3 b6 @0 _      sprintf(szTmp,"Failed to bind socket!","Error",MB_OK+MB_ICONERROR);
1 x: M' b/ X# U& @& z6 C      closesocket(m_Socket);
1 R; K" C$ R$ u      ::WSACleanup();: [5 D# r7 m- y, I
      return;}% Y; `  R4 d7 I) `! y1 D. D( z" U
   //connect socket
/ G; E: [7 t+ m( G) x- F! G2 E! c   struct sockaddr_in To;3 Q  ^* N( A4 T/ x$ m% N6 P
   To.sin_family=AF_INET;( \5 V, d+ A4 ~9 N1 [- A# ]
   To.sin_port=htons(m_Port);
5 h9 S3 d6 b0 E7 V   To.sin_addr.S_un.S_addr=(int)nAddr;) Q2 ?- S6 M. [- G: e! N/ p1 k
   fd_set FDSET;
: Q; g/ ^- E! K% z2 @   FD_ZERO(&FDSET);
! n% l+ N9 e. F3 t7 ~0 j   FD_SET(m_Socket,&FDSET);
- {, x  }1 m3 a0 i2 Y
3 G4 k! p/ N$ W! @
- c. L; |9 v. t# t/ R1 x* P   if(m_Protocol==TCP){  h' N& [! S0 h/ M) E+ C5 U
      if(connect(m_Socket,(struct sockaddr*)&To,sizeof(struct sockaddr))){4 o6 n. J2 M( z6 Z; t7 E
         sprintf(szTmp,"Failed to connect the object!,error no:%d",::WSAGetLastError());
6 _7 u& ?  }& T6 q         ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);: T& `+ C# N; v5 L8 L
         closesocket(m_Socket);$ t7 Z  N+ m7 D8 p6 ~0 n2 h5 b
         ::WSACleanup();
8 K6 j# G2 U6 B( @( J% E" t, E         return;
  }2 d9 H3 d# e: p7 X4 t9 l4 e      }  M5 e7 R0 @8 s1 X: [8 r
      int nError=select(1,0,&FDSET,0,0);
5 M5 _; d9 I! Q: ]      if(nError<=0){
6 d7 N" V9 l% V, n2 l7 d5 Z# g      sprintf(szTmp,"Failed to select socket!,error no:%d",::WSAGetLastError());
3 y* i" u  F6 c      closesocket(m_Socket);; O8 m" u7 f( c9 s
      ::WSACleanup();! w% c# @. P4 p+ Z$ E6 |0 _1 a
      return;}. b( S4 B; n8 m7 ^& }
   }
9 O1 X7 s7 M4 ?9 V& t. }   //Send data
* \. _3 |/ s8 J6 o/ C   int nLen=TxtEdit->Text.Length();; r$ p0 F5 C0 d8 y+ h
   if(nLen>4096){! }* N% w' K  j
      sprintf(szTmp,"The buffer is too size to send,it shoud not be more than 4096 bytes!");
7 p# a3 G( s* h  n      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);
$ c- z1 T3 L9 ~      closesocket(m_Socket);
9 V0 {" }6 S5 v' ]& X$ k      ::WSACleanup();
4 \' v. K& S. E) f0 K$ w$ P1 H      return;
/ e& O8 ~! z% X" c: T   }) x; ~% B" T4 _' ^, L4 [
   strncpy(buf,TxtEdit->Text.c_str(),nLen);+ M' ~0 g# R4 P( q
   switch(m_Protocol)" U* H! V1 q# |) j" P5 N
   {! s0 P# ?+ v$ z" H3 I
      case TCP:
/ [  O3 M' a' R$ r1 K$ g         nSize=send(m_Socket,buf,nLen,0);+ C* W1 O7 n3 O2 n6 o+ g
         //ShowMessage(nSize);4 N- N% G8 n9 a  K" S4 F& d4 W
         break;9 `" t: I8 Y, X& @: `
      case UDP:
) `+ L1 p4 \0 y3 ?% O( v         nSize=sendto(m_Socket,buf,nLen,0,(struct sockaddr*)&To,sizeof(struct sockaddr));( r$ r4 I/ P7 \- P0 O" y
         //ShowMessage(nSize);
" I( p) B3 e% \6 K         break;
& s: q, y7 }8 q# E1 e
' V& \% C) I( N! o8 b7 m( n+ |   }
  A5 \2 f* e# z, I! g   if(::WSAAsyncSelect(m_Socket,Handle,WM_SOCK,FD_READ|FD_CLOSE)){
9 h& k) |8 X- _1 J; [# k1 V      sprintf(szTmp,"Failed to register socket event!,error no:%d",::WSAGetLastError());3 |9 X) x' d- \! I
      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);: y9 D- H3 ?: R; q
      closesocket(m_Socket);
% L7 r) A) Z5 K0 F+ ~  ?5 x      ::WSACleanup();; F, d  I: Q) B: F( g
      return;}; y" D/ P" a4 s9 _2 i4 p0 ?
}
; t) `2 A: F# pvoid __fastcall TLANForm::FormDestroy(TObject *Sender)
/ Q; x3 d' P3 e* H{$ \. y3 J! E' m8 D
   closesocket(m_Socket);
  J1 J" Z" t0 ^7 A4 N   ::WSACleanup();& a( _  W; q! u% i5 a  P" \4 k  I
}# p  Z5 v0 u  ^
6 |/ t% {+ Z7 y0 Q: r
Socket api Server:
" R: y. k8 J. Y! V* g3 N5 ~.h File
& Z8 o- x! \- Z( Q" z/ L  X#ifndef UDPServerH
  U. l. j5 a, N#define UDPServerH/ p8 T6 m/ G- N7 W4 R+ z, j" r
#include <Classes.hpp>
# x+ X9 {) w7 a% K- e7 d#include <Controls.hpp>
: y9 ~( ]6 L- T+ X! E: t#include <StdCtrls.hpp>5 T2 }- L/ z& ]. h3 C
#include <Forms.hpp>
0 y  D+ N1 _7 [5 [7 [! F. Y#include <stdio.h>
+ ?/ T7 C' r: U% g/ S0 x) \#include "WinSock.h"
4 g1 {' i2 K. t/ ~6 i7 M/*#define WM_SOCKET WM_USER+1000
/ A$ U7 W! Y) K9 i9 J#define INITSOCKETSUCCESS 0. g+ W! ]% [0 k; C7 R& t/ n5 k
#define INITSOCKETFAILURE 1# E; V; W$ ?: H/ s# W# N
#define CREATELISTENSOCKETSUCCESS 24 l' d( k; P" Z( j7 v, _/ t
#define CREATELISTENSOCKETFAILURE 3
0 Q: v% b  N: O0 ^  ]$ k0 h# G#define SETLISTENSOCKETSUCCESS 4
7 l6 ^+ w- c& U  x  |( }- g#define SETLISTENSOCKETFAILURE 5$ Q( X7 I' K) A: K( K  q1 ~
#define BINDLISTENSOCKETSUCCESS 6) X9 g3 y; ~, P1 }- N
#define BINDLISTENSOCKETFAILURE 7* v" l; S  }) e3 Q% Q) S
#define LISTENSOCKETSUCCESS 8# S4 W1 z5 H$ W3 G! V$ W
#define LISTENSOCKETFAILURE 9+ k' S5 C  Q; q; ^0 M0 b5 E9 W9 z
#define ACCEPTSOCKETSUCCESS 107 \8 M8 a% l9 x6 `
#define ACCEPTSOCKETFAILURE 11+ ^/ S3 Q) d$ l  _4 [& R
*/' R0 a; M+ ]2 a9 M# h% q5 W
class TPSTNForm : public TForm
; A& K7 z' _1 p5 k# n# ]{$ l9 T, Q# K9 A5 l* z
__published: // IDE-managed Components
% v+ G4 X* i% e, S4 f   TEdit *Port;
7 `, J$ [2 s$ I8 [1 C' w4 {1 N   TLabel *Label1;
* I+ N, V$ Q  |; j$ i2 H   TMemo *Memo1;1 D) \2 h$ q6 K
   TButton *Button1;
+ J; t* I6 [5 S1 L3 V8 o   TButton *Button2;" k, a% m; r+ T$ r
   TLabel *Label2;3 y4 G( V7 {. f; A
   TComboBox *Prot;
* o1 _# u! q- R5 m   void __fastcall Button1Click(TObject *Sender);
" o. P& I2 {9 s0 y; v5 R4 C   void __fastcall Button2Click(TObject *Sender);
( Q. s3 n  \  h% }4 `, o) ~7 E   void __fastcall FormCreate(TObject *Sender);" X- X, D2 V( b7 T* f. J- p. n
   void __fastcall FormDestroy(TObject *Sender);
; p0 t, R8 Z1 v% l* }  Dprivate: // User declarations5 L4 L. p4 w  N) R, r8 @2 q
public:  // User declarations
, J' O9 e' H( y4 @1 q% v   __fastcall TPSTNForm(TComponent* Owner);
+ M/ {# h- p4 {& y# @0 R+ \};9 m! R( I4 v) t7 w
enum PROTO {TCP,UDP};6 W* q" H* j& ?/ s+ Q% N
class TCommunication:public TThread    //Communication Thread( e6 A! B- K  w
{; V% l. [9 T) |3 [5 T! R& Q
private:& w, o) x$ S* n
   SOCKET m_AcceptSocket;
: _( d- {+ ]! a- `% E& H4 l   char szTmp[256];//ERROR MESSAGE0 Y0 t, o! h: K5 G7 p2 X
public:9 E0 i- d( n  z
   __fastcall TCommunication(SOCKET m_Socket,bool CreateSuspended);5 p$ f, C7 j& z  T# Q1 I4 l6 e
   __fastcall ~TCommunication();5 B0 {/ O1 ]' x2 O( Z
protected:3 [% i& e/ ^% W9 d* w7 {/ Z
   virtual void __fastcall Execute();8 Y  C* q  M' l
};
0 \' ]" d1 p& _7 m2 t9 o: Dclass TListenThread:public TThread //Listen Thread
0 B6 p, ?6 F1 W{
; @: K' b/ y7 D5 Aprivate:4 b) V; Y; z' B; f1 M7 m+ ?
   WSAData wsaData;
! {# O6 y; V9 F! E' b   struct sockaddr_in server;
2 t8 X" ~/ E; U1 ]7 Z   fd_set FDS;
* N4 P( t; P/ Z; c   UINT m_Port;6 H7 @" s$ b. S
   PROTO m_Protocol;" W& ~, f8 V  v# C: b3 j! s) [0 q
   char szTmp[256];//Error Message
& M6 f2 t3 m( y3 B9 Y% X1 [$ {public:
! f0 B9 i( Y* X( n2 e$ k   SOCKET m_Socket;
, O, o2 |( `8 A8 b  x! D% U   void __fastcall DoError();" h0 ^, l# ^5 j3 E, }+ m5 X
   void __fastcall InitSocket();2 F3 b% M2 q8 g. i$ n
   void __fastcall CreateListenSocket();: B) S' L6 a( F+ w" M
   void __fastcall SetListenSocket();
/ a- d7 b/ t8 c4 J9 d7 I   void __fastcall BindListenSocket();
4 U7 a5 l; C; {   void __fastcall ListenSocket();
; P$ Y( w" ?7 p$ H3 w; N1 l0 q
! x2 F# ]4 o$ z& l- H4 k4 upublic:
: l" v) h' L- U7 i3 l   __fastcall TListenThread(PROTO m_ProtocolA,UINT m_PortA,bool CreateSuspended);
/ {1 }- I1 S$ a) q9 b+ |% q   virtual __fastcall ~TListenThread();
. k3 F' Y: A+ B* Xprotected:
% i0 l5 [4 b, h. _   virtual void __fastcall Execute();
6 T' m% F3 }/ c) a};2 K3 {4 |/ O* c# a7 w* Y
extern PACKAGE TPSTNForm *PSTNForm;
; @: a/ h+ `: U, T#endif
! D/ D4 F, w, K' Z" L1 a7 _.cpp File
( N1 y3 r& R3 I/ S$ t#include <vcl.h>
3 ^, k8 d" p! [7 H1 S* P#pragma hdrstop
; y$ a8 ?/ B* x7 }( {+ N. p#include "UDPServer.h"7 s/ R) k9 C' X% X  m$ C
#pragma package(smart_init)% h* N% [$ O/ x& n( M$ ]
#pragma resource "*.dfm"
0 a- C& e8 g7 k# E, tTPSTNForm *PSTNForm;, x/ ]1 X* x1 x" `' R5 z
TListenThread *pThread=0;
* E% f% G3 ^. ]1 v7 J//******************************CLASS TCommunication For TCP****************************************************
7 j2 T5 y5 V( Q% L4 }__fastcall TCommunication::TCommunication(SOCKET m_Socket,bool CreateSuspended):TThread(FALSE)
% T7 w1 o4 {& }) S% u0 T{3 _" q2 z# N9 y  X7 h
   m_AcceptSocket=m_Socket;' Q4 v1 ~5 ~0 }4 B( W
   szTmp[0]='\0';3 W$ D9 [5 ]0 I+ H- J
   FreeOnTerminate=true;' X2 r+ |8 u1 e( ^6 q* f# N
}+ C- G( G4 ]$ |2 I! W5 w/ o8 H6 Y
__fastcall TCommunication::~TCommunication()
/ Q6 V( q: z7 ]& L# E  v{
  y+ v. F0 L0 o: ~  B3 o# g  // closesocket(m_AcceptSocket);' P+ f  p$ Z7 m' {
}
7 l/ c( D9 M) }4 M6 \$ ^void __fastcall TCommunication::Execute()6 S9 l) ]# z6 T- ~6 ?) j: _
{
+ B/ `8 O& s6 E   char buf[4096];& N0 A1 f6 z  L# `% B
   int nSize=0;
# y% J7 S* K2 x& R   nSize=recv(m_AcceptSocket,(char FAR*)buf,4096,0);$ z) h1 P% i' ~# N2 f% P2 @& A6 o
   if(nSize>0)9 W+ b' o' P: m$ s6 N9 d  ]; Y4 @
   {
% u+ _( `; y. Y- a5 S0 j! {% T" y      buf[nSize]='\0';) X) a* D$ \3 r+ I( X$ W
      //Display
' w! d3 H0 F' J; Z6 N      PSTNForm->Memo1->Lines->Add("Received Length:"+String(nSize));
8 S8 I4 _: f  G& P6 l3 {      PSTNForm->Memo1->Lines->Add("Received:"+StrPas(buf));5 Z, Y3 P1 n8 X9 W% Y' G" ~9 ^
      //Deliver
8 v! J+ H. j$ d0 X. e) G7 y      ::Sleep(100);8 M$ Q7 ?  C  {$ o& Y" p4 M
      send(m_AcceptSocket,buf,nSize,0);3 o, j! g$ F4 U6 E- V
   }9 R5 y2 f9 ]3 T& }6 A+ @" r

! W0 P% `+ z& L( p, A' g$ ^$ x; }}
( \, x3 n# ?; A& p//******************************CLASS TListenThread*****************************************************
, H3 y* _, B6 T, K. i__fastcall TListenThread::TListenThread(PROTO m_ProtocolA,UINT m_PortA,bool CreateSuspended):TThread(FALSE)
# q# o, K$ l& ~7 `  y{/ O$ a* P/ M' \
   m_Socket=INVALID_SOCKET;5 }3 s% W4 w9 g+ X" e1 u) }/ M: N
   m_Port=m_PortA;
8 V4 A2 y; F' {) ]0 K* C/ O   m_Protocol=m_ProtocolA;% E8 W. Z+ X  ^6 j
   szTmp[0]='\0';
/ _: ]7 \$ q1 I   ::ZeroMemory(&wsaData,sizeof(WSAData));
1 N, G' ~' c* O* M   ::ZeroMemory(&server,sizeof(struct sockaddr_in));
6 t  e. b5 ~# O6 |& f   FreeOnTerminate=TRUE;//Automatically delete while terminating.2 I3 W$ r0 \% _3 ?. l  H9 o
}7 X; A! {+ I/ M1 I# }
__fastcall TListenThread::~TListenThread()
' _$ {0 G; c; y4 C{5 Q) R) N7 [) B2 g( c6 e
   closesocket(m_Socket);
. r7 s% w( @/ r, m9 ]+ H   ::WSACleanup();  C1 ?3 z* @0 w& D
   m_Socket=INVALID_SOCKET;0 q' {1 X5 ^$ p: y
   m_Port=0;
4 J' d: P8 d2 S! I" W* V& |9 v6 ?   m_Protocol=TCP;
6 w+ h* u' K$ z, a) }   szTmp[0]='\0';
. N/ E/ u, P9 E2 l- G& v# x   ::ZeroMemory(&wsaData,sizeof(WSAData));: q/ S% b/ H! G" y% w
   ::ZeroMemory(&server,sizeof(struct sockaddr_in));0 n. \7 |2 n1 d, l: y& d
}  z' X1 k& ]/ i  y, b, M. o% D
void __fastcall TListenThread:oError()
( }4 G% U$ p, G- i& y: f7 _{3 {5 N, U, ]$ I7 G  j6 L
   if(m_Socket!=INVALID_SOCKET) closesocket(m_Socket);/ C  [5 [9 L7 M5 h4 G' J
   WSACleanup();/ x2 d! F; u' f5 Y$ Z
   return;8 Y  G2 ~$ i; w+ t  H3 J& S# t
}) f6 R3 U* N+ E1 Y
void __fastcall TListenThread::InitSocket()
  n% C: `' Q9 [{% I, @) P% S1 j1 f- K
   WORD version=MAKEWORD(2,0);
2 `( n7 k6 G) a7 |+ w   if(::WSAStartup(version,&wsaData)){" O4 E) L  {9 ?, r+ O8 ]
      sprintf(szTmp,"Failed to intiailize socket,error no:%d",::WSAGetLastError());
" M6 \+ o' k2 l  O- ~- N      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);6 o7 j: E% v$ W* d
      DoError();
4 P0 q9 t3 e3 i/ R4 G+ n      return;
5 p  H" _0 D9 O& Z' F   }
" Z$ ~/ Q6 r9 P& L% Y}
3 T, b6 M3 c$ `- q+ G5 B+ a6 |void __fastcall TListenThread::CreateListenSocket()" c3 R6 V  c# i3 e
{( a. v' [3 c3 n0 O$ ]
   switch(m_Protocol)) m! i) y% J( f. t/ [) J9 Z
   {# R  e& y& |2 p# n
      case UDP:
8 h& b9 ?9 T3 i$ s         m_Socket=socket(AF_INET,SOCK_DGRAM,0);
% F4 b: z: {; p4 R3 C         break;
5 H6 b. Q& B$ S, R* G( \      case TCP:
+ g, o7 f' \" }- ?* Z9 n1 G7 }         m_Socket=socket(AF_INET,SOCK_STREAM,0);+ v( T5 v) H7 [. m
         break;. L2 k. C% x% m/ e, B" `
      default:' Y/ c' R- T7 B
         sprintf(szTmp,"Error protocol!");
* m% O* u" r; a# n4 U0 X8 O! e3 g         ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);
" v0 k8 o, Y% J5 @7 Z         DoError();+ y& W3 [" c4 i7 i
         break;
' b* d, v! t5 T  A' C! u/ b" ^* c   }, |, W0 S) s* B% ]9 z  z, K! N
   if(m_Socket==INVALID_SOCKET){
2 Z4 Y' V+ @7 q' T4 U9 v+ b      sprintf(szTmp,"Failed to create socket!");
5 u5 ]  x' O- X, D+ m      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);! Z" @; I* g0 n# @- j
      DoError();4 _* |  N$ I3 y5 m
      return;* t( i/ ]$ m( ^/ ^( v" [- J$ ~
   }2 O, c* R0 {3 M: T
}: l$ F6 T' @; A  J
void __fastcall TListenThread::SetListenSocket()
* w7 x: B# c0 c9 {, h# A{
- [- [+ I! K. Q( G$ u   server.sin_family=AF_INET;
# ]$ V7 w( k/ p. f3 I   server.sin_port=htons(m_Port);+ V2 i% `. W) \4 r5 D2 U; \
   server.sin_addr.S_un.S_addr=INADDR_ANY;
+ D& k4 y5 x# X) ?6 o/ Z   int NewOpenType=SO_SYNCHRONOUS_NONALERT;
8 d0 X0 K' S  ^, o7 O4 x0 X5 O   if(setsockopt(INVALID_SOCKET,SOL_SOCKET,SO_OPENTYPE,(char*)&NewOpenType,4)){
' V3 d& q8 x0 Q      sprintf(szTmp,"Set socket option error,error no:%d",::WSAGetLastError());
/ m4 O$ U* z9 @: T4 b      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);) e# W, b: i1 F( A
      DoError();' R# V/ s' Y) Z  w: T
      return;
5 e- E7 [, J5 k7 |4 _! V. s+ k   }
5 t! E1 W+ ~4 F# R' v( U}# _8 ]- L0 u1 N  c
void __fastcall TListenThread::BindListenSocket()/ p9 E- [1 d$ i: V- f
{0 t; Q% H; W2 l+ I! U2 {! w$ J
    if(bind(m_Socket,(sockaddr*)&server,sizeof(struct sockaddr_in))){
8 ~. m$ V) g) v! H8 g8 X      sprintf(szTmp,"Failed to bind socket,error no:%d",::WSAGetLastError());
0 W' R7 v) T: R* f$ m/ ^      ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);2 [$ G. C7 V9 \! r, ?
      DoError();1 ~) |- P; C& e: p! l
      return;
" [$ G, `5 O+ w9 A+ \   }
3 s! H1 h$ Q) g; Y) A. ^3 W
* Q+ q% T; _: M' b7 }}
6 i+ F4 t6 ?5 t& N' z" o: lvoid __fastcall TListenThread:istenSocket()! e7 T% j# C% }8 Q. w
{
8 I  R" F% G3 @+ \+ [+ h+ W( n; L  if(listen(m_Socket,SOMAXCONN)){0 H' n. y+ G. w( y
     sprintf(szTmp,"listen error,error no:%d",::WSAGetLastError());: ]8 d( \+ J8 O! W6 ^6 J
     ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);/ a2 \& m- j9 j7 J% N) [
     DoError();
' E3 D) M3 R  j0 A) A( c5 r     return;
/ G: j; o/ b! |& ?5 I1 e+ x# f: R  }1 I7 G* g! |: }; J4 @  B* J8 C
  //Determine whether there is any connection4 ~2 M8 [& q" X* E# `2 G4 t, R2 s
  FD_ZERO(&FDS);
( k2 i; u6 z7 ^, G- K+ G  FD_SET(m_Socket,&FDS);
- k/ Q3 J- Z2 e4 P# y% K! S3 x, @5 C}
  L( z9 ^5 r, Uvoid __fastcall TListenThread::Execute()
* R4 G$ O' B  I# e0 m: f{' o$ ]) B* L! b9 `7 ~" \
   char buf[4096];# v2 v4 Q# Z$ P# U# g
   struct sockaddr_in from; //for UDP2 w- q8 v/ P6 z" U) K" n8 \+ Z
   int nLen=sizeof(from),nSize=0;  //for UDP+ Z* x7 n6 B( s$ e' }/ |2 w' u
   InitSocket();3 @: p) n9 Q( H3 H. k
   CreateListenSocket();! n6 O0 x1 c4 X  k6 H
   SetListenSocket();
* j: h* V+ G  a9 W* I  _   BindListenSocket();. r+ J8 ]5 ]# v7 W9 M0 v; k
   if(m_Protocol==UDP){7 F. u- s0 S  w* r9 f/ ?
      while(!Terminated){$ d" p0 W8 ?. v  |& Z  u
         int nSize=recvfrom(m_Socket,buf,4096,0,(struct sockaddr*)&from,&nLen);
" ^: r: h* i6 ~  l         if(nSize>0){
# Z6 a& r* \5 P* {: ?            buf[nSize]='\0';
0 e8 v7 H3 ~" j            PSTNForm->Memo1->Lines->Add("Received Length:"+String(nSize));8 k1 _  i; O+ r  k  X8 B! g8 M+ ^, V% C
            PSTNForm->Memo1->Lines->Add("Received:"+StrPas(buf));( e4 Q4 u2 Q; Q- U9 k
            ::Sleep(100);
  a9 E7 F2 C9 f  n/ U3 w6 R            sendto(m_Socket,buf,nSize,0,(struct sockaddr*)&from,sizeof(struct sockaddr_in));6 H1 u& b4 z  ]8 i9 c
         }6 p; S8 l1 ~, N  f8 r) k4 Q
         else return;
2 e+ |$ M5 |: S; Y- g5 H; Q  Y' {" S7 n0 z2 M
      }4 B6 G" {* t0 M5 I3 K$ N& C* `
   }, x: B  O8 h4 v$ h9 i) P
   ListenSocket();
  T9 K6 @8 H& {, j$ _- q  E   struct sockaddr_in client;
2 s1 {8 F3 q; }7 M   int nLength=sizeof(struct sockaddr_in);
( O5 W$ _# B* U; Q* r   while(!Terminated){
; ^) ?) D$ E, V) |' |6 u# m      int nError=select(1,&FDS,0,0,0);
9 w; x. h0 ^$ X5 r, @/ W+ M      if(nError<=0) Terminate();7 e! X# A8 l' L, R8 f2 n
      SOCKET m_AcceptSocket=accept(m_Socket,(struct sockaddr*)&client,&nLength);& g; M3 S& o, Q9 Z; ?' A
      if(m_AcceptSocket==INVALID_SOCKET){
9 }# y& H3 K6 L* v  s: i/ q  x         sprintf(szTmp,"Failed to execute accept,error no:%d",::WSAGetLastError());3 x3 a% ^+ I) t% I( y  J! u
         ::MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR);
0 x7 z( D3 D" i. R5 ~& Z# x         DoError();2 F: K% O  T# S& N9 ~0 l2 E
         Terminate();. M3 ~% g) @$ Q: I
         return;3 [" m, H4 W" K! F9 e) o
      }4 U2 L- X# l% J) l% a
      TCommunication *pCThread=new TCommunication(m_AcceptSocket,FALSE);5 h! S# B6 [: B" H; K5 k! ~; C
      pCThread->Terminate();
! M7 e9 ?! R- x; a& [, p, [6 z  V      pCThread->WaitFor();
; T, E1 M" d. X6 T   }
# [8 V/ i/ `/ e- o  P* z' @0 \}
) W+ C( t! h) M6 f, Y/ E//************************PSTNForm*********************************************//
% X  L4 v5 B9 s9 N, _# i7 z__fastcall TPSTNForm::TPSTNForm(TComponent* Owner)2 p, i# ]! u. w& B: U' |
   : TForm(Owner)
( Z7 x) d0 _& v! i+ C' \' M( ]{5 \  A# \  C) Z" \1 e2 j, i
}
, [$ H3 W+ X+ P: gvoid __fastcall TPSTNForm::Button1Click(TObject *Sender)# K! m4 R2 R- Q! g7 h& P7 r
{
: D7 W+ {" r; J5 U# w   Close();
4 h* n8 @( J7 d; h* k" h}
8 s) s5 d  h3 M) Hvoid __fastcall TPSTNForm::Button2Click(TObject *Sender); M- ~% R+ g% W0 y& _2 w% \
{' Q% a; a* |6 Z1 t# |- T
   if(pThread){
; N0 c* V- B( @      pThread->Suspend();$ y, d9 G4 S( q) e; C
      pThread->Terminate();
$ C( V$ |% V+ u/ T: Z      delete pThread;% r0 a- v6 @3 ]; T$ ?
      pThread=0;6 a  ^0 ]7 w# s5 s
   }5 {5 D* e/ z+ L: A4 _
   UINT m_Port;( _+ O  q4 ?: |1 U, t5 a: |' v
   try
! n' D% s8 v: M   {
- e$ I( A6 s- `4 P      m_Port=Port->Text.ToInt();' c" @" K0 p! u$ Q2 c5 H
   }1 t0 \& B# U& q6 Z' K% Q$ ~: \
   catch(Exception &e): g# R; N/ ~4 H
   {
3 H3 c7 B7 s( l( p5 ]% S7 M      ::MessageBox(0,e.Message.c_str(),"Error",MB_OK+MB_ICONERROR);2 b6 A+ P- Z" r8 I* R: _9 y
      return;: x' V7 Y* @* ^; E" s/ }8 q# e# \( |
   }6 H$ x9 T- c& g7 T/ F7 ~
   PROTO m_Protocol;
' \- H# e; j) \. H' d. S   switch(Prot->ItemIndex)2 `/ o+ v6 O% x* M
   {+ B4 q- g1 Q' t, i/ g
      case 0:
0 r( M" z+ f5 Y4 h7 Y         m_Protocol=TCP;
6 m" ]: h) {' X         break;' F8 M' q7 y; a5 q$ @5 X/ Y
      case 1:, [3 ^( C# q& v( h5 Q
         m_Protocol=UDP;2 d+ m2 k" V& [' ~
         break;! ]# ~3 N( A( d% w
      default:0 }/ \* |/ e- s/ T) f# E
         break;
5 Q/ u% u( \3 W$ ?: M+ G1 r/ Q   }( I* z6 L7 F/ a. m0 k: O) J- B: a" \) {
   pThread=new TListenThread(m_Protocol,m_Port,FALSE);
9 G: s! T, C2 R: V# K   //pThread->Terminate();
% b+ v9 U) W3 @7 @1 S8 o}2 Y' W8 }. q% j
void __fastcall TPSTNForm::FormCreate(TObject *Sender)- _8 b& Z/ q1 X
{
0 L  G% `# ^6 c1 Y( b+ L   ::SendMessage(Prot->Handle,CB_SETCURSEL,0,1);
) E, I8 l( ]( F2 a7 ?}
5 b# ?3 O# |- w% z- F$ K0 H: r( h  H, j2 k# c2 X, K- P
void __fastcall TPSTNForm::FormDestroy(TObject *Sender)
7 e; q# _, |* C! ^{
9 z+ ^" i5 {" z. Q3 g& l   if(pThread){# m& P0 l. R  C/ f
      pThread->Suspend();4 L4 f7 Z3 M/ B2 E8 w; v. B
      pThread->Terminate();}
1 c4 N6 d1 E/ v  _0 C}
* ~5 G+ K( `$ @( C0 E$ B4 ?上面的代码,各位可根据自已的需要和针对自已的应用,在数据处理方面加以改进就可以了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-8-9 06:38 , Processed in 0.037328 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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