版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、看完sockcomp.pas后,我决定用socket api来写一个客户端和服务器并且同时支持TCP,UDP协议,于是我就去做,现将代码贴出来(已调试通过) Socket api Client: #ifndef UDPClientH #define UDPClientH #include <Classes.hpp> #include <Controls.hpp> #include <StdCtrls.hpp> #include <Forms.hpp> #include <stdio.h> #include "CCEdit.h
2、" #define WM_SOCK WM_USER+100 class TLANForm : public TForm _published: / IDE-managed Components TEdit *Port; TLabel *Label1; TLabel *Label2; TComboBox *Prot; TButton *Button1; TLabel *Label3; TEdit *Addr; TCCEdit *TxtEdit; void _fastcall FormCreate(TObject *Sender); void _fastcall Button1Click
3、(TObject *Sender); void _fastcall FormDestroy(TObject *Sender); private: / User declarations void _fastcall OnRecv(TMessage &Message); public: / User declarations _fastcall TLANForm(TComponent* Owner); BEGIN_MESSAGE_MAP VCL_MESSAGE_HANDLER(WM_SOCK,TMessage,OnRecv); END_MESSAGE_MAP(TForm); ; exte
4、rn PACKAGE TLANForm *LANForm; #endif .cpp File #include <vcl.h> #pragma hdrstop #include "UDPClient.h" #include "WinSock.h" #pragma package(smart_init) #pragma link "CCEdit" #pragma resource "*.dfm" TLANForm *LANForm; enum PROTO TCP=0,UDP=1; SOCKET m_Soc
5、ket=INVALID_SOCKET; PROTO m_Protocol=TCP; _fastcall TLANForm:TLANForm(TComponent* Owner) : TForm(Owner) void _fastcall TLANForm:FormCreate(TObject *Sender) :SendMessage(Prot->Handle,CB_SETCURSEL,0,0); void _fastcall TLANForm:OnRecv(TMessage &Message) char buf4096; int nLen; struct sockaddr_in
6、 from; int nLength=sizeof(struct sockaddr_in); switch(WSAGETSELECTEVENT(Message.LParam) case FD_READ: switch(m_Protocol) case TCP: nLen=recv(m_Socket,buf,4096,0); if(nLen>0) bufnLen='0' TxtEdit->Text="Received Length:"+String(nLen)+"rn"+StrPas(buf); break; case UDP:
7、 nLen=recvfrom(m_Socket,buf,4096,0,(struct sockaddr*)&from,&nLength); if(nLen>0) bufnLen='0' TxtEdit->Text="Received Length:"+String(nLen)+"rn"+StrPas(buf); break; break; case FD_CLOSE: closesocket(m_Socket); break; void _fastcall TLANForm:Button1Click(TObje
8、ct *Sender) char szTmp256,buf4096; int nSize=0; UINT m_Port; AnsiString addr; addr=Addr->Text.Trim(); if(addr.IsEmpty() :MessageBox(0,"Please enter the server IP!","Error",MB_OK+MB_ICONERROR); return; unsigned long nAddr=inet_addr(addr.c_str(); if(nAddr=INADDR_NONE) :MessageBo
9、x(0,"Bad Internet IP!","Error",MB_OK+MB_ICONERROR); return; try m_Port=Port->Text. ToInt(); catch(Exception &e) :MessageBox(0,e.Message.c_str(),"Error",MB_OK+MB_ICONERROR); return; switch(Prot->ItemIndex) case 0: m_Protocol=TCP; break; case 1: m_Protocol=UDP;
10、break; if(TxtEdit->Text.IsEmpty() :MessageBox(0,"Please enter the text you want to send!","Error",MB_OK+MB_ICONERROR); return; file:/Initialize Winsocket WSAData wsaData; :ZeroMemory(&wsaData,sizeof(WSAData); WORD version=MAKEWORD(2,0); if(:WSAStartup(version,&wsaData)
11、 sprintf(szTmp,"Failed to initial winsock enviroment!,error no:%d",:WSAGetLastError(); return; file:/Obtain the active connection char ComputerName255; gethostname(ComputerName,255); struct hostent* he=gethostbyname(ComputerName); if(!he) sprintf(szTmp,"Failed to get information to ho
12、st!","Error",MB_OK+MB_ICONERROR); :WSACleanup(); return; file:/create new socket m_Socket=INVALID_SOCKET; switch(m_Protocol) case TCP: m_Socket=socket(AF_INET,SOCK_STREAM,0); break; case UDP: m_Socket=socket(AF_INET,SOCK_DGRAM,0); break; if(m_Socket=INVALID_SOCKET) sprintf(szTmp,"
13、;Failed to create a new socket!,error no:%d",:WSAGetLastError(); :MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR); :WSACleanup(); return; file:/bind socket struct sockaddr_in client; unsigned long nClient; memcpy(&nClient,he->h_addr_list0,sizeof(int); if(nClient=INADDR_NONE) spr
14、intf(szTmp,"Failed to obtain the local machine's IP!","Error",MB_OK+MB_ICONERROR); :MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR); closesocket(m_Socket); :WSACleanup(); return; client.sin_family=AF_INET; client.sin_port=0; client.sin_addr.S_un.S_addr=(int)nClient;
15、if(bind(m_Socket,(struct sockaddr*)&client,sizeof(struct sockaddr) sprintf(szTmp,"Failed to bind socket!","Error",MB_OK+MB_ICONERROR); closesocket(m_Socket); :WSACleanup(); return; file:/connect socket struct sockaddr_in To; To.sin_family=AF_INET; To.sin_port=htons(m_Port); T
16、o.sin_addr.S_un.S_addr=(int)nAddr; fd_set FDSET; FD_ZERO(&FDSET); FD_SET(m_Socket,&FDSET); if(m_Protocol=TCP) if(connect(m_Socket,(struct sockaddr*)&To,sizeof(struct sockaddr) sprintf(szTmp,"Failed to connect the object!,error no:%d",:WSAGetLastError(); :MessageBox(0,szTmp,&quo
17、t;Error",MB_OK+MB_ICONERROR); closesocket(m_Socket); :WSACleanup(); return; int nError=select(1,0,&FDSET,0,0); if(nError<=0) sprintf(szTmp,"Failed to select socket!,error no:%d",:WSAGetLastError(); closesocket(m_Socket); :WSACleanup(); return; file:/Sen d data int nLen=TxtEdit-
18、>Text.Length(); if(nLen>4096) sprintf(szTmp,"The buffer is too size to send,it shoud not be more than 4096 bytes!"); :MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR); closesocket(m_Socket); :WSACleanup(); return; strncpy(buf,TxtEdit->Text.c_str(),nLen); switch(m_Protocol)
19、 case TCP: nSize=send(m_Socket,buf,nLen,0); file:/ShowMessage(nSize); break; case UDP: nSize=sendto(m_Socket,buf,nLen,0,(struct sockaddr*)&To,sizeof(struct sockaddr); file:/ShowMessage(nSize); break; if(:WSAAsyncSelect(m_Socket,Handle,WM_SOCK,FD_READ|FD_CLOSE) sprintf(szTmp,"Failed to regis
20、ter socket event!,error no:%d",:WSAGetLastError(); :MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR); closesocket(m_Socket); :WSACleanup(); return; void _fastcall TLANForm:FormDestroy(TObject *Sender) closesocket(m_Socket); :WSACleanup(); Socket api Server: .h File #ifndef UDPServerH #d
21、efine UDPServerH #include <Classes.hpp> #include <Controls.hpp> #include <StdCtrls.hpp> #include <Forms.hpp> #include <stdio.h> #include "WinSock.h" /*#define WM_SOCKET WM_USER+1000 #define INITSOCKETSUCCESS 0 #define INITSOCKETFAILURE 1 #define CREATELISTENSO
22、CKETSUCCESS 2 #define CREATELISTENSOCKETFAILURE 3 #define SETLISTENSOCKETSUCCESS 4 #define SETLISTENSOCKETFAILURE 5 #define BINDLISTENSOCKETSUCCESS 6 #define BINDLISTENSOCKETFAILURE 7 #define LISTENSOCKETSUCCESS 8 #define LISTENSOCKETFAILURE 9 #define ACCEPTSOCKETSUCCESS 10 #define ACCEPTSOCKETFAILU
23、RE 11 */ class TPSTNForm : public TForm _published: / IDE-managed Components TEdit *Port; TLabel *Label1; TMemo *Memo1; TButton *Button1; TButton *Button2; TLabel *Label2; TComboBox *Prot; void _fastcall Button1Click(TObject *Sender); void _fastcall Button2Click(TObject *Sender); void _fastcall Form
24、Create(TObject *Sender); void _fastcall FormDestroy(TObject *Sender); private: / User declarations public: / User declarations _fastcall TPSTNForm(TComponent* Owner); ; enum PROTO TCP,UDP; class TCommunication:public TThread file:/Communication Thread private: SOCKET m_AcceptSocket; char szTmp256;/E
25、RROR MESSAGE public: _fastcall TCommunication(SOCKET m_Socket,bool CreateSuspended); _fastcall TCommunication(); protected: virtual void _fastcall Execute(); ; class TListenThread:public TThread file:/Listen Thread private: WSAData wsaData; struct sockaddr_in server; fd_set FDS; UINT m_Port; PROTO m
26、_Protocol; char szTmp256;/Error Message public: SOCKET m_Socket; void _fastcall DoError(); void _fastcall InitSocket(); void _fastcall CreateListenSocket(); void _fastcall SetListenSocket(); void _fastcall BindListenSocket(); void _fastcall Liste nSocket(); public: _fastcall TListenThread(PROTO m_Pr
27、otocolA,UINT m_PortA,bool CreateSuspended); virtual _fastcall TListenThread(); protected: virtual void _fastcall Execute(); ; extern PACKAGE TPSTNForm *PSTNForm; #endif .cpp File #include <vcl.h> #pragma hdrstop #include "UDPServer.h" #pragma package(smart_init) #pragma resource &quo
28、t;*.dfm" TPSTNForm *PSTNForm; TListenThread *pThread=0; file:/*CLASS TCommunication For TCP* _fastcall TCommunication:TCommunication(SOCKET m_Socket,bool CreateSuspended):TThread(FALSE) m_AcceptSocket=m_Socket; szTmp0='0' FreeOnTerminate=true; _fastcall TCommunication:TCommunication() /
29、 closesocket(m_AcceptSocket); void _fastcall TCommunication:Execute() char buf4096; int nSize=0; nSize=recv(m_AcceptSocket,(char FAR*)buf,4096,0); if(nSize>0) bufnSize='0' file:/Display PSTNForm->Memo1->Lines->Add("Received Length:"+String(nSize); PSTNForm->Memo1->
30、;Lines->Add("Received:"+StrPas(buf); file:/Deliver :Sleep(100); send(m_AcceptSocket,buf,nSize,0); file:/*CLASS TListenThread* _fastcall TListenThread:TListenThread(PROTO m_ProtocolA,UINT m_PortA,bool CreateSuspended):TThread(FALSE) m_Socket=INVALID_SOCKET; m_Port=m_PortA; m_Protocol=m_P
31、rotocolA; szTmp0='0' :ZeroMemory(&wsaData,sizeof(WSAData); :ZeroMemory(&server,sizeof(struct sockaddr_in); FreeOnTerminate=TRUE;/Automatically delete while terminating. _fastcall TListenThread:TListenThread() closesocket(m_Socket); :WSACleanup(); m_Socket=INVALID_SOCKET; m_Port=0; m_
32、Protocol=TCP; szTmp0='0' :ZeroMemory(&wsaData,sizeof(WSAData); :ZeroMemory(&server,sizeof(struct sockaddr_in); void _fastcall TListenThread:DoError() if(m_Socket!=INVALID_SOCKET) closesocket(m_Socket); WSACleanup(); return; void _fastcall TListenThread:InitSocket() WORD version=MAKEW
33、ORD(2,0); if(:WSAStartup(version,&wsaData) sprintf(szTmp,"Failed to intiailize socket,error no:%d",:WSAGetLastError(); :MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR); DoError(); return; void _fastcall TListenThread:CreateListenSocket() switch(m_Protocol) case UDP: m_Socket=s
34、ocket(AF_INET,SOCK_DGRAM,0); break; case TCP: m_Socket=socket(AF_INET,SOCK_STREAM,0); break; default: sprintf(szTmp,"Error protocol!"); :MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR); DoError(); break; if(m_Socket=INVALID_SOCKET) sprintf(szTmp,"Failed to create socket!"
35、;); :MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR); D oError(); return; void _fastcall TListenThread:SetListenSocket() server.sin_family=AF_INET; server.sin_port=htons(m_Port); server.sin_addr.S_un.S_addr=INADDR_ANY; int NewOpenType=SO_SYNCHRONOUS_NONALERT; if(setsockopt(INVALID_SOCKET,SO
36、L_SOCKET,SO_OPENTYPE,(char*)&NewOpenType,4) sprintf(szTmp,"Set socket option error,error no:%d",:WSAGetLastError(); :MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR); DoError(); return; void _fastcall TListenThread:BindListenSocket() if(bind(m_Socket,(sockaddr*)&server,size
37、of(struct sockaddr_in) sprintf(szTmp,"Failed to bind socket,error no:%d",:WSAGetLastError(); :MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR); DoError(); return; void _fastcall TListenThread:ListenSocket() if(listen(m_Socket,SOMAXCONN) sprintf(szTmp,"listen error,error no:%d&
38、quot;,:WSAGetLastError(); :MessageBox(0,szTmp,"Error",MB_OK+MB_ICONERROR); DoError(); return; file:/Determine whether there is any connection FD_ZERO(&FDS); FD_SET(m_Socket,&FDS); void _fastcall TListenThread:Execute() char buf4096; struct sockaddr_in from; file:/for UDP int nLen=s
39、izeof(from),nSize=0; file:/for UDP InitSocket(); CreateListenSocket(); SetListenSocket(); BindListenSocket(); if(m_Protocol=UDP) while(!Terminated) int nSize=recvfrom(m_Socket,buf,4096,0,(struct sockaddr*)&from,&nLen); if(nSize>0) bufnSize='0' PSTNForm->Memo1->Lines->Add(
40、"Received Length:"+String(nSize); PSTNForm->Memo1->Lines->Add("Received:"+StrPas(buf); :Sleep(100); sendto(m_Socket,buf,nSize,0,(struct sockaddr*)&from,sizeof(struct sockaddr_in); else return; ListenSocket(); struct sockaddr_in client; int nLength=sizeof(struct sockaddr_in); while(!Terminated) int nError=select(1,&FDS,0,0,0); if(nError<=0) Terminate(); SOCKET m_AcceptSocket=accept(m_
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 新媒体内容创作提高粉丝粘性指导书
- 就新市场开拓策略的讨论函4篇范文
- 活字印刷技艺传承与创新成效评估表
- 产品退货处理流程信函(6篇)
- 跨部门合作流程商洽函8篇范文
- 环境保护公益项目设计策划指南
- 手工DIY项目实践手册
- 风险控制力考评表
- 软件项目开发与项目管理复合型人才整体绩效评定表
- 核对应收账款金额明细及账期确认函7篇范本
- DB52∕T 1715.1-2023 电动汽车充电基础设施规范第1部分:规划
- 解读慢性阻塞性肺病(GOLD)指南(2026)更新要点课件
- 光伏电站运行维护规程
- THIS001-2022红外热电堆传感器
- 外墙水包砂质保合同范本
- 肢体创伤后水肿管理指南解读
- 招标代理业务管理规范与操作指南
- 旅游直播培训课件
- T/CAPA 3-2021毛发移植规范
- 急诊治疗过程中的医患沟通技巧
- 旅游客车交通安全检查
评论
0/150
提交评论