【网络编程】第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”);
}
相关文章
|
6月前
|
存储 监控 算法
防止员工泄密软件中文件访问日志管理的 Go 语言 B + 树算法
B+树凭借高效范围查询与稳定插入删除性能,为防止员工泄密软件提供高响应、可追溯的日志管理方案,显著提升海量文件操作日志的存储与检索效率。
198 2
|
7月前
|
人工智能 云栖大会 调度
「2025云栖大会」“简单易用的智能云网络,加速客户AI创新”专场分论坛诚邀莅临
”简单易用的智能云网络,加速客户AI创新“专场分论坛将于9月24日13:30-17:00在云栖小镇D1-5号馆举办,本场技术分论坛将发布多项云网络创新成果,深度揭秘支撑AI时代的超低时延、自适应调度与跨域协同核心技术。同时来自领先企业的技术先锋将首次公开其在模型训练、企业出海等高复杂场景中的突破性实践,展现如何通过下一代云网络实现算力效率跃升与成本重构,定义AI时代网络新范式。
252 4
|
6月前
|
存储 监控 算法
电脑管控软件的进程优先级调度:Node.js 红黑树算法
红黑树凭借O(log n)高效插入、删除与查询特性,适配电脑管控软件对进程优先级动态调度的高并发需求。其自平衡机制保障系统稳定,低内存占用满足轻量化部署,显著优于传统数组或链表方案,是实现关键进程资源优先分配的理想选择。
320 1
|
6月前
|
存储 机器学习/深度学习 监控
网络管理监控软件的 C# 区间树性能阈值查询算法
针对网络管理监控软件的高效区间查询需求,本文提出基于区间树的优化方案。传统线性遍历效率低,10万条数据查询超800ms,难以满足实时性要求。区间树以平衡二叉搜索树结构,结合节点最大值剪枝策略,将查询复杂度从O(N)降至O(logN+K),显著提升性能。通过C#实现,支持按指标类型分组建树、增量插入与多维度联合查询,在10万记录下查询耗时仅约2.8ms,内存占用降低35%。测试表明,该方案有效解决高负载场景下的响应延迟问题,助力管理员快速定位异常设备,提升运维效率与系统稳定性。
307 4
|
7月前
|
运维 监控 JavaScript
基于 Node.js 图结构的局域网设备拓扑分析算法在局域网内监控软件中的应用研究
本文探讨图结构在局域网监控系统中的应用,通过Node.js实现设备拓扑建模、路径分析与故障定位,提升网络可视化、可追溯性与运维效率,结合模拟实验验证其高效性与准确性。
410 3
|
6月前
|
机器学习/深度学习 人工智能 监控
上海拔俗AI软件定制:让技术真正为你所用,拔俗网络这样做
在上海,企业正通过AI软件定制破解通用化难题。该模式以业务场景为核心,量身打造智能解决方案,涵盖场景化模型开发、模块化架构设计与数据闭环优化三大技术维度,推动技术与业务深度融合,助力企业实现高效、可持续的数字化转型。
225 0
|
6月前
|
存储 运维 监控
局域网网络监控软件的设备连接日志哈希表 C++ 语言算法
针对局域网监控软件日志查询效率低的问题,采用哈希表优化设备连接日志管理。通过IP哈希映射实现O(1)级增删查操作,结合链地址法解决冲突,显著提升500+设备环境下的实时处理性能,内存占用低且易于扩展,有效支撑高并发日志操作。
496 0
|
监控 数据可视化 Linux
Cisco Nexus Dashboard 4.1(1g) 发布 - 云和数据中心网络管理软件
Cisco Nexus Dashboard 4.1(1g) - 云和数据中心网络管理软件
283 0
|
7月前
|
监控 前端开发 安全
Netty 高性能网络编程框架技术详解与实践指南
本文档全面介绍 Netty 高性能网络编程框架的核心概念、架构设计和实践应用。作为 Java 领域最优秀的 NIO 框架之一,Netty 提供了异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端。本文将深入探讨其 Reactor 模型、ChannelPipeline、编解码器、内存管理等核心机制,帮助开发者构建高性能的网络应用系统。
501 0
|
6月前
|
机器学习/深度学习 算法 机器人
【水下图像增强融合算法】基于融合的水下图像与视频增强研究(Matlab代码实现)
【水下图像增强融合算法】基于融合的水下图像与视频增强研究(Matlab代码实现)
600 0

热门文章

最新文章

下一篇
开通oss服务