×

基于Net-BIOS协议的网络通信设计方案解析

消耗积分:1 | 格式:rar | 大小:0.3 MB | 2017-10-27

分享资料个

1 引言
  在有文件服务器存在的计算机网络系统中,要实现PC机之间的通信或信息交换,一般是由一个工作站把信息写入文件服务器,然后由另一个工作站去读取,这是工作站之间信息交换的一种方式,但不是最佳、最方便的方式。因为使用文件服务器,速度慢、需占用硬盘空间,还要经常对文件系统进行维护、管理等等。而且用户对文件系统的访问权也受到权限等因素的限制,更重要的是服务器的存在,提高了网络系统的成本及造价。所以,在很多情况下采用Net-BIOS支持下的PC机之间直接通信则更为简捷、经济。
  2 数据通信与NetBIOS协议
  数据通信通常包含以下几项内容:
  一 是连接的建立和拆除。即在计算机网络通信中,为使源主机与目标主机进行通
  信,通常通信前先在它们之间建立连接,即建立一条由源主机到目标主机的通信线路,在通信结束时拆除已建立的连接。
  二 是数据传送控制。也就是在通信双方建立起连接之后,利用该连接传送用户数
  据。另外还有错误的检测及处理等。
  NetBIOS(NETWORK BASICINPUT/OUTPUTSYSTEM)网络基本输入/输出系统,是一种用于计算机之间进行通信的专用程序,是计算机网络通信中的重要协议之一。它支持TCP/IP、MAP/TOP、IEEE和OSI等协议,而且NetBIOS正迅速成为不同操作系统环境下普遍使用的编程平台。NetBIOS基本概念包括NetBIOS名字、NetBIOS命令、NetBIOS通信方式等,下面分别给以说明。
  NetBIOS名字:NetBIOS是一种按名字工作的系统,每个网络工作站都有一个名字。由NetBIOS保留一张名字表,每个名字由16字符组成,在进行通信时,信息的源地址和目的地址都是用名字来表示的。
  NetBIOS命令:NetBIOS的功能是由一系列命令完成的。NetBIOS命令返回方式有两种WAIT和NO_WAIT。前者要等到命令完成之后,才返回你的程序,后者则立即返回你的程序,并带回“立即返回代码”,待命令执行完时又返回一个“最终返回代码”。
  NetBIOS通信方式:NetBIOS有两种通信方式,即数据报通信方式和会话通信方式。数据报通信是一种非面向连接的通信方式,每个数据报中的信息长度必须小于或等于512个字节,而会话通信是一种面向连接的通信方式,信息长度限制在65535字节以内。
  3 NetBIOS支持下的网络通信系统的设计
  3.1正确选择通信方式
  我们知道NetBIOS的通信方式有两种,即数据报通信方式和会话通信方式。那么,在通信系统设计时究竟采用哪种通信方式呢?这要根据我们的实际情况,进行具体分析。
  由于数据报通信时,把每一个报文作为一个独立的数据报处理,即各个数据报之间相互独立,单独传送,不用建立和拆除会话连接,所以简单方便、通信速度快。但这种机制在通信过程中不检测信息是否安全到达目的地,系统出现差错时,无出错提示信息,而且每个数据报信息长度受到512字节的限制,所以,数据报通信仅适用于待发送的信息是一系列互不相关的报文及一些简单对话、小数据的场合。
  而会话通信方式是在通信之前先在发送方和接收方之间建立会话连接,然后进行会话通信,在会话通信过程中,发出的所有报文都能正确无误地送到目的地。如果发出的报文不止一个,那么通信协议将保证收到报文次序和发送报文次序一致。如果报文在传送过程中发生差错,通信协议会自动地进行重发,加以更正,并有出错信息提示。最后,在送完报文之后撤除会话连接。
  由此可见,会话通信过程比较复杂,通信速度较慢,又通信中信息长度限制在65535字节以内,所以,会话通信适于点到点之间多次往复式对话、大数据场合。
  数据报通信方式和会话通信方式各自都有优点和缺点。数据报方式适合于小批量的传送数据,可靠性不高,数据传送时易发生错误或丢失,但它的传送过程比较简单,易于实现,易于管理。会话方式可传送的信息量大,可靠性高,但传送过程比较复杂,在发送信息之前先要建立会话连接,信息传送结束后要撤除会话连接,不易于管理。我们在具体设计通信系统时,要根据自己的实际情况、实际要求和实际传送数据量的大小选择合适的通信方式。若A工作站和B工作站之间以数据报文方式通信,步骤如下:
  工作站A 工作站B
  a增加名字A 增加名字B
  b发送报文给B 接收
  c接收 发送报文给A
  d删除名字A 删除名字B
  若A工作站和B工作站之间以会话方式通信,步骤如下:
  工作站A 工作站B
  a增加名字A 增加名字B
  bListen Call A站
  c发送报文给B 接收报文
  d接收报文 发送报文给A
  eHang up B站 Hang up A站
  f删除名字A 删除名字B
  3.2正确选择NetBIOS命令的返回方式
  NetBIOS命令的返回方式有WAIT(等待)和NO_WAIT(非等待)两种方式。如果采用WAIT方式,则要等到NetBIOS命令完成之后才返回你的程序。如果采用NO_WAIT方式,那么又可以有两种选择:一种是采用轮询方法,即反复查询网络控制块(NCB)中的最终返回代码字段,当它的值从FF变为00时,表示NetBIOS命令完成,返回用户程序。另一种是将一个POST程序的地址告诉NetBIOS,使NetBIOS在完成命令时唤醒该程序,执行一个指定的程序段。这两种方法都是在后台进行的,它们的主要差别在于对网负荷的影响。例如,A站发出一命令,要求B站执行一项较费时的任务,如果A站采用NO_WAIT的轮询方法,不断地询问对方是否完成任务,这样会大大地增加网络负荷,这时尽管轮询比较容易编程,那也不是一种好的选择。我们在通信系统设计时,要综合各种因素,选择合适的NetBIOS命令返回方式。
  3.3分组长度的限制及差错和超时
  数据报通信,每个报文长度上限为512字节。会话通信中,每个报文长度上限为65535字节。那么,当我们要传送的数据信息大小超过所规定的限制值时怎么办呢?这时可采用分组处理的办法,按照规定的信息长度限制,将数据分为若干段,对每一段进行一次发送,在接收端再把它们装配起来复原。另一种方法是依照信息长度限制规定来设计一个数据记录的格式,这样每个报文都可安全发送。
  无论采用何种方式的通信,通信过程中差错是不可避免的,所以差错处理是必不可少的。当出现差错时,首先要根据差错代码确定差错性质,并做出相应处理,排除错误之后继续执行后面的命令。超时通常是指一个工作站向另一个工作站发出信息到收到对方应答所需时间的超时时限。
  引起超时的因素很多,一般是因为网络过于繁忙或接收站故障。
  3.4调用NetBIOS功能
  在编写通信程序中,要调用一个Net-BIOS功能,必须首先构造一个网络控制块,然后把网络控制块的地址写入ES:BX中,作为指向该控制块的远程地址指针,最后执行5CH中断,使NetBIOS自动进入ES:BX指定的地址,读网络控制块信息,从而得知有关操作信息。下面是网络控制块的格式及所对应的结构定义。
  4 NetBIOS支持下的网络通信系统的实现
  作为NetBIOS支持下的网络通信系统的实现,我们以会话通信方式下双机通信为例。
  4.1通信硬件环境要求
  两台独立的PC机各自接有网卡,通过一根同轴电缆线将其相连。同轴电缆的两端各接50Ω的匹配器,这样就从物理上连通了两台PC机。
  4.2通信软件环境要求
  DOS5.0以上版本启动,同时磁盘上应有以下文件:IPX.EXE网络通信协议;NetBIOS协议支持用户程序;TC高级语言环境,用以编写用户通信程序。
  基于Net-BIOS协议的网络通信设计方案解析
  4.3通信程序
  要实现两台PC机间的双机通信,必须编写NetBIOS支持下的双机通信程序,包括
  发送信息程序SEND.C和接收信息程序RECEIVE.C。其程序流程框图如下:
  基于Net-BIOS协议的网络通信设计方案解析
  程序略。
  这样在两台PC机上分别执行SEND程序和RECEIVE程序,就可将信息从A站(PC1机)上传送到B站(PC2机)上,实现双机通信。
  5 结束语
  实现NetBIOS支持下的计算机网络通信,可使我们更加快速、方便、经济地进行计算机间的数据传送,以达到数据通信与资源共享的目的。通过网络通信,一方面为特定环境下的用户实现计算机间的数据传送提供了重要的支持,另一方面也大大地提高了通信网络的性能。
 

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

评论(0)
发评论

下载排行榜

全部0条评论

快来发表一下你的评论吧 !

'+ '

'+ '

'+ ''+ '
'+ ''+ ''+ '
'+ ''+ '' ); $.get('/article/vipdownload/aid/'+webid,function(data){ if(data.code ==5){ $(pop_this).attr('href',"/login/index.html"); return false } if(data.code == 2){ //跳转到VIP升级页面 window.location.href="//m.obk20.com/vip/index?aid=" + webid return false } //是会员 if (data.code > 0) { $('body').append(htmlSetNormalDownload); var getWidth=$("#poplayer").width(); $("#poplayer").css("margin-left","-"+getWidth/2+"px"); $('#tips').html(data.msg) $('.download_confirm').click(function(){ $('#dialog').remove(); }) } else { var down_url = $('#vipdownload').attr('data-url'); isBindAnalysisForm(pop_this, down_url, 1) } }); }); //是否开通VIP $.get('/article/vipdownload/aid/'+webid,function(data){ if(data.code == 2 || data.code ==5){ //跳转到VIP升级页面 $('#vipdownload>span').text("开通VIP 免费下载") return false }else{ // 待续费 if(data.code == 3) { vipExpiredInfo.ifVipExpired = true vipExpiredInfo.vipExpiredDate = data.data.endoftime } $('#vipdownload .icon-vip-tips').remove() $('#vipdownload>span').text("VIP免积分下载") } }); }).on("click",".download_cancel",function(){ $('#dialog').remove(); }) var setWeixinShare={};//定义默认的微信分享信息,页面如果要自定义分享,直接更改此变量即可 if(window.navigator.userAgent.toLowerCase().match(/MicroMessenger/i) == 'micromessenger'){ var d={ title:'基于Net-BIOS协议的网络通信设计方案解析',//标题 desc:$('[name=description]').attr("content"), //描述 imgUrl:'https://'+location.host+'/static/images/ele-logo.png',// 分享图标,默认是logo link:'',//链接 type:'',// 分享类型,music、video或link,不填默认为link dataUrl:'',//如果type是music或video,则要提供数据链接,默认为空 success:'', // 用户确认分享后执行的回调函数 cancel:''// 用户取消分享后执行的回调函数 } setWeixinShare=$.extend(d,setWeixinShare); $.ajax({ url:"//www.obk20.com/app/wechat/index.php?s=Home/ShareConfig/index", data:"share_url="+encodeURIComponent(location.href)+"&format=jsonp&domain=m", type:'get', dataType:'jsonp', success:function(res){ if(res.status!="successed"){ return false; } $.getScript('https://res.wx.qq.com/open/js/jweixin-1.0.0.js',function(result,status){ if(status!="success"){ return false; } var getWxCfg=res.data; wx.config({ //debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。 appId:getWxCfg.appId, // 必填,公众号的唯一标识 timestamp:getWxCfg.timestamp, // 必填,生成签名的时间戳 nonceStr:getWxCfg.nonceStr, // 必填,生成签名的随机串 signature:getWxCfg.signature,// 必填,签名,见附录1 jsApiList:['onMenuShareTimeline','onMenuShareAppMessage','onMenuShareQQ','onMenuShareWeibo','onMenuShareQZone'] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2 }); wx.ready(function(){ //获取“分享到朋友圈”按钮点击状态及自定义分享内容接口 wx.onMenuShareTimeline({ title: setWeixinShare.title, // 分享标题 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享给朋友”按钮点击状态及自定义分享内容接口 wx.onMenuShareAppMessage({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 type: setWeixinShare.type, // 分享类型,music、video或link,不填默认为link dataUrl: setWeixinShare.dataUrl, // 如果type是music或video,则要提供数据链接,默认为空 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到QQ”按钮点击状态及自定义分享内容接口 wx.onMenuShareQQ({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到腾讯微博”按钮点击状态及自定义分享内容接口 wx.onMenuShareWeibo({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到QQ空间”按钮点击状态及自定义分享内容接口 wx.onMenuShareQZone({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); }); }); } }); } function openX_ad(posterid, htmlid, width, height) { if ($(htmlid).length > 0) { var randomnumber = Math.random(); var now_url = encodeURIComponent(window.location.href); var ga = document.createElement('iframe'); ga.src = 'https://www1.elecfans.com/www/delivery/myafr.php?target=_blank&cb=' + randomnumber + '&zoneid=' + posterid+'&prefer='+now_url; ga.width = width; ga.height = height; ga.frameBorder = 0; ga.scrolling = 'no'; var s = $(htmlid).append(ga); } } openX_ad(828, '#berry-300', 300, 250);