




已阅读5页,还剩6页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
unit UnitTCPUDP; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls,WinSock, ExtCtrls, ComCtrls,inifiles,StrUtils; const WM_SOCK = WM_USER + 82; 自定义 windows 消息 /在 tcp 服务器方式下,WM_SOCK 为监听消息 / WM_SOCK+1 到 WM_SOCK+MAX_ACCEPT 为与连接客户端进行通讯时的消息 MAX_ACCEPT=100; FD_SET= MAX_ACCEPT; type TFormTCPUDP = class(TForm) BtnSend: TButton; MemoReceive: TMemo; EditSend: TEdit; Label2: TLabel; Label3: TLabel; Bevel2: TBevel; STOpCode: TStaticText; STIndex: TStaticText; STCommand: TStaticText; GroupBox1: TGroupBox; GroupBox2: TGroupBox; GroupBox3: TGroupBox; RBTCP: TRadioButton; RBUDP: TRadioButton; Panel1: TPanel; RBClient: TRadioButton; RBServer: TRadioButton; GroupBox4: TGroupBox; BtnConnect: TButton; BtnClose: TButton; Bevel1: TBevel; StatusBar1: TStatusBar; PanelDest: TPanel; Label4: TLabel; EditRemoteHost: TEdit; Label5: TLabel; EditRemotePort: TEdit; Label6: TLabel; CmbSendTo: TComboBox; Label7: TLabel; PanelLocal: TPanel; ChkBind: TCheckBox; EditHostPort: TEdit; Label1: TLabel; procedure BtnSendClick(Sender: TObject); procedure BtnConnectClick(Sender: TObject); procedure RBTCPClick(Sender: TObject); procedure RBUDPClick(Sender: TObject); procedure BtnCloseClick(Sender: TObject); procedure FormClose(Sender: TObject; var Action: TCloseAction); procedure RBClientClick(Sender: TObject); procedure RBServerClick(Sender: TObject); procedure ChkBindClick(Sender: TObject); procedure FormCreate(Sender: TObject); procedure EditHostPortChange(Sender: TObject); procedure EditRemoteHostChange(Sender: TObject); procedure EditRemotePortChange(Sender: TObject); procedure FormActivate(Sender: TObject); procedure CmbSendToKeyPress(Sender: TObject; var Key: Char); 消息接送 private Private declarations FirstFlag:Boolean; INIPath:String; procedure ReadData(var Message: TMessage); function ReadTCPUDPIni():boolean; /读取配置信息 procedure WriteIniStr(FileName:String;section:string;Ident:string;StringValue:string);/写系统信息 procedure WriteIniBool(FileName:String;section:string;Ident:string;BoolValue:Boolean);/写系统信息 protected Protected declarations other fields and methods procedure wndproc(var message:Tmessage);override; public Public declarations end; const DATA_LENGTH =120; /数据长度 type TUDPaction = packed record opcode:byte; /操作码 index:word; /序列号 Command:byte; /命令字 data:array0(DATA_LENGTH-1) of char; /数据 end; var FormTCPUDP: TFormTCPUDP; AcceptSock:Array0MAX_ACCEPT OF Tsocket; FSockAccept : Array0MAX_ACCEPT OF TSockAddrIn; AcceptSockFlag: Array0MAX_ACCEPT OF boolean; AcceptNum:integer=0; FSockLocal : TSockAddrIn; PackageID:integer=0; /包序号 BindFlag:Boolean=true; TcpFlag:Boolean=false; ServerFlag:Boolean=false; function WinSockInital(Handle: HWnd):bool; Procedure WinSockClose(); implementation $R *.dfm 始化 SOCKET function WinSockInital(Handle: HWnd):bool; var TempWSAData: TWSAData; i:integer; begin result := false; 1 初始化 SOCKET if WSAStartup(2, TempWSAData)=1 then /2 表示启用 winsock2 exit; 若是用 UDP 通信,则用 if TcpFlag then AcceptSock0:=Socket(AF_INET,SOCK_STREAM,0) else AcceptSock0:=Socket(AF_INET,SOCK_DGRAM,0); if AcceptSock0=SOCKET_ERROR then exit; if (BindFlag and not tcpflag) or (Serverflag and tcpflag) then if bind(AcceptSock0,FSockLocal,sizeof(FSockLocal)0 then /等待连接队列的最大长度为 1 begin WinSockClose(); exit; end; end else if connect(AcceptSock0,FSockAccept0,sizeof(FSockAccept0)0 then begin i:=strtoint(MidStr(CmbSendTo.Text,8,i-8); sendto(AcceptSocki, SEND_PACKAGE,sizeof(SEND_PACKAGE), 0, FSockAccepti, sizeof(FSockAcc epti); end else Application.MessageBox(您没有选择发送方,错误提示,MB_OK); end; / sendto(AcceptSock0, NbtstatPacket,50, 0, FSockAccept0, sizeof(FSockAccept0); end; procedure TFormTCPUDP.BtnConnectClick(Sender: TObject); var s:String; i:integer; begin s:=正在建立连接; StatusBar1.Panels0.Text:=s; Application.ProcessMessages; FSockLocal.sin_family:=AF_INET; FSockLocal.sin_port:=htons(strtoint(EditHostport.Text); FSockAccept0.sin_family:=AF_INET; FSockAccept0.sin_port:=htons(strtoint(EditRemoteport.Text); FSockAccept0.SIn_Addr.S_addr := inet_addr(PChar(EditRemoteHost.Text);/inet_addr(pchar(IP); if WinSockInital(FormTCPUDP.Handle) then begin BtnConnect.Enabled:=false; BtnClose.Enabled:=true; BtnSend.Enabled:=true; s:=连接成功!; if ChkBind.Checked then s:=s+, -绑定端口; if RBTcp.Checked then begin s:=s+,-TCP 方式; if RBServer.Checked then s:=s+,-服务端 else s:=s+,-客户端; end else s:=s+,-UDP 方式; if tcpflag and Serverflag then begin AcceptNum:=0; CmbSendto.Clear; StatusBar1.Panels2.Text:=共有:+inttostr(AcceptNum)+个连接; end; end else begin for i:=0 to StatusBar1.Panels.count-1 do StatusBar1.Panelsi.Text:=; s:=创建套接字失败!; end; StatusBar1.Panels0.Text:=s; end; procedure TFormTCPUDP.wndproc(var Message: TMessage); begin if (Message.Msg=WM_SOCK) and (Message.Msg 0 then begin StatusBar1.Panels0.Text:=收到来自 ip 地址:+inet_ntoa(FSockAcceptIndex.sin_addr)+ 端口: +inttostr(ntohs(FSockAcceptIndex.sin_port)+的数据; StOpCode.Caption:= format(%.2d,Receive_PACKAGE.opCode); StIndex.Caption:= format(%d,Receive_PACKAGE.Index); StCommand.Caption:= format(%.2d,Receive_PACKAGE.Command); MemoReceive.Lines.Add(StrPas(Receive_PACKAGE.data) end; end else if Event=FD_ACCEPT then begin for i:=1 to MAX_ACCEPT DO if not AcceptSockFlagi then begin flen:=Sizeof(FSockAccepti); AcceptSocki:=accept(AcceptSock0,FSockAccepti,flen); WSAAsyncSelect(AcceptSocki, Handle , WM_SOCK+i, FD_READ or FD_CLOSE); AcceptSockFlagi:=true; AcceptNum:=AcceptNum+1; CmbSendto.Items.Add(套接口:+inttostr(i)+ 地址:+inet_ntoa(FSockAccepti.sin_addr)+ 端 口:+inttostr(ntohs(FSockAccepti.sin_port); break; end; StatusBar1.Panels2.Text:=共有:+inttostr(AcceptNum)+个连接; end else if Event=FD_CLOSE then begin WSAAsyncSelect(AcceptSockindex, FormTCPUDP.Handle, 0, 0); if index0 then begin for i:=0 to CmbSendto.Items.Count-1 do if CmbSendto.Items.Stringsi= 套接口:+inttostr(index)+ 地址: +inet_ntoa(FSockAcceptindex.sin_addr)+ 端口:+inttostr(ntohs(FSockAcceptindex.sin_port) then begin CmbSendto.Items.Delete(i); break; end; CloseSocket(AcceptSockindex); AcceptSockFlagindex:=false; AcceptNum:=AcceptNum-1; StatusBar1.Panels2.Text:=共有:+inttostr(AcceptNum)+个连接; end; end; end; procedure TFormTCPUDP.RBTCPClick(Sender: TObject); begin writeiniBool(INIPath+TCPUDP.ini,Setting,TCPStatus,true); RBServer.Enabled:=true; RBClient.Enabled:=true; if RBServer.Checked then begin PanelDest.Visible:=false; CmbSendto.Enabled:=true; end else begin PanelDest.Visible:=true; PanelLocal.Visible:=false; end; ChkBind.Enabled:=false; TcpFlag:=true; end; procedure TFormTCPUDP.RBUDPClick(Sender: TObject); begin writeiniBool(INIPath+TCPUDP.ini,Setting,TCPStatus,false); RBServer.Enabled:=false; RBClient.Enabled:=false; PanelDest.Visible:=true; TcpFlag:=false; ChkBind.Enabled:=true; CmbSendto.Enabled:=false; PanelLocal.Visible:=true; end; procedure TFormTCPUDP.BtnCloseClick(Sender: TObject); var i:integer; begin WinSockClose(); BtnConnect.Enabled:=true; BtnClose.Enabled:=false; BtnSend.Enabled:=false; CmbSendto.Clear; for i:=0 to StatusBar1.Panels.count-1 do StatusBar1.Panelsi.Text:=; Statusbar1.Panels0.Text:=已关闭套接字! ; end; procedure TFormTCPUDP.FormClose(Sender: TObject; var Action: TCloseAction); begin if BtnClose.Enabled then WinSockClose(); end; procedure TFormTCPUDP.RBClientClick(Sender: TObject); begin writeiniBool(INIPath+TCPUDP.ini,Setting,ServerStatus,false); ServerFlag:=false; PanelDest.Visible:=true; CmbSendto.Enabled:=false; if Tcpflag then PanelLocal.Visible:=false else PanelLocal.Visible:=true; end; procedure TFormTCPUDP.RBServerClick(Sender: TObject); begin writeiniBool(INIPath+TCPUDP.ini,Setting,ServerStatus,true); ServerFlag:=true; if Tcpflag then begin PanelDest.Visible:=false; CmbSendto.Enabled:=true; ChkBind.Enabled:=false; ChkBind.Checked:=true; end else ChkBind.Enabled:=true; PanelLocal.Visible:=true; end; procedure TFormTCPUDP.ChkBindClick(Sender: TObject); begin writeiniBool(INIPath+TCPUDP.ini,Setting,BindStatus,ChkBind.Checked);
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 仓库抽烟整改方案(3篇)
- 晚上光影照射讲解
- 绩效奖牌设计方案(3篇)
- 现代教育特点讲解
- 明确规划职责分工方案(3篇)
- 平行真空紫外技术
- 草坪基地立项方案(3篇)
- 企业病历书写规范化管理制度
- 体育赛事案例讲解
- 逆变升压电路技术解析
- 2025至2030年中国互联网数据中心应用行业市场深度评估及投资战略规划报告
- 八师兵团职工考试题库及答案
- 2025临时工合同协议书模板
- 2025年学习贯彻全国教育大会精神网络培训考试答案
- 推拿学基础题库及答案
- 水利工程档案验收项目法人自检工作报告
- 工资管理课件
- 电商客服培训 课件
- 2025社区治理一表通应用规范
- 中国古诗词歌曲课件
- GB/T 26148-2025高压水射流清洗作业安全规范
评论
0/150
提交评论