Delphi Socket编程的基本概念

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

端口
• Port是个整数,范围是1~65535 • 端口就像分机号 • 1024以下端口号是保留的,用作已知的公 用协议,如HTTP=80,FTP=21,POP3=110, SMTP=25等等
• 服务器要接受入站的请求,就必须监听一 个端口,客户端要和服务器通信,就要提 供IP地址和端口
协议
• 协议包含两个事情
线程非阻塞设计
• 利用线程,该线程可以接受Socket数据,对 Socket数据进行分析
• 线程关联一个窗口句柄,该窗口句柄可以 使主程序窗口,也可以是特定的窗口 • 在线程Execute中,可以SendMessage消息给 主程序,主程序对消息处理之后返回,也 可以利用PostMessage。
消息和线程实现的主框架
– 需要TCP/IP驱动和协议 栈支持 – 本质是底层的心跳包
procedure TdmProvider.IdServerConnect(AThread: TIdPeerThread); type TCP_KeepAlive = record OnOff: Cardinal; KeepAliveTime: Cardinal; KeepAliveInterval: Cardinal end; var Val: TCP_KeepAlive; Ret: Cardinal; begin /// TCP/IP 连接的自动超时检测心跳设置 Val.OnOff:=1; Val.KeepAliveTime := 60000; /// 60 秒钟如果还没有任何流 量就断开 Val.KeepAliveInterval := 10000; /// 每隔多久发送心跳包 WSAIoctl(AThread.Connection.Socket.Binding.Handle, IOC_IN or IOC_VENDOR or 4, @Val, SizeOf(Val), nil, 0, @Ret, nil, nil); with AThread.Connection.Socket.Binding do WriteLog(mtInfo, '客户端连接:' + PeerIP + ':' + IntToStr(PeerPort)); end;
Const CM_A = WM_USER + 1; CM_B = WM_USER + 2; …… WndProc(msg: DWORD, wParam, lParam: DWORD); Begin case Msg of CM_A: ;// 数据包a处理UI更新 CM_B: ;// 数据包b处理UI更新 …… end; End; Thread Execute Begin while 程序未终止 or Socket 未断 开 do begin 从Socket接收数据; case 数据 of a : SendMessage(CM_A, Integer(数据), 0); b : SendMssage(CM_B, Integer(数据), 0); …… end; End;
大头小头
• Big-endian,大头
地址(大头) 数据(0x1234) 0001 1 0002 2 0003 3 0004 4
– Unix ,Motorola – 最直观:不考虑对应关系,只要把内存地址从左到右 按照由低到高的顺序写出,把值按照通常的高位到低 位的顺序写出,两者对照,一个字节一个字节的填充 – 地址低位存储值的高位,地址高位存储值的低位
• Little-endian,小头
地址(小头) 数据(0x1234)
0001 4
0002 3
0003 2
0004 1
– Windows,Intel架构 – 最符合人的思维:低位值小就应放在地址小的地方 – 地址低位存储值的低位,地址高位存储值的高位
大小头转换
• 转换函数:
– htons 把unsigned short类型从主机序转换到网 络序 – htonl 把unsigned long类型从主机序转换到网络 序 – ntohs 把unsigned short类型从网络序转换到主 机序 – ntohl 把unsigned long类型从网络序转换到主机 序
• 阻塞可能导致程序假死 • 阻塞模式优点:代码结构简单,适合简单的数据交互和 后台服务,缺点:UI交互困难,有假死现象 • 非阻塞模式优点:适合各种网络情况,用户体验较好, 缺点:代码结构复杂,编程要求高,逻辑复杂
死连接检测
• 心跳(推荐)
• 流量检测:从最后一 次收到数据开始计时 若干秒,没有收到任 何数据就算失败 • TCP Keep Alive
ห้องสมุดไป่ตู้
• DNS为域名解释,翻译域名为IP地址,DNS 服务器相当于一个地址本
socket
• Socket是组合了IP,端口和协议,Socket也 是一个连接两个处理进程的管道,可以是 本地的,也可以是远程的。 • Socket就像电路交换连接的会话 • 本地环回
字节序
• 主机序:不同的CPU、操作系统有不同的字 节序类型,字节序是指整数在内存中保存 的顺序 • 网络序:网络字节顺序是TCP/IP中规定好的 一种数据表示格式,它与具体的CPU类型、 操作系统等无关,从而可以保证数据在不 同主机之间传输时能够被正确解释。网络 字节顺序采用大头
– 如果连接服务器不成功,则不能立即重连服务器, 需要等待10s再重连,如果10s后还是失败,则需要 等待30s后重连,如果30s还失败,则需要等待3分 钟后重连,以此类推
Delphi Indy Socket 编程的基本概念
TCP/IP
• 传输控制协议和互联网协议,Transmission Control Protocol and Internet Protocol. • 通常所说的TCP/IP表示传输承载 • TCP/IP会控制传输质量,这是最大的优势:
– 保证数据包到达的顺序 – 保证数据包不丢包,可靠到达对方 – 自动重传机制 – MTU概念:以太网默认1500Byte – 端口(PORT)概念
– 端口号,端口类型(TCP,UDP,ICMP) – 高级命令格式(例如HTTP,FTP,……)
• 协议可以自定义,一般公用协议是作为RFC 给出的,如HTTP就是RFC 2616. • 公用协议一般用文本方式
域名和DNS
• 域名是人类可阅读格式的“IP”地址
– 对人而言,容易阅读和记忆 – 对机器而言,可以随时更换IP而不用更改配置 – 域名和IP没有一一对应的关系,但一个域名在 某一地点的某一时刻一定只能解释为一个IP
网络编程注意事项
• 一定要检测连接状态,或者在协议上增加心跳 • 超时检测应该是按照最后接收的时间开始计时, 多久没有收到数据包才超时,而不是从开始发 送数据包就进行计时 • 服务器端需要做Idle检测,防止空连接占用资 源或者被人恶意攻击 • 网络断开之后的重连机制一定要缓冲:即如果 断开后无法正常重连,那么下一次重连的时间 应该成倍延长:典型案例为暴风影音,例如
• 请问:字符串,数组等需要转换吗?
Indy特点
• • • • 阻塞模式 线程模式 序列化串行 类似操作文件方式
阻塞和假死?
• 阻塞:如果没有用重叠I/O或者用线程来运行,直接调 用Socket的相关API,会一直等待对方的操作完成才能继 续做其他的事情 • 非阻塞模式
– 重叠I/O:调用的时候一样调用Socket API,但是给定重叠I/O 标记,调用后可以继续运行,但是后续代码不能认为数据是 完整可用的,重叠I/O需要对I/O操作的结果做检测 – 线程:用独立线程去掉用Socket API
Client/Server
• C/S概念,客户端/服务器 • 请求应答模式,Request/Response • Client = 主叫,Server = 被叫,Server更像一个语音 呼叫中心,可以接受很多呼叫 • IP address:32bit的整数,但一般表示成可阅读的 格式,如192.168.1.1,即四个Byte分别隔开,每个 Byte范围是0~255,IP地址就像电话号码 • 一个服务器可以有多个IP地址,称之为MultiHomed
相关文档
最新文档