实现dos real model下的TCP/IP编程(下)
http://blog.csdn.net/dos5gw/archive/2010/03/29/5429582.aspx
可能现在用DOS的人很少了, 在DOS下做开发的人更少
原因很多, 不再赘述
but现在工控方面, 用dos的人还是不少, 尤其dos622和dos71还在很多工控机,pos机,还有超市收银台的终端上平稳运行着
本来没空研究这DOS下的TCP/IP网络编程, 但是老大给我布置了一个任务, 把原来的老程序(采用串口通讯)改造成RJ45,即网卡通讯;
翻了不少资料, 最后确定了一个大体计划,
1 dos下装网卡驱动, 一定得是packet driver规范的,原因后面会解释,
2 找一个合适的DOS环境使用的TCP函数库, 并按照readme完成一个简单的通讯程序,
3 把老程序中的串口部分剥离出来,,,,,,,,
4 为了不影响其他模块,原串口使用的函数原型尽量不变, 只改函数体
关于DOS下的TCP函数库, 暂定了4种方案. wattcp, dsock, ertos, 还有的client for dos, 最终确定了用wattcp,因为开源,简洁,能直接达到用网卡通信的目的;
and 由于这些资料很古老所以很难找,不过还是找到一些线索,作为参考
http://hengch.blog.163.com/blog/static/1078006720083391831884/
http://www.wangchao.net.cn/bbsdetail_147812.html
第一个链接主要介绍用DJGPP+WATT-32库来实现的, 因为我不需要dos下的保护模式编程, 所以我用的是bc31+wattcp库来实现;(这个WATT-32大概是wattcp的保护模式升级版本),所以没找到什么对我有直接帮助的东西
第二个用了borland c++ 4.5,比我用的bc 3.1有些区别, 比如工程的创建等等,,,不过这个帖子里有个客户端的代码实例,可以大体窥见wattcp中一些函数的用法, 不过,,,我要做的是dos工控机端(下位机)作为server, xp(上位机)上运行client程序,和这个介绍正好相反,囧
//---分隔符:网卡驱动的安装--------------------------------------------------------------
(1)dos驱动的安装, dos的网卡驱动分2大类, packet dirver和ndis, 前者的规范可在http://blog.hengch.com/specification/packetdriver.pdf看到, 一般的说, 前者的驱动一般是*.com格式. 而后者是*.dos格式,
由於wattcp库是基于packet driver的, 故必须找到你机器网卡的packet driver驱动,我的工控机是研华3355,在g歌上找了很久才从一个很古老的论坛上翻出来了这个驱动.
如果你的网卡很不幸的只有ndis类型的驱动, 可以参考下面的文章, ndis转pd:http://www.cn-dos.net/forum/viewthread.php?tid=33390&fpage=1
这里有几种厂商的网卡驱动:http://www.cublog.cn/u/15901/showart_204285.html, 还介绍了DOS网络启动盘的做法. 值得一看
dos网卡驱动的安装方法不同于win下的安装方式, 以我的为例,研华3355的网卡型号是,,,额,,,记不清了,,,开机bios可以看到, 驱动是一个.com文件,
文件名是"E100BPKT.COM", 在autoexec.bat里加入"@E100BPKT 0x60", 这样加载的, 其中,0x60为中断向量, 常用的还有0x62,我的工控机的autoexec.bat是这样的:
PATH=C:/;C:/DOS7;C:/DRIVER;
@E100BPKT 0x60
大概就是这样吧,,记不太清了,,,
//---分隔符:编程环境的建立--------------------------------------------------------------
为了方便, 我用了vmware虚拟机, 然后装dos 7, 然后拷贝一个bc31,,,,,,,,,,,
值得一提的是, 现在用vmware玩dos的人很多, 但是却不知道wmware虚拟网卡的型号, 我尝试用intel的驱动, 结果失败, 后来才知道vmware使用的是"AMD PCNet"网卡, 驱动在http://www.cublog.cn/u/15901/showart_204285.html可以下载到, 加载方式有些变化和前面提到的类似:@pcntpk int=0x60,
打开bc31,建立一个空工程(这里不推荐自己新建工程,因为bc31中的工程有很多选项,包括编译器优化选项,浮点处理选项, 所以还是找个工程模版吧,改个名就成了)
接着写vmware上的配置, 虚拟机链接方式选host-only, xp里启用vm8,ip设置:192.168.221.1, mas:255.255.255.0, 网关空,
wattcp的配置文件tcp.cfg里如下:
myip= 192.168.221.10
netmask=255.255.255.0
gateway=192.168.1.252
具体的例子参考/APPS目录下的tcp.cfg, 这个文件必须放在程序的当前目录下
wattcp不但提供了整个函数库的源代码和makefile,还提供了用wattcp写的几个例子, 在/apps目录下, 把常用的几个网络命令都用c实现了
make一下, 就会自动编译链接, 用刚生成的ping.exe试~~~~~~
//--下为引用:---------------------------------------------------------------------------------
一些对不熟悉DOS网络应用的人的帮助
大体上和Windows下的网络支持具有相似的层次,MS Client中也包含相应的“网卡”、“协议”和“网络客户”几个层次的内容。但是包驱动则是独立的一支。这里提供的网络启动盘中的网络连接是大体符合下面的结构的:
基于包驱动的应用程序 基于微软网络客户的对网络共享的访问
| |
dis_pkt.dos MS Client提供的三种协议及微软网络客户
| |
/-------------------+---------------------/
|
PROTMAN.EXE和网卡驱动模块
可以看出,包驱动支持是独立于MS Client提供的几种协议的,就是说它不需要MS Client的任何协议的支持就能运行,也能和它们自由组合。另外,这也意味着基于包驱动的TCP/IP应用程序完全不使用MS Client的TCP/IP支持。所以如果用MS Client自带的ping.exe去测试用包驱动建立的PPPoe连接就是驴唇不对马嘴了。
启动盘里提供了一个pdping.exe是个基于包驱动的ping工具,注意它使用的不是ICMP而是TCP来ping的。不幸的是因此它需要知道自己的IP地址才能工作,而启动盘里建立PPPoe连接的ADSL.BAT脚本为了简化工作,一律把自己的IP地址设成一个假的255.255.255.254,这对象Arachne或Lynx等很多别的实际应用来说是没什么影响的,可是却使这个pdping工作起来不正常了。所以不要用它来测试PPPoe连接,建议直接用Lynx打开个网站直接看一下就知道能不能用了。ADSL.BAT是toggle型的工作方式,第一次运行是拨号,第二次是挂机。本文其它部分还有一些关于PPPoe支持的说明,在此不赘述。
对wattcp应用程序来说(使用包驱动的一类),必要时可以直接修改环境变量或wattcp.cfg文件中的配置,大多数情况下不用重新启动电脑、只要重新进入一下要用的应用程序就可以,因为这里面的配置不驻留在内存里。而在使用MS Client的协议时,变更了配置必须重新启动。
关于通过微软网络客户访问共享资源的一些注意事项也在前面提到,你必须自己用net use建立对其它机器上的网络共享的映射,或用net share在本机上创建共享。需要的话请看net help提供的简单帮助。
//--上为引用:----------------------------------------------