【网络编程】第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”);
}
相关文章
|
28天前
|
机器学习/深度学习 人工智能 算法
基于Python深度学习的眼疾识别系统实现~人工智能+卷积网络算法
眼疾识别系统,本系统使用Python作为主要开发语言,基于TensorFlow搭建卷积神经网络算法,并收集了4种常见的眼疾图像数据集(白内障、糖尿病性视网膜病变、青光眼和正常眼睛) 再使用通过搭建的算法模型对数据集进行训练得到一个识别精度较高的模型,然后保存为为本地h5格式文件。最后使用Django框架搭建了一个Web网页平台可视化操作界面,实现用户上传一张眼疾图片识别其名称。
90 4
基于Python深度学习的眼疾识别系统实现~人工智能+卷积网络算法
|
10天前
|
存储 算法 安全
控制局域网上网软件之 Python 字典树算法解析
控制局域网上网软件在现代网络管理中至关重要,用于控制设备的上网行为和访问权限。本文聚焦于字典树(Trie Tree)算法的应用,详细阐述其原理、优势及实现。通过字典树,软件能高效进行关键词匹配和过滤,提升系统性能。文中还提供了Python代码示例,展示了字典树在网址过滤和关键词屏蔽中的具体应用,为局域网的安全和管理提供有力支持。
40 17
|
28天前
|
机器学习/深度学习 数据采集 算法
基于GA遗传优化的CNN-GRU-SAM网络时间序列回归预测算法matlab仿真
本项目基于MATLAB2022a实现时间序列预测,采用CNN-GRU-SAM网络结构。卷积层提取局部特征,GRU层处理长期依赖,自注意力机制捕捉全局特征。完整代码含中文注释和操作视频,运行效果无水印展示。算法通过数据归一化、种群初始化、适应度计算、个体更新等步骤优化网络参数,最终输出预测结果。适用于金融市场、气象预报等领域。
基于GA遗传优化的CNN-GRU-SAM网络时间序列回归预测算法matlab仿真
|
27天前
|
运维 监控 算法
企业局域网监控软件中 Java 优先队列算法的核心优势
企业局域网监控软件是数字化时代企业网络安全与高效运营的基石,犹如一位洞察秋毫的卫士。通过Java实现的优先队列算法,它能依据事件优先级排序,确保关键网络事件如异常流量、数据泄露等被优先处理,保障系统稳定与安全。代码示例展示了如何定义网络事件类并使用PriorityQueue处理高优先级事件,尤其在面对疑似风险时迅速启动应急措施。这一核心技术助力企业在复杂网络环境中稳健前行,护航业务腾飞。
62 32
|
21天前
|
负载均衡 算法 安全
探秘:基于 C++ 的局域网电脑控制软件自适应指令分发算法
在现代企业信息化架构中,局域网电脑控制软件如同“指挥官”,通过自适应指令分发算法动态调整指令发送节奏与数据量,确保不同性能的终端设备高效运行。基于C++语言,利用套接字实现稳定连接和线程同步管理,结合实时状态反馈,优化指令分发策略,提升整体管控效率,保障网络稳定,助力数字化办公。
48 19
|
28天前
|
存储 监控 算法
局域网网络管控里 Node.js 红黑树算法的绝妙运用
在数字化办公中,局域网网络管控至关重要。红黑树作为一种自平衡二叉搜索树,凭借其高效的数据管理和平衡机制,在局域网设备状态管理中大放异彩。通过Node.js实现红黑树算法,可快速插入、查找和更新设备信息(如IP地址、带宽等),确保网络管理员实时监控和优化网络资源,提升局域网的稳定性和安全性。未来,随着技术融合,红黑树将在网络管控中持续进化,助力构建高效、安全的局域网络生态。
44 9
|
2月前
|
机器学习/深度学习 算法
基于遗传优化的双BP神经网络金融序列预测算法matlab仿真
本项目基于遗传优化的双BP神经网络实现金融序列预测,使用MATLAB2022A进行仿真。算法通过两个初始学习率不同的BP神经网络(e1, e2)协同工作,结合遗传算法优化,提高预测精度。实验展示了三个算法的误差对比结果,验证了该方法的有效性。
|
2月前
|
机器学习/深度学习 数据采集 算法
基于PSO粒子群优化的CNN-GRU-SAM网络时间序列回归预测算法matlab仿真
本项目展示了基于PSO优化的CNN-GRU-SAM网络在时间序列预测中的应用。算法通过卷积层、GRU层、自注意力机制层提取特征,结合粒子群优化提升预测准确性。完整程序运行效果无水印,提供Matlab2022a版本代码,含详细中文注释和操作视频。适用于金融市场、气象预报等领域,有效处理非线性数据,提高预测稳定性和效率。
|
2月前
|
算法 网络协议 Python
探秘Win11共享文件夹之Python网络通信算法实现
本文探讨了Win11共享文件夹背后的网络通信算法,重点介绍基于TCP的文件传输机制,并提供Python代码示例。Win11共享文件夹利用SMB协议实现局域网内的文件共享,通过TCP协议确保文件传输的完整性和可靠性。服务器端监听客户端连接请求,接收文件请求并分块发送文件内容;客户端则连接服务器、接收数据并保存为本地文件。文中通过Python代码详细展示了这一过程,帮助读者理解并优化文件共享系统。
|
1月前
|
传感器 算法
基于GA遗传优化的WSN网络最优节点部署算法matlab仿真
本项目基于遗传算法(GA)优化无线传感器网络(WSN)的节点部署,旨在通过最少的节点数量实现最大覆盖。使用MATLAB2022A进行仿真,展示了不同初始节点数量(15、25、40)下的优化结果。核心程序实现了最佳解获取、节点部署绘制及适应度变化曲线展示。遗传算法通过初始化、选择、交叉和变异步骤,逐步优化节点位置配置,最终达到最优覆盖率。