精华内容
下载资源
问答
  • 延迟(Latency)是指数据包进入一个网络设备到离开该设备所时间。  交换机背板带宽,是交换机接口处理器或接口卡和数据总线间能吞吐最大数据量。背板带宽标志了交换机总数据交换能力,单位为Gbps,也...
  • 什么VLAN

    2013-10-23 09:59:12
     基于用户定义、非用户授权来划分VLAN,是指为了适应特别VLAN网络,根据具体网络用户特别要求来定义和设计VLAN,而且可以让非VLAN群体用户访问VLAN,但是需要提供用户密码,在得到VLAN管理认证后才可以加入...
  • 第一章(概述).pdf

    2020-02-25 15:35:08
    计算机网络是指将地理位置不同具有独立功能多台计算机及其外部设备,通过通信线路连接起来,在网络操作系统,网络管理软件及网络通信协议管理和协调下,实现资源共享和信息传递计算机系统。计算机网络分类...
  • DTU基础知识普及手册

    2018-12-22 16:11:27
    广义地,在进行通信时,传输数据链路两端负责发送数据信息模块单元都称之为DTU,在它作用下对传信息进行格式转换和数据整理校验。狭义地,DTU一般特指无线通讯中下位GPRS/CDMA发射终端设备。前者一...

    原文

    1、什么是DTU?

        答:DTU是数据终端设备(Data Terminal unit)的简写。广义地讲,在进行通信时,传输数据的链路两端负责发送数据信息的模块单元都称之为DTU,在它的作用下对所传信息进行格式转换和数据整理校验。狭义地讲,DTU一般特指无线通讯中的下位GPRS/CDMA发射终端设备。前者是一种模块,而后者则是设备。后面的介绍如果不加特别说明,都是指后者(下位发射终端设备)。
     

    2、与DTU有关的名词解释?1)什么是上位机和下位机?

        答:上位机和下位机是一个相对的概念,在通信中,有主从关系的一对设备,负责提交信息的终端设备是下位机,负责处理提交信息的设备是上位机。DTU设备大多数情况下就属于下位机,而负责处理DTU回传信息的数据中心就是上位机,典型的应用方式是多台DTU对应一个数据中心。但是上位机和下位机不一定都是一一对应,他们可以是一个下位机对应一个或多个上位机,也可以是一个上位机对应一个或多个下位机,具体的对应方式要视应用而定。

      2)什么是数据中心?

        答:数据中心是指对下位机回传的信息进行采集、汇总和处理,并对下位机进行一定控制和管理的上位机系统,他包括完整的计算机硬件设备和特定的完整软件功能。

      3)什么是全透明传输?

        答:全透明传输就是对IP包不作任何操作和改变,只是简单的发送过程。通俗的讲就是,全透明传输时,数据在发送前和发送后的格式、内容都不发生变化,远端数据中心接收的数据与现场采集的数据是一样的,数据在传输过程中不发生变化,如果IP包有任何的操作和改变,就不是完全意义上的全透明了。
     

    3、DTU与无线Mmodem有什么区别?

        答:首先要明确的一点是:DTU与无线Modem是不一样的。

        在软件设计上,DTU封装了协议栈内容并且具有嵌入式操作系统,硬件上可看作是嵌入式PC加无线接入部分的接合。GPRS/CDMA Modem是接入GPRS/CDMA分组网络的一个物理通道,它本身不具有操作系统,必须依附于计算机(在功能上类似于有线Modem),在计算机操作系统之上才能进行PPP拨号连接,通常是与PC结合使用。从某种角度来说,DTU是嵌入式PC与GPRS/CDMA  Modem的结合,但它不能单独当作Modem使用,它完成数据协议转换和透明传输这样一个功能。在使用上,前端采集设备或智能数据设备,通常提供标准的数据接口,如RS232、RS485/422等,这些前端用户设备适合采用DTU,借助于GPRS/CDMA网络平台,实现与监控中心端的数据通信。GPRS/CDMA Modem需要接入计算机,实现组网连接,比如说中心站的PC主机可以通过GPRS/CDMA  Modem接入GPRS/CDMA网络,从而构成某中心站服务器,实现网络监控,数据通信等。而DTU很难作为中心服务站来使用。
     

    4、DTU测试前需要做什么准备工作?

        答:在对DTU进行测试前,需要有以下条件:

    1.一个公网IP地址或独立域名;

    有些情况下,测试环境中的计算机由于在内部局域网,所以无法拥有独立的公网IP地址和域名地址,这样就需要通过拨号上网获得独立公网IP,也可以在测试环境中的路由器上设置DMZ主机映射或者端口映射来使计算机能够穿透内网,以便计算机可以与DTU能够进行正常应答。

    2.一张开通GPRS数据业务的SIM卡(测试GPRS DTU必须),或者一张开通CDMA数据业务的UIM卡(测试CDMA DTU必须);

    3.一台带有9Pin RS232串口的台式计算机或笔记本电脑;

    这台计算机用来对DTU的参数进行设置和调整,同时在测试的时候,可以连接DTU作为虚拟数据源设备,通过串口调试工具与上位机数据中心收发数据。当然,这台计算机在满足条件1的情况下可以既是上位机数据中心,同时也是虚拟数据源下位机。但是在第二种测试目的的时候,要尽量避免这么做,以免对测试本身产生怀疑。

    4.一套完整的测试软件;

    完整的测试软件包括:

    DTU配套的专用参数设置软件;

    串口调试软件;

    上位机数据中心演示DEMO软件。gprs dtu

     

    5、配置终端的默认设置是什么?

    答: 8位数据位/无奇偶校验/1位停止位 

    9600bps 

    无或XON/XOFF 

    要正确选择与DTU相连的COM端口。
     

    6、DTU模块怎么寻址的?它的地址和端口如何设置? 

    答:服务中心的地址和端口号可预先保存在SIM/UIM卡或DTU Flash中,我们可通过DTU配置工具进行配置并存放在DTU Flash中,或通过GPRS/CDMA手机配置数据并存放在SIM卡中,与服务中心建立通信。
     

    7、如果知道 DTU的状态信息,如网络的状况等? 

    答:目前主要通过DTU面板(或电路板)上的LED来进行指示,

    1)、当NET指示灯常亮,表明 DTU模块正常工作,且已找到GSM网络;当NET指示灯不亮,表明尚未找到GSM网络。

    2)、对于终端是否登录上GPRS/CDMA网络,用户可通过FLASH指示灯的闪烁来判断。如果FLASH指示灯不断闪烁,则尚已登录上GPRS/CDMA网络;如果FLASH指示灯常亮,则未登录上GPRS/CDMA网络。

    3)对于终端是否在传输数据,用户可通过ACT指示灯的闪烁来判断。如果ACT指示灯不断闪烁,则表明数据在传输;如果ACT指示灯不亮则尚无数据传输。
     

    8、DTU为何无法与DSC(数据中心)进行通信? 

    答:首先按照下列步骤进行检查: 

    检查NET指示灯是否在常亮(只有注册到GSM网络才会闪烁); 

    检查您是否正确的插入了一张SIM/UIM卡; 检查您是否已经申请您的网络供应商的许可; 

    检查信号强度:进入配置状态,选择进入(查看产品说明书,至少应该大于12)。如果信号微弱,请检查您的天线状况和您所处位置的网络状态; 

    检查电源情况(参看电源要求)。
     

    9、在由DTU组成的采集系统中,如何分辨不同终端发送来的数据?

    答:DTU内嵌了TCP/IP协议栈,具有Socket通讯功能,并提供透明数据传输通道,用户只需设置一些参数就可实现将嵌入式系统直接与Internet相连,实现网络的互连互通。监控中心的Socket端口监听程序负责监听采集终端的连接请求,当监听到连接请求后,建立通信链路,原来负责监听Socket仍进行监听,通信链路建立后就可任意交换数据了。                                   

    在Socket模式下,由于有人为的干预,实现这一功能比较简单。在SieralNet模式下,可以采取如下方式:

    1)端口识别方式:每个终端定义一个端口(1024-65535)。中心多线程同时侦听这些端口数据,并根据不同端口号识别数据的不同来源。一般情况下,同时侦听几百个端口对现在的计算机来说不成问题。

    2)数据帧方式:终端向中心的统一端口发送数据包,这些数据包要带有终端ID号,中心通过不同的ID识别不同终端的数据。
     

    10、如何使客户在实际应用中更好的使用DTU?

                                        

        答:一般情况下,当用户设置好DTU的参数后,进入serialnet模式,DTU会自动记住当前的所有状态和参数,即使掉电也不会丢失;另外,DTU具有断线重拨功能。这就使得DTU像一个透明的传输通道,只要用户提供稳定的电源供应,就应该没有问题。但在实际工程应用中,用户也提出了更高的要求,譬如说连续无人值守工作几年不出问题,永远保持通讯线路的畅通等。

    为此,我们对DTU的用户有如下建议:

    1)使用DTU的复位引脚或短路开关断电复位功能(对现有老版本产品)。鉴于无线通讯的诸多不确定性和用户的高可靠性要求,建议用户增加这一部分电路,确保万无一失。

    2)很多用户提到如何在Serialnet模式下侦测通讯线路的通断。有些公司的产品是通过发送心跳数据来检测的,为了保证用户通道的透明性,这样在中心端必然存在一个dll链接库。我们认为这样的方式并不可取,dll的存在使得数据又多了一层环节,对于unix,或linux平台的中心节点来说还要有专门的链接接口,也存在一定的安全隐患和不稳定因素。我们的产品没有使用心跳包,它是将标准的socket接口直接开放给用户,这样几乎所有的程序员都可以很方便的在不同平台上实现数据收发功能。心跳包的功能我们认为在应用层解决比较合适,这样既可以和用户的应用程序结合得比较紧密,又可以合理的减少数据流量。

    当用户在socket模式时,监测数据链路的通断既可以通过心跳包的方式,也可以用ping的方式检测。当心跳监测发现有问题时,可以通过复位方式来解决。 
     

    11、在用DTU组成数据采集系统时,中心端是否可以使用动态的IP接入地址?                                  

    答:可以。中心可以通过动态域名解析软件将动态地址和某个域名邦定,DTU可以支持域名解析功能。
     

    12、在用DTU组成数据采集系统时,如何使用动态的IP接入地址?

    答:如果中心端是一台具体的服务器时,具体设置方法如下:

    1)中心端:

    申请ADSL或电话线接入Internet服务。

    申请动态IP域名解析服务(DDNS),并获得域名。(例如”花生壳”程序, 

    http://www.oray.net/products/PeanutHull.asp有介绍和下载)。

    安装并设置在每次开机时运行“花生壳”程序。

    ADSL或电话线拨入Internet。

    2)终端(DTU):

    设置DTU的DNS服务器地址。(AT+TSDNS)

    对于serialNET模式,设置远端IP地址(AT+TSRIPADDR),写入分配到的域名。

    对于socket模式,使用AT+ISTCP:地址或域名>,  建立连接。
     

    13、在用DTU组成数据采集系统时,如果中心端是局域网,如何让局域网内的某台机器侦听和收发终端数据?

        答:可以使用网关路由器的虚拟服务器功能,将要监听的端口映射到局域网内的任何一台计算机上,这样到达网关路由器的指定端口数据就会被送到这台计算机上来。具体见共享器和路由器的使用手册。
     

    14、采用GPRS/CDMA传输方式和TCP/IP协议,数据中心怎样确定数据是由采集终端上传的数据呢? 

        答:DTU采用端口识别方式,每个终端定义一个端口(1024-65535)。中心多线程同时侦听这些端口数据,并根据不同端口号识别数据的不同来源,从而准确识别数据是由采集终端上传的数据。一般情况下,同时侦听几百个端口对现在的计算机来说不成问题。
     

    15、如果终端一上网,网络立即分配一个动态IP,这样,在不同的时间区间,同一个终端的IP号码是不同的,数据中心如何区分、识别进行数据入库操作? 

    答:DTU内嵌了TCP/IP协议栈,具有Socket通讯功能,并提供透明数据传输通道,用户只需设置一些参数就可实现将嵌入式系统直接与Internet相连,实现网络的互连互通。监控中心的Socket端口监听程序负责监听采集终端的连接请求,当监听到连接请求后,建立通信链路,原来负责监听Socket仍进行监听,通信链路建立后就可任意交换数据了。


    16、请简单示意数据中心采用从移动公司接数据专线,整个系统的配置和预算。

    答:采用数据专线(DDN)比ADSL接入方式的费用高,具体费用需要向移动公司,以及当地DDN服务商查询。但这种接入方式安全、可靠,数据延时小。

    17、目前普及使用的DTU 有哪些?
       答:JY-DTU-C和 JY-DTU-G


    18、我们现在需要一种GPRS产品,请问是否可以提供80kbps~150kbps的系统方案? 

    答:根据我们在不同城市的测试,目前中国移动提供GPRS带宽一般只能提供到20~40Kbps带宽。不同城市不同区域带宽有所不同,请咨询当地移动运营商。 


    19、我们公司有一台服务器并有固定IP地址,但是考虑到服务器的稳定运行问题通常不允许在服务器上安装其他应用软件,所以GPRS数据中心系统也不允许安装在该服务器上,请问如何解决这一问题?

        答:如果您的服务器运行Windows 2000 Server,你可以很容易的在拥有固定IP地址的服务器上进行配置,映射相关端口,将来自GPRS/Internet网络某一指定端口的数据通过映射功能将此端口的数据转发到局域网内某一台安装有GPRS数据中心的计算机上(下载端口映射与配置管理使用说明)。如果您的服务器运行Windows NT Server,请安装WinRoute Pro做相应的映射配置。如果您的服务器运行Linux,请参阅Linux操作系统有关NAT和端口映射的配置说明。如果您的网络使用Cisco或3COM路由器,请参考该路由器的说明书进行NAT和端口映射的配置。

    展开全文
  • 计算机网络

    2019-04-24 14:46:31
    计算机网络,是指将地理位置不同具有独立功能多台计算机及其外部设备,通过通信线路连接起来,在网络操作系统,网络管理软件及网络通信协议管理和协调下,实现资源共享和信息传递计算机系统。 (2)组成分类...

    计算机网络
    (1)定义
    计算机网络,是指将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来,在网络操作系统,网络管理软件及网络通信协议的管理和协调下,实现资源共享和信息传递的计算机系统。
    (2)组成分类
    计算机网络的分类与的一般的事物分类方法一样,可以按事物的所具有的不同性质特点即事物的属性分类。计算机网络通俗地讲就是由多台计算机(或其它计算机网络设备)通过传输介质和软件物理(或逻辑)连接在一起组成的。总的来说计算机网络的组成基本上包括:计算机、网络操作系统、传输介质(可以是有形的,也可以是无形的,如无线网络的传输介质就是空间)以及相应的应用软件四部分。
    (3)主要网络
    虽然网络类型的划分标准各种各样,但是从地理范围划分是一种大家都认可的通用网络划分标准。按这种标准可以把各种网络类型划分为局域网、城域网、广域网和互联网四种。局域网一般来说只能是一个较小区域内,城域网是不同地区的网络互联,不过在此要说明的一点就是这里的网络划分并没有严格意义上地理范围的区分,只能是一个定性的概念。下面简要介绍这几种计算机络。

    局域网
    通常我们常见的“LAN”就是指局域网,这是我们最常见、应用最广的一种网络。局域网随着整个计算机网络技术的发展和提高得到充分的应用和普及,几乎每个单位都有自己的局域网,有的甚至家庭中都有自己的小型局域网。这种网络的特点就是:连接范围窄、用户数少、配置容易、连接速率高。目前局域网最快的速率要算现今的10G以太网了。IEEE的802标准委员会定义了多种主要的LAN网:以太网(Ethernet)、令牌环网(Token Ring)、光纤分布式接口网络(FDDI)、异步传输模式网(ATM)以及最新的无线局域网(WLAN)。

    城域网
    (Metropolitan Area Network;简称MAN) 这种网络一般来说是在一个城市,但不在同一地理小区范围内的计算机互联。这种网络的连接距离可以在10 ̄100公里,它采用的是IEEE802.6标准。MAN与LAN相比扩展的距离更长,连接的计算机数量更多,在地理范围上可以说是LAN网络的延伸。
    城域网多采用ATM技术做骨干网。ATM是一个用于数据、语音、视频以及多媒体应用程序的高速网络传输方法。但ATM的最大缺点就是成本太高,所以一般在政府城域网中应用,如邮政、银行、医院等。

    广域网
    (Wide Area Network;简称WAN) 这种网络也称为远程网,所覆盖的范围比城域网(MAN)更广,它一般是在不同城市之间的LAN或者MAN网络互联,地理范围可从几百公里到几千公里。
    (4)计算机网络的组成
    计算机网络通常由三个部分组成,它们是资源子网、通信子网和通信协议.所谓通信子网就是计算机网络中负责数据通信的部分;资源子网是计算机网络中面向用户的部分,负责全网络面向应用的数据处理工作;而通信双方必须共同遵守的规则和约定就称为通信协议,它的存在与否是计算机网络与一般计算机互连系统的根本区别。所以从这一点上来说,我们应该更能明白计算机网络为什么是计算机技术和通信技术发展的产物了。

    (5)计算机网络的体系结构
    在计算机网络技术中,网络的体系结构指的是通信系统的整体设计,它的目的是为网络硬件、软件、协议、存取控制和拓扑提供标准.现在广泛采用的是开放系统互连 OSI(Open System Interconnection)的参考模型,它是用物理层、数据链路层、网络层、传送层、对话层、表示层和应用层七个层次描述网络的结构.你应该注重的是,网络体系结构的优劣将直接影响总线、接口和网络的性能.而网络体系结构的要害要素恰恰就是协议和拓扑。目前最常见的网络体系结构有FDDI、以太网、令牌环网和快速以太网等。

    (6)认证协议
    网络身份认证协议VIeID

    全称:(Virtual identity electronic identification) 通用账户协议,是俗称的网络身份证。它是一种互联网身份认证协议,其具有唯一性和信息不可否认性。其概念与OpenID相似,并具有开放、分散、自由等特性。依据网络的不同通常使用Ethernet(以太网)、NetBEUI、IPX/SPX以及TCP/IP协议。 Ethernet是总线型协议中最常见的网络低层协议,安装轻易且造价便宜;而NetBEUI可以说是专为小型局域网设计的网络协议。对那些无需跨经路由器与大型主机通信的小型局域网,安装NetBEUI协议就足够了,但假如需要路由到另外的局域网,就必须安装IPX/SPX或TCP/IP协议。

    展开全文
  • RF功率放大器是通信系统中关键设备之一,其输出功率大小决定了价格,但目前对于RF功率放大器输出功率定义不一致,通常输出功率一般指的是饱和功率,而饱和功率已经压缩输出功率,即其输出功率...

    RF功率放大器是通信系统中的关键设备之一,其输出功率的大小决定了价格,但目前对于RF功率放大器的输出功率定义是不一致的,通常所说的输出功率一般指的是饱和功率,而饱和功率是已经压缩的输出功率,即其输出功率已经是非线性的了,还有一种是按输出一分贝压缩点来定的输出功率,这个定义相对是比较线性的,但成本较高,因其功率管回退较多,最少大于5分贝以上,最后一种是线性输出功率,即完全不压缩的情况下的输出功率,这是成本最高的,其回退在8分贝以上,对于大功率输出来讲,其效率也是最低的。仅供参考!

    展开全文
  • 其次运用于会展的运作、营销和功能拓展,展馆信息、展会信息、参展商信息、采购商信息、招展过程和围绕展会个企业相互讲的信息沟通都可以通过网络实现。高效、充实、开放的信息平台不仅有助于提高展览公司、展会的...
  • 计算机网络是指将地理位置不同具有独立功能多台计算机及其外部设备,通过通信线路连接起来,在网络操作系统,网络管理软件及网络通信协议管理和协调下,实现资源共享和信息传递计算机系统。 计算机网络...

    1.序

    计算机网络在面试中占很大的比重,它和操作系统,数据结构,设计模式等都。在我们春招秋招面试中,很多人会说你要会很多框架,你要会很多很多的技术,其实不然。我觉得在这对于校招生或者刚工作不久的人来说基础是非常重要的。在我面试的过程中仅仅只有少数较小的公司提到了框架的缺乏度,而大部分大公司的面试官都喜欢你的基本功扎实不扎实,你的潜力如何,而不是会很多东西但是都不深入。所以我建议是基础一定要狠下功夫。而且有一定自己的理解。而不是把时间都花在了大多数你没用过而且也没有能力去深入的框架技术上去。毕竟面试准备的时间是很宝贵的。

    1.1 计算机网络

    计算机网络是指将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来,在网络操作系统,网络管理软件及网络通信协议的管理和协调下,实现资源共享和信息传递的计算机系统。
    计算机网络的分类与一般的事物分类方法一样,可以按事物所具有的不同性质特点分类。计算机网络通俗地讲就是由多台计算机通过传输介质和软件物理连接在一起组成的。总的来说计算机网络的组成基本上包括:计算机、网络操作系统、传输介质以及相应的应用软件四部分。

    1.2 网络编程

    网络编程最主要的工作就是在发送端把信息通过规定好的协议进行组装包,在接收端按照规定好的协议把包进行解析,从而提取出对应的信息,达到通信的目的。中间最主要的就是数据包的组装,数据包的过滤,数据包的捕获,数据包的分析,当然最后再做一些处理,代码、开发工具、数据库、服务器架设和网页设计这5部分你都要接触。

    2.Socket技术

    对TCP/IP、UDP、Socket编程这些词你不会很陌生吧?随着网络技术的发展,这些词充斥着我们的耳朵。那么我想问:
    1.什么是TCP/IP、UDP?
    2.Socket在哪里呢?
    3.Socket是什么呢?
    4.你会使用它们吗?

    先从服务器端说起。服务器端先初始化Socket,然后与端口绑定(bind),对端口进行监听(listen),调用accept阻塞,等待客户端连接。在这时如果有个客户端初始化一个Socket,然后连接服务器(connect),如果连接成功,这时客户端与服务器端的连接就建立了。客户端发送数据请求,服务器端接收请求并处理请求,然后把回应数据发送给客户端,客户端读取数据,最后关闭连接,一次交互结束。

    2.1原理

    什么是Socket?
    在这里插入图片描述

    在socket网络编程中,都是端到端通信,由客户端端口+服务端端口+客户端IP+服务端IP+传输协议组成的五元组可以明确的标识一条连接。

    上面我们已经知道网络中的进程是通过socket来通信的,那什么是socket呢?socket起源于Unix,而Unix/Linux基本哲学之一就是“一切皆文件”,都可以用“打开open –> 读写write/read –> 关闭close”模式来操作。我的理解就是Socket就是该模式的一个实现,socket即是一种特殊的文件,一些socket函数就是对其进行的操作(读/写IO、打开、关闭),这些函数我们在后面进行介绍

    2.2socket的基本操作

    既然socket是“open—write/read—close”模式的一种实现,那么socket就提供了这些操作对应的函数接口。下面以TCP为例,介绍几个基本的socket接口函数。

    2.2.1 socket()函数

    int socket(int domain, int type, int protocol);
    socket函数对应于普通文件的打开操作。普通文件的打开操作返回一个文件描述字,而socket()用于创建一个socket描述符(socket descriptor),它唯一标识一个socket。这个socket描述字跟文件描述字一样,后续的操作都有用到它,把它作为参数,通过它来进行一些读写操作。
    它的参数
    domain:即协议域,又称为协议族(family)。常用的协议族有,AF_INET、AF_INET6、AF_LOCAL(或称AF_UNIX,Unix域socket)、AF_ROUTE等等。协议族决定了socket的地址类型,在通信中必须采用对应的地址,如AF_INET决定了要用ipv4地址(32位的)与端口号(16位的)的组合、AF_UNIX决定了要用一个绝对路径名作为地址。
    type:指定socket类型。常用的socket类型有,SOCK_STREAM、SOCK_DGRAM、SOCK_RAW、SOCK_PACKET、SOCK_SEQPACKET等等(socket的类型有哪些?)。
    sock_stream是有保障的(即能保证数据正确传送到对方)面向连接的SOCKET,多用于资料(如文件)传送。
    sock_dgram是无保障的面向消息的socket , 主要用于在网络上发广播信息。
    对比SOCK_STREAM是基于TCP的,数据传输比较有保障。SOCK_DGRAM是基于UDP的,专门用于局域网,基于广播 SOCK_STREAM 是数据流,一般是tcp/ip协议的编程,
    (补充知识点)
    字节流是无边界的,SOCK_DGRAM分是数据报,是udp协议网络编程,数据报是记录型的数据报,所谓的记录型数据报就是接收进程可以识别接收到的数据报的记录边界。
    protocol:故名思意,就是指定协议。常用的协议有,IPPROTO_TCP、IPPTOTO_UDP、IPPROTO_SCTP、IPPROTO_TIPC等,它们分别对应TCP传输协议、UDP传输协议、STCP传输协议、TIPC传输协议
    注意:并不是上面的type和protocol可以随意组合的,如SOCK_STREAM不可以跟IPPROTO_UDP组合。当protocol为0 时,会自动选择type类型对应的默认协议。

    2.2.2 bind()函数

    正如上面所说bind()函数把一个地址族中的特定地址赋给socket。例如对应AF_INET、AF_INET6就是把一个ipv4或ipv6地址和端口号组合赋给socket。
    int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
    函数的三个参数分别为:
    sockfd:即socket描述字,它是通过socket()函数创建了,唯一标识一个socket。bind()函数就是将给这个描述字绑定一个名字。
    addr:一个const struct sockaddr *指针,指向要绑定给sockfd的协议地址。这个地址结构根据地址创建socket时的地址协议族的不同而不同,如ipv4对应的是:

    如ipv4对应的是:

    struct sockaddr_in {
    	    sa_family_t    sin_family; 
    	    in_port_t      sin_port;   
    	    struct in_addr sin_addr;   
    	};
    	struct in_addr {
    	    uint32_t       s_addr;     
    	};
    

    ipv6对应的是:

    struct sockaddr_in6 { 
    	    sa_family_t     sin6_family;    
    	    in_port_t       sin6_port;      
    	    uint32_t        sin6_flowinfo;  
    	    struct in6_addr sin6_addr;      
    	    uint32_t        sin6_scope_id;  
    	};
    	
    	struct in6_addr { 
    	    unsigned char   s6_addr[16];    
    	};
    

    Unix域对应的是:

    #define UNIX_PATH_MAX    108
     
    struct sockaddr_un { 
        sa_family_t sun_family;                
        char        sun_path[UNIX_PATH_MAX];   
    };
    

    addrlen:对应的是地址的长度。
    通常服务器在启动的时候都会绑定一个众所周知的地址(如ip地址+端口号),用于提供服务,客户就可以通过它来接连服务器;而客户端就不用指定,有系统自动分配一个端口号和自身的ip地址组合。这就是为什么通常服务器端在listen之前会调用bind(),而客户端就不会调用,而是在connect()时由系统随机生成一个。

    2.2.3 listen()、connect()函数

    如果作为一个服务器,在调用socket()、bind()之后就会调用listen()来监听这个socket,如果客户端这时调用connect()发出连接请求,服务器端就会接收到这个请求。
    int listen(int sockfd, int backlog);
    int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);

    listen函数的第一个参数即为要监听的socket描述字,第二个参数为相应socket可以排队的最大连接个数。socket()函数创建的socket默认是一个主动类型的,listen函数将socket变为被动类型的,等待客户的连接请求。

    connect函数的第一个参数即为客户端的socket描述字,第二参数为服务器的socket地址,第三个参数为socket地址的长度。客户端通过调用connect函数来建立与TCP服务器的连接。

    2.2.4 accept()函数

    TCP服务器端依次调用socket()、bind()、listen()之后,就会监听指定的socket地址了。TCP客户端依次调用socket()、connect()之后就想TCP服务器发送了一个连接请求。TCP服务器监听到这个请求之后,就会调用accept()函数取接收请求,这样连接就建立好了。之后就可以开始网络I/O操作了,即类同于普通文件的读写I/O操作。
    int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);

    注意:accept的第一个参数为服务器的socket描述字,是服务器开始调用socket()函数生成的,称为监听socket描述字;而accept函数返回的是已连接的socket描述字。一个服务器通常通常仅仅只创建一个监听socket描述字,它在该服务器的生命周期内一直存在。内核为每个由服务器进程接受的客户连接创建了一个已连接socket描述字,当服务器完成了对某个客户的服务,相应的已连接socket描述字就被关闭。

    2.2.5 read()、write()等函数

    万事具备只欠东风,至此服务器与客户已经建立好连接了。可以调用网络I/O进行读写操作了,即实现了网咯中不同进程之间的通信!网络I/O操作有下面几组:

    • read()/write()
    • recv()/send()
    • readv()/writev()
    • recvmsg()/sendmsg()
    • recvfrom()/sendto()
      C#中recv()/send()

    我推荐使用recvmsg()/sendmsg()函数,这两个函数是最通用的I/O函数,实际上可以把上面的其它函数都替换成这两个函数。它们的声明如下:
    sendmsg和recvmsg这两个接口是高级套接口,这两个接口支持一般数据的发送和接收,还支持多缓冲区的报文发送和接收(readv和sendv支持多缓冲区发送和接收),还可以在报文中带辅助数据。这些功能是常用的send、recv等接口无法完成的。
    .

    1. ssize_t recvmsg(int sockfd, struct msghdr *msg, int flags);
    2. ssize_t sendmsg(int sockfd, struct msghdr *msg, int flags);

    2.3实战

    在这里插入图片描述

    此通信是WPF与Unity3D之间的一个通信
    此项目是基于WPF界面的实现。其中嵌入了Unity3D仿真。但是Unity3D与WPF的通信是不能直接进行的,有两种方法,一种是通过数据库,WPF给数据库中插入指令,Unity3D不断的遍历数据库,一旦发现有指令就进行某些操作,第二种方法是Socket通信。接下来进行对Socket通信的讲解。在这里插入代码片

    2.3.1发生端(WPF)

    
    ```csharp
    class SocketServer
        {
            //私有成员
            private static byte[] result = new byte[1024];
            private int myProt = 500;   //端口  
            static Socket serverSocket;
            static Socket clientSocket;
     
            Thread myThread;
            static Thread receiveThread;
     
            //属性
     
            public int port { get; set; }
            //方法
     
            static SocketServer socketServer = null;
            public static SocketServer GetInstance()
            {
                if(socketServer == null)
                {
                    socketServer = new SocketServer();
                    socketServer.StartServer();
                }
     
                return socketServer;
            }
     
            SocketServer()
            {
     
            }
            void StartServer()
            {
                //服务器IP地址  
                IPAddress ip = IPAddress.Parse("127.0.0.1");
                serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                serverSocket.Bind(new IPEndPoint(ip, myProt));  //绑定IP地址:端口  
                serverSocket.Listen(10);    //设定最多10个排队连接请求  
     
                Debug.WriteLine("启动监听{0}成功", serverSocket.LocalEndPoint.ToString());
     
                //通过Clientsoket发送数据  
                myThread = new Thread(ListenClientConnect);
                myThread.Start();
     
            }
     
     
            internal void QuitServer()
            {
     
                if (serverSocket != null)
                    serverSocket.Close();
     
                if (clientSocket != null)
                    clientSocket.Close();
     
                if(myThread != null)
                    myThread.Abort();
     
                if(receiveThread != null)
                    receiveThread.Abort();
     
     
            }
     
     
            internal void SendMessage(string msg)
            {
                if(clientSocket != null && clientSocket.Connected)
                clientSocket.Send(Encoding.ASCII.GetBytes(msg));
            }
     
     
     
            /// <summary>  
            /// 监听客户端连接  
            /// </summary>  
            private static void ListenClientConnect()
            {
                while (true)
                {
                    try
                    {
                        clientSocket = serverSocket.Accept();
                        clientSocket.Send(Encoding.ASCII.GetBytes("Server Say Hello"));
                        receiveThread = new Thread(ReceiveMessage);
                        receiveThread.Start(clientSocket);
                    }
                    catch (Exception)
                    {
     
                    }
     
                }
            }
     
            /// <summary>  
            /// 接收消息  
            /// </summary>  
            /// <param name="clientSocket"></param>  
            private static void ReceiveMessage(object clientSocket)
            {
                Socket myClientSocket = (Socket)clientSocket;
                while (true)
                {
                    try
                    {
                        //通过clientSocket接收数据  
                        int receiveNumber = myClientSocket.Receive(result);
                        Debug.WriteLine("接收客户端{0}消息{1}", myClientSocket.RemoteEndPoint.ToString(), Encoding.ASCII.GetString(result, 0, receiveNumber));
                    }
                    catch (Exception ex)
                    {
                        try
                        {
                            Debug.WriteLine(ex.Message);
                            myClientSocket.Shutdown(SocketShutdown.Both);
                            myClientSocket.Close();
                            break;
                        }
                        catch (Exception)
                        {
                        }
     
                    }
                }
            }
     
            public void CloseClient()
            {
                if (clientSocket != null && clientSocket.Connected)
                {
                    clientSocket.Close();
                    clientSocket = null;
                }
            }
    }
    

    2.3.2发送程序

    ```csharp
     public partial class MainWindow : Window
        {
     
            SocketServer socketServer = null;
            public MainWindow()
            {
                InitializeComponent();
     
                socketServer = SocketServer.GetInstance();
            }
     
            
            public void SendMessage(string message)
            {
                socketServer.SendMessage(message);
            }
     
            public void CloseWindow()
            {
     
                socketServer.QuitServer();
                CloseScene();
                Close();
            }
     
            public void CloseScene()
            {
                socketServer.CloseClient();
                UnityControl.closeUnity3dExe();
                CloseTabControl("三维仿真场景");
            }
        }
    

    2.3.3接收端(Unity3D)

    using UnityEngine;
    using System.Collections;
    using System.Net.Sockets;
    using System;
    using System.Collections.Generic;
     
    public class SocketCommand : MonoBehaviour
    {
        const int portNo = 500;
        private TcpClient _client;
        byte[] data;
     
        string Error_Message;
     
        List<string> messages = new List<string>();
     
        float checkTime = 0.1f;
        void Start()
        {
            try
            {
                this._client = new TcpClient();
                this._client.Connect("127.0.0.1", portNo);
                data = new byte[this._client.ReceiveBufferSize];
                //SendMessage(txtNick.Text);
                SendMessage("Unity Demo Client is Ready!");
                this._client.GetStream().BeginRead(data, 0, System.Convert.ToInt32(this._client.ReceiveBufferSize), ReceiveMessage, null);
            }
            catch (Exception ex)
            {
            }
        }
     
        void FixedUpdate()
        {
            checkTime -= Time.fixedDeltaTime;
     
            if(checkTime <= 0)
            {
                checkTime = 0.1f;
     
                MessageDealing();
            }
          
        }
     
        /// <summary>
        /// 对收到的消息的处理函数
        /// </summary>
        private void MessageDealing()
        {
            if(messages.Count > 0)
            {
                Debug.Log(messages[0]);
                Command.CommandDecoding(messages[0]);
                messages.Remove(messages[0]);
            }
        }
     
     
        public new void SendMessage(string message)
        {
            try
            {
                NetworkStream ns = this._client.GetStream();
                byte[] data = System.Text.Encoding.ASCII.GetBytes(message);
                ns.Write(data, 0, data.Length);
                ns.Flush();
            }
            catch (Exception ex)
            {
                Error_Message = ex.Message;
                //MessageBox.Show(ex.ToString());
            }
        }
        public void ReceiveMessage(IAsyncResult ar)
        {
            try
            {
                //清空errormessage
                Error_Message = "";
                int bytesRead;
                bytesRead = this._client.GetStream().EndRead(ar);
                if (bytesRead < 1)
                {
                    return;
                }
                else
                {
                   // Debug.Log(System.Text.Encoding.ASCII.GetString(data, 0, bytesRead));
                    string message = System.Text.Encoding.ASCII.GetString(data, 0, bytesRead);
     
                    messages.Add(message);
                }
                this._client.GetStream().BeginRead(data, 0, System.Convert.ToInt32(this._client.ReceiveBufferSize), ReceiveMessage, null);
            }
            catch (Exception ex)
            {
                Error_Message = ex.Message;
            }
        }
     
        public void CloseClient()
        {
            if(_client.Connected)
            this._client.Close();
        }
        void OnDestroy()
        {
            if (_client.Connected)
                this._client.Close();
            
        }
     
    }
    

    3.总结

    本人面试得益于socket 技术。因为我的项目中使用了该技术,所以在面试中就讲解对于这一块的理解,并且在面试之前也大概深入的看了一下。所以这个也告诉我们对于自己准备的项目一定要对于其中的技术有所思考,有所深入,让面试官看到你的潜力以及可塑性。既然你对研究生期间所做的项目进行了深入的研究,那么在进入工作之后依然会做的很好。所以加油,希望各位梦想成真!!!

    4.关注我

    博客地址
    https://blog.csdn.net/weixin_41563161
    掘金https://juejin.cn/user/2814360172369271

    知乎https://www.zhihu.com/people/hai-kuo-tian-kong-63-38-21
    公众号

    在这里插入图片描述

    展开全文
  •  多态性是指允许不同类对象对同一消息作出响应。多态性包括参数化多态性和包含多态性。多态性语言具有灵活、抽象、行为共享、代码共享优势,很好解决了应用程序函数同名问题。 5、String是最基本数据类型...
  • sniffer使用教程

    2011-03-13 18:48:42
    内部网基于IP的通信可以用ARP欺骗别人机器让其发送给你的机器,如果要想不影响原来两方的通信,可以欺骗 两方,让其都发给你的机器再由你的机器转发,相当于做中间人,这用ARP加上编程很容易实现。并且现在很多设备 ...
  • 据我知,大多数 Linux 发行版本(Linux distribution)和核心(Kernel)都可以 从网上下载,但是我不推荐易用这种方法得到 Linux,因为仅仅核心就有几十个 Mbit 数据量,而一个完整发行版本大概都 1...
  • 作为移动通信网络系统,与无线设备和接口相关参数,关系到无线资源配置和有效利用,这部分参数对于网络覆盖、信令流量负荷、业务负荷分布、网络性能指标等均具有极大影响。因此合理调整系统无线参数,网络...
  • 会计理论考试题

    2012-03-07 21:04:40
    1.PC机中 Intel8088、80286、80386、80486,PemiumPⅡ、PⅢ是指_D_不同型号。 A、显示器 B、内存储器 C、外存储器 D、微处理器 2.用高级语言来编写程序 ___D___ 。 A、称为编译软件 B、经编译后,才称为源程序 C...
  • Android 上百实例源码分析以及开源分析 集合打包4

    千次下载 热门讨论 2012-07-10 21:54:03
    我们知道一般ListView显示都离不开Adapter,在此也不例外,或继承自BaseAdapter,然后重写getView方法,或直接调用Android已经写好方法,之所以拿这个来因为这里稍微有点特殊,它并不就直接实现getView...
  • 本书主要讲的 就是JSF。 2:Java微缩版:JME( Java Micro edition) JE(Java, Micro edition)对标准版JSE进行功能缩减后的版本,于199年6月 由 Sun Microsystems第一次推向Java团体。它一项能更好满足Java开发人员...
  • 入门学习Linux常用必会60个命令实例详解doc/txt

    千次下载 热门讨论 2011-06-09 00:08:45
    虽然vfat是指FAT 32系统,但事实上它也兼容FAT 16文件系统类型。 (2)确定设备的名称 在Linux 中,设备名称通常都存在/dev里。这些设备名称命名都是有规则,可以用“推理”方式把设备名称找出来。例如,/...
  • 1、信息:是指数据、消息包含内容和意义。语言、文字、符号、信号、指令、代码等都可以表达和传递信息。 2、信息基本特征:普遍性、存储性、传递性、共享性、失真性、加工性、时效性。 3、信息技术:是指信息...
  • C++MFC教程

    热门讨论 2013-05-21 13:37:15
    以下我在最初学习VC时常用开发思路和方法,希望能对初学VC朋友有所帮助和启发。 1、开发需要读写文件应用程序并且有简单输入和输出可以利用单文档视结构。 2、开发注重交互简单应用程序可以使用对话框...
  • 概要设计说明书模板

    热门讨论 2011-10-25 12:55:15
    从另一方面,它又开发人员在下一阶段进行系统详细设计纲领性文件,也考核系统总体质量重要技术文档。 预期读者 【说明】本文档阅读对象软件开发人员、业务规范设计人员、软件测试人员、系统安装...
  • iPhone开发秘籍(第2版)--源代码

    热门讨论 2012-12-11 13:51:22
    6.17 秘诀:一般的Core Animation调用 190 6.18 翻页过渡 192 6.19 秘诀:当视图显示时反弹视图 193 6.20 秘诀:图像视图动画 195 6.21 补充内容:给视图添加映射 196 6.22 小结 199 第7章 图像处理 201 7.1 ...
  • java 面试题 总结

    2009-09-16 08:45:34
    多态性是指允许不同类对象对同一消息作出响应。多态性包括参数化多态性和包含多态性。多态性语言具有灵活、抽象、行为共享、代码共享优势,很好解决了应用程序函数同名问题。 2、String是最基本数据类型吗? ...
  • Guide 哥注:权限管理系统在企业级项目中一般非常重要,如果你需求去实际了解一个不错权限系统如何设计话,推荐你可以参考下面这些开源项目。 Spring-Cloud-Admin :Cloud-Admin 国内首个基于 ...
  • 以下 ARC 设备名称范例:  multi(0)disk(0)rdisk(0)partition(1)  等价的设备名称:  DeviceHardDisk0Partition1  范例  下例将物理设备名映射为使用 ARC 设备名称驱动器号:  map arc  注意 ...
  • 软件工程教程

    热门讨论 2012-07-06 23:10:29
    用例图描述系统功能依靠外部用户或另一个系统激活,为用户或另一个系统提供服务 用例表达“做什么” 用例图中可以包含若干个用例,用例表达了系统功能 用例只描述参与者和系统在交互过程中做些什么,并不描述...
  • 接口类问题(B类)-设计、编码中出现函数和环境、其他函数、全局/局部变量或数据变量之间数据/控制传输不匹配问题,在系统中起重要作用,将导致模块间配合失效等严重问题; 维护类问题(C类)-设计、...

空空如也

空空如也

1 2
收藏数 28
精华内容 11
关键字:

一般所讲的通信设备是指