IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 系统运维 -> 【网络编程】第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. 分配套接字

    image-20220309143512641

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

  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客户端编程

还没讲呢

如何写得不错就点个赞吧,欢迎来我的个人博客网站😊www.liangyuanshao.top

  系统运维 最新文章
配置小型公司网络WLAN基本业务(AC通过三层
如何在交付运维过程中建立风险底线意识,提
快速传输大文件,怎么通过网络传大文件给对
从游戏服务端角度分析移动同步(状态同步)
MySQL使用MyCat实现分库分表
如何用DWDM射频光纤技术实现200公里外的站点
国内顺畅下载k8s.gcr.io的镜像
自动化测试appium
ctfshow ssrf
Linux操作系统学习之实用指令(Centos7/8均
上一篇文章      下一篇文章      查看所有文章
加:2022-03-10 23:03:00  更:2022-03-10 23:04:33 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/16 3:37:39-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码