【网络编程】第2章(3) 客户软件的设计算法和实现技术

简介: 【网络编程】第2章(3) 客户软件的设计算法和实现技术

客户软件的设计算法和实现技术

现在开始进入进入客户-服务器编程的具体如何实现的环节了,这一板块更重要的是学习算法,而不是研究细节。掌握基本算法,掌握通信方式的选择策略,掌握使用套接字的技术


实现客户端有TCP和UDP两种算法


TCP客户端算法

1.找到期望与之通信的服务器的IP地址和协议端口号

第一步,要建立客户端和服务器的连接,肯定要找到服务器的ip地址

ip如果知道的话可以直接传递给程序,如果不知道ip地址,知道域名也行,先请求域名服务器,返回信息后拿到ip地址


假设 域名:merlin.cs.purue.edu 根据它获得IP地址

struct hostent *hptr;
  char *examplenam=“merlin.cs.purdue.edu”
  if( hptr=gethostbyname( examplenam )){
    /* IP address is now in hptr->h_addr */
  }else{
    /* error in name-handle it */
  }

第二步,找端口号也是一样的,可以直接传递数字端口,也能更具协议端口的名字请求端口服务器,获取端口的具体数字

若某个TCP客户需要查找SMTP的正式协议端口号,它便调getservbyname,如下例:

struct servent  *sptr;
  if (sptr=getservbyname(“smtp”,”tcp”)){ 
    /* port number is now in sptr->s_port */
  }else{
    /* error occurred-handle it   */
  };

同时,连接的时候也要指定协议,协议也具有协议名

例如查找UDP的正式协议号,可以调用getprotobyname

 struct protoent *pptr;
  if(pptr=getprotobuname(“udp”)){
        /* official protocol number is now in pptr->p_proto  */
  }else{
       /*  error occurred-handle it   */
  }

2.分配套接字


在套接字被使用前,创建该套接字的应用程序必须用其他系统调用把套接字数据结构中的信息填上

3.指明此连接需要在本地机器中的、任意的、未使用的协议端口,并允许TCP选择一个这样的端口

为什么不用指定本地ip地址?因为路由器或多接口主机拥有多个IP地址,这就有可能在选择转发接口时,选择了一个并不匹配的地址。套接字允许应用程序将本地地址字段放置不填,而允许TCP/IP软件在客户与某个服务器进行连接时自动选取本地IP地址


端口选择不冲突,非熟知的就行


4.将这个套接字连接到服务器

系统调用connect允许TCP套接字发起连接(完成三次握手)。连接成功返回0,否则返回1

retcode = connect( s, remaddr, remaddrlen )

s是套接字描述符,remaddr是一个sockaddr_in类型的结构的地址,remaddrlen是第二个参数的长度

5. 使用应用级协议与服务器通信(在此,往往包含发送请求和等待应答)

bptr = buf;
  buflen = BLEN;
  /* send request   */
  send( s, req, strlen( req), 0);
  /* read response (may come in many pieces)  */
  while ( ( n = recv( s, bptr, buflen, 0 ) )>0 ){
    bptr += n;
    buflen -=n;
  }

客户端重复调用recv是必须的,因为,TCP不是面向块的(block-oriented)而是面向流的(stream-oriented)协议:它保证传递发送者所发出的字节序列,但是并不保证按照这些字节所写入时的组传送。另一途径是,TCP可能在发送报文段之前,要在其缓存中积累许多的字节(例如,为了填满一个数据报)


客户端接收数据的不确定性是TCP编程的一个基本概念


6.关闭连接

客户在发送最后一个请求后,发起部分(发送请求)关闭;服务器在发送完最后一个响应后在关闭整个连接。


UDP客户端编程

UDP有两种模式:连接的、非连接的


使用连接模式,客户使用connect调用指明远程端点的地址。不用每次重复指明远程地址就可以发送和接受报文

使用非连接的模式,客户并不把套接字连接到一个指定远程端点上,而是在每次发送报文时指明远程目的地

过程:


1.找到期望与之通信的服务器的IP地址和协议端口号分配套接字

2.指明这种通信需要本地机器中的、任意的、未使用的协议端口,并允许UDP选择一个这样的端口

3.指明报文所要发往的服务器

4.使用应用级协议与服务器通信(在此,往往包含发送请求和等待应答)

5.终止通信,删除套接字

UDP编程算法和TCP类似,与TCP不同的是,UDP提供了报文传送。客户每次到用send,UDP便向服务器发送一个报文,每次调用recv都返回一个完整的报文


如果要在internet中很好的工作,UDP的客户必须实现超时和重传来保证可靠性


过程库

为使编程时间尽量减少,程序员可以一次编写代码,将其置于某个过程之中,然后,只是简单地在各个客户程序中调用这个过程就行了


比如说:

int connectsock(const char *host, const char *service, const char *transport);
int connectTCP(const char *host, const char *service)
{
  return connectsock( host, service, “tcp”);
}
int connetUDP(const char *host, const char *service)
{
    return connectsock( host, service, “udp”);
}
相关文章
|
2天前
|
运维 监控 算法
解读 C++ 助力的局域网监控电脑网络连接算法
本文探讨了使用C++语言实现局域网监控电脑中网络连接监控的算法。通过将局域网的拓扑结构建模为图(Graph)数据结构,每台电脑作为顶点,网络连接作为边,可高效管理与监控动态变化的网络连接。文章展示了基于深度优先搜索(DFS)的连通性检测算法,用于判断两节点间是否存在路径,助力故障排查与流量优化。C++的高效性能结合图算法,为保障网络秩序与信息安全提供了坚实基础,未来可进一步优化以应对无线网络等新挑战。
|
5天前
|
机器学习/深度学习 存储 算法
基于MobileNet深度学习网络的活体人脸识别检测算法matlab仿真
本内容主要介绍一种基于MobileNet深度学习网络的活体人脸识别检测技术及MQAM调制类型识别方法。完整程序运行效果无水印,需使用Matlab2022a版本。核心代码包含详细中文注释与操作视频。理论概述中提到,传统人脸识别易受非活体攻击影响,而MobileNet通过轻量化的深度可分离卷积结构,在保证准确性的同时提升检测效率。活体人脸与非活体在纹理和光照上存在显著差异,MobileNet可有效提取人脸高级特征,为无线通信领域提供先进的调制类型识别方案。
|
14天前
|
机器学习/深度学习 数据采集 算法
基于PSO粒子群优化的CNN-LSTM-SAM网络时间序列回归预测算法matlab仿真
本项目展示了基于PSO优化的CNN-LSTM-SAM网络时间序列预测算法。使用Matlab2022a开发,完整代码含中文注释及操作视频。算法结合卷积层提取局部特征、LSTM处理长期依赖、自注意力机制捕捉全局特征,通过粒子群优化提升预测精度。适用于金融市场、气象预报等领域,提供高效准确的预测结果。
|
5天前
|
JavaScript 算法 前端开发
JS数组操作方法全景图,全网最全构建完整知识网络!js数组操作方法全集(实现筛选转换、随机排序洗牌算法、复杂数据处理统计等情景详解,附大量源码和易错点解析)
这些方法提供了对数组的全面操作,包括搜索、遍历、转换和聚合等。通过分为原地操作方法、非原地操作方法和其他方法便于您理解和记忆,并熟悉他们各自的使用方法与使用范围。详细的案例与进阶使用,方便您理解数组操作的底层原理。链式调用的几个案例,让您玩转数组操作。 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
|
13天前
|
监控 算法 安全
公司电脑网络监控场景下 Python 广度优先搜索算法的深度剖析
在数字化办公时代,公司电脑网络监控至关重要。广度优先搜索(BFS)算法在构建网络拓扑、检测安全威胁和优化资源分配方面发挥重要作用。通过Python代码示例展示其应用流程,助力企业提升网络安全与效率。未来,更多创新算法将融入该领域,保障企业数字化发展。
37 10
|
16天前
|
缓存 监控 算法
基于 C# 网络套接字算法的局域网实时监控技术探究
在数字化办公与网络安全需求增长的背景下,局域网实时监控成为企业管理和安全防护的关键。本文介绍C#网络套接字算法在局域网实时监控中的应用,涵盖套接字创建、绑定监听、连接建立和数据传输等操作,并通过代码示例展示其实现方式。服务端和客户端通过套接字进行屏幕截图等数据的实时传输,保障网络稳定与信息安全。同时,文章探讨了算法的优缺点及优化方向,如异步编程、数据压缩与缓存、错误处理与重传机制,以提升系统性能。
37 2
|
19天前
|
监控 安全 网络安全
静态长效代理IP的技术创新与网络安全体现在哪些方面?
随着数字化发展,网络安全和隐私保护成为核心需求。静态长效代理IP通过智能路由、动态IP池管理、加密技术、负载均衡及API集成等创新,提升数据传输速度与安全性。它在信息安全保护、访问控制、数据传输保护及网络监控等方面发挥重要作用,为各行业提供高效、安全的网络解决方案,应用前景广阔。
38 5
|
5天前
|
机器学习/深度学习 数据采集 算法
基于yolov2和googlenet网络的疲劳驾驶检测算法matlab仿真
本内容展示了基于深度学习的疲劳驾驶检测算法,包括算法运行效果预览(无水印)、Matlab 2022a 软件版本说明、部分核心程序(完整版含中文注释与操作视频)。理论部分详细阐述了疲劳检测原理,通过对比疲劳与正常状态下的特征差异,结合深度学习模型提取驾驶员面部特征变化。具体流程包括数据收集、预处理、模型训练与评估,使用数学公式描述损失函数和推理过程。课题基于 YOLOv2 和 GoogleNet,先用 YOLOv2 定位驾驶员面部区域,再由 GoogleNet 分析特征判断疲劳状态,提供高准确率与鲁棒性的检测方法。
|
10天前
|
机器学习/深度学习 算法 数据安全/隐私保护
基于生物地理算法的MLP多层感知机优化matlab仿真
本程序基于生物地理算法(BBO)优化MLP多层感知机,通过MATLAB2022A实现随机数据点的趋势预测,并输出优化收敛曲线。BBO模拟物种在地理空间上的迁移、竞争与适应过程,以优化MLP的权重和偏置参数,提升预测性能。完整程序无水印,适用于机器学习和数据预测任务。
|
20小时前
|
算法 数据安全/隐私保护
基于GA遗传算法的拱桥静载试验车辆最优布载matlab仿真
本程序基于遗传算法(GA)实现拱桥静载试验车辆最优布载的MATLAB仿真,旨在自动化确定车辆位置以满足加载效率要求(0.95≤ηq≤1.05),目标是使ηq尽量接近1,同时减少车辆数量和布载耗时。程序在MATLAB 2022A版本下运行,展示了工况1至工况3的测试结果。通过优化模型,综合考虑车辆重量、位置、类型及车道占用等因素,确保桥梁关键部位承受最大荷载,从而有效评估桥梁性能。核心代码实现了迭代优化过程,并输出最优布载方案及相关参数。

热门文章

最新文章