网络编程-流

本文介绍了网络编程中的流,包括流的概念、消息类型、流的组件如getmsg、putmsg、getpmsg和putpmsg函数以及TPI接口。流提供了全双工连接,允许动态添加或删除中间处理模块。同时,文章详细阐述了不同优先级的消息类型,并提及了TPI作为传输层和应用之间的接口。
摘要由CSDN通过智能技术生成

一、概貌

  1. 在进程和驱动程序(driver)之间提供全双工的连接,如下所示,虽然我们称底部那个方框为驱动程序,它却不必与某个硬件设备相关联,也就是说它可以是一个伪设备驱动程序(即软件驱动程序)

在这里插入图片描述
2. 流头由一些内核例程构成,应用进程针对流描述符执行系统调用(例如read、 putmsg、ioctl等)时这些内核例程将被激活。

  1. 进程可以在流头和驱动程序之间动态增加或删除中间处理模块,这些模块对顺褚一个流上行或下行的消息施行某种类型的过滤。如下所示:
    在这里插入图片描述
  2. 往一个流中可以推入任意数量的模块。我们说推入“意指每个新模块都被插入到流头的紧下方”。
    5.。多路复用器是一种特殊类型的伪设备驱动程序,从多个源接受数据。(SVR4中TCP/IP协议族基于流的实现图如下所示,包含多个多路复选器。)

在这里插入图片描述

  1. 在创建一个套接字时,套接字函数库把模块sockmod推入中。向应用进程提供套接字API的正是套接字函数库sockrnod流模块两者的组合。

  2. 在创建一个XTI端点时,XTI函数库模块timod推入中。向应用进程提供XTIAPI的正是XTI函数库timod流模块两者的组合。XTI API的端点相当于套接字API的套接字。

  3. 为了针对XTI端点使用read和write访间网络数据,通常必须把模块tirdwr推入流中。图中中间那个使用TCP的进程就是这么做的。推入该模块后XTI函数库中的函数不能继续使用,那个进程这么做也许已经放弃使用XTI,因此我们没给它标上XTI函数库。

  4. 所标的三个服务接口定义顺着流上行和下行交换的网络消息的格式。传输提供者接口TIP定义了向它上方的模块提供的接口。网络提供者接口NPI定义了网络提供者向它上方的模块提供的接口。DLPI数据链路层接口

一个流中的每个部件:流头所有处理模块驱动程序包含至少一对队列(queue):一个写队列和一个读队列,如下所示:

在这里插入图片描述

1.消息类型

  1. 流消息可划分为高优先级、优先级带和普通三类。优先级共有 256带,在0- 255之间取值,其中普通消息位于带0。流消息的优先级用于排队和流揽控制。按约定高优先级消息不受流量控制影响。

  2. 虽然流系统支持 256个不同的优先级带,网络协议往往只用代表经加速数据的带1和代表普通数据的带0。

  3. TPI不认为TCP带外数据是真正的经加速数据 ,事实上TCP的各通数据和带外数据都使用带0,只有那些让经加边数据(并不是像TCP中的紧急指针而已)先于普通数据发送的协议才使用带1发送经加速数据 。
    在这里插入图片描述
    普通优先级消息和高优先级消息两大类,它们却分别约有 12种和18种。有3种不同类型的消息: M_DATA、M_PROTO和M_PCPROTO (PC表示, 优先级控制,隐指高优先级消息)。下图 说明了这3种消息类型是如何使用write和putmsg这两个函数产生的。

在这里插入图片描述

二、getmsg和putmsg函数

//沿着流上行和下行的数据由消息构成,而且每个消息含有控制或数据亦或两者都有。
//如果在流上使用read和write。 那么所传送的仅仅是数据。
//下面两个函数提供进程能够读写数据和控制两部分信息
#include<stropts.h>
int getmsg(int fd,struct strbuf *ctlptr,struct strubf *dataptr,int *flagsp);
//最后一个参数是值-结果参数。
//flagsp指向的整数值为0 ,那么返回的是流中第一个消息(既可能是普通消息,也可能是高优先级消息)。
//该整数值为RS_HIPRI. 那就等待一个高优先级消息到达流头。
//无论哪种情况,存放到如flagsp指向的整数中的值根据所返回消息的类型或为0, 或为RS_HIPRI。
//传递给ctlptr和dataptr参数均为非空指针,如果没有控制信息待返回(也就是即将返回一 个M_ DATA 消息),就在返回时把ctlptr->lenn设置为-1作为指示。
//类似地如果没有数据待返回就把 dataptr->len设投为-1。


int putmsg(int fd,const struct struct strbuf *ctlptr,const struct struct strbuf *dataptr,int flags);
//可以发送控制信息和数据也可以同时发送两者。
//指示缺失控制信息把vtlptr参数指定空指针,也可以ctlptr->len设置为-1。
//同样手段设置dataptr参数用于指示缺失数据。
//flags:0表示普通消息,为RS_HIPRI表示高优先级消息。



struct strbuf{
   
	int maxlen;
	int len;
	char *buf;
};



//putmsg在成功时返回0 , 在出错时返回- 1。
//getmsg仅在整个消息完整返回给调用者时才返问0 。
//如果控制缓冲区不足以容纳完整的控制信息,那就返回非负的MORECTL。
//类似地如果数据缓冲区太小,那就返回MOREDATA 。
//如果两个缓冲区都太小,那就返回这两个标志的逻缉或。

缺失控制信息,putmsg将产生一个M_DATA信息,如下所示。否则根据flags产生一个M_PROTO或M_PCRROTO消息。

在这里插入图片描述

三、getpmsg和putpmsg函数

当对于不同优先级带的支持随 SVR 4 被增加到流系统时,以下两个g e tm sg和pu tm sg 的变体函数也被间时引入。

#include<stropts.h>
int getpmsg(int fd,struct strbuf *ctlptr,struct strubf *dataptr,int *bandp,int *flagsp);
//bandp和flagsp参数是值-结果参数。
//flagsp指向的整数可以取值MSG_HIPRI(以读入一 个高优先消息)、MSG_BAND (以读入 一个优先级至少为bandp指向的整数值的消息)或MSG_ANY(以读入任一消息)。
//函数返回时,bandp指向的整数含有所读入消息的优先级带。
//flagsp指向的整数含有MSG_HIPRI (如果所读入的是一个商优先级消息)或MSG_BAND (如果所读入的是其他类型消息)。

int putpmsg(int fd,const struct struct strbuf *ctlptr,const struct struct strbuf *dataptr,int band,int flags);
//band参数必须在0-255之间(含)。
//如果flags参数为MSG_BAND,那就产生一个所指定优先级带的消息。
//把flags设置为MSG_BAND并且把band设置设为0等效于调用putmsg。
//如果flags为MSG_HIPRI, ban就必须为0, 所产生的是 一个环优先级消息。(注意,putmsg使用不同名字的RS_HIPRI标志)。

四、ioctl函数

#include<stropts.h>
int ioctl(int fd,int request,.../*void *arg*/);
//处理流所必须包含的头文件不一样。

五、TPI:传输提供者接口

  1. TPI表示为传输层向它上方的模块提供的服务接口。在流环境中套接字和XTI都使用TPI。应用进程跟TCP和UD P交换TPI消息的是套接字函数库和sockmod的组合,或者是XTI函数库和tirnod的组合。

  2. TPI是一 个基于消息的接口。它定义了在应用进程 (例如XTI函数库或套接字函数库)和传输层之间沿看流上行和下行交换的消息,包括消息的格式和每个消息执行的操作。

  3. 实例中,应用进程向提供者发出 一 个请求 ( “捆绑这个本地地址"), 提供者则发回一个响应(“成功 ” 或 “出错”)。一些事件在提供者异步地发生 (对某个服务器的连接请求的到达),它们导致沿着流向上发送的消息或信号。我们可以绕过XTI和套接字直接使用TPI。

1.TPI时间获取客户程序

头文件tpi_daytime.h头文件

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值