王朝网络
分享
 
 
 

手把手教你实现DOS下的TCP/IP通信

王朝other·作者佚名  2006-01-31
宽屏版  字体: |||超大  

本文来自于在POS机(DOS)和PC机(Windows2000)之间进行TCP/IP通信的实现心得。

记得刚接手这个任务时,我真是有点一筹莫展,无从下手。用什么语言?用什么编译器?该怎么实现?在DOS这个过气的操作系统下,是否能找到现今网卡的DOS版驱动程序,又如何给网卡安装驱动程序…,这些都让我这个没从事过DOS操作系统开发的程序员疑问重重。后来搜索了相关资料,得知早前曾经有个外国网站www.wattcp.com提供了免费的WATTCP库来实现DOS中的TCP/IP协议栈。满心欢喜的下载下来,却发现尽管库本身不要钱,但是库的说明文档却要不是免费的午餐。没有了说明文档那层库就像块鸡肋摆在眼前,食之无味,弃之可惜。后来继续辗转于google,百度,CSDN之间,我的那一整周,焦头烂额间踏遍了网络的东南西北。所幸后来遇到能人,承其指点,加上自己的摸索,终于完成了任务。由于这方面的资料在国内的网站上零零散散,并不好找,而从事DOS下网络编程的人员还大有人在(特别是在嵌入式领域),我会将整个过程从头到尾,在本文中一一道来。本文旨在为那些不得不和DOS打交道的网络开发人员能够少走些弯路。

从一开始着手这个任务,我就确定了一个方向:必须要找到能够在DOS下控制SOCKET的库。若非如此,在有限的时间和本人有限的水平下,要自己去完成TCP/IP协议栈,基本不太可能。我手头的这层库叫ERTOS,从WATTCP库拓展而来(不仅实现了TCP/IP协议栈,还实现了DOS下多线程)。能够获取这层库及头文件,我得感谢珠海某公司陈道理朋友的热情帮助。

下面言归正状,开始手把手教你完成DOS下的TCP/IP通信。

一、环境

编译环境:Windows98 BC4.5 for DOS, 编译器的下载地址在:http://www.alaum.com/down/bc45.rar

客户端程序运行环境: DOS622

服务端程序:VC++6.0, Windows2000Sev

BC4.5 for DOS工程创建:

安装成功后。找到BC4.5所在目录,将include文件夹下的所有.h文件复制进去,这是ERTOSTCP所必须的头文件。然后打开BC4.5,选择菜单project->new project。设置工程路径,工程名为TCPC.IDE。Platform选择DOS(Standard),其他默认,点击OK按钮创建新工程。新工程创建后编译器默认创建了一个与工程同名的.cpp文件,删除之。在工程同目录下创建空白的tcpc.c文件,在BC4.5的工程视图中把这里提供的ertostcp.lib,rtos.lib以及tcpc.c文件全部包含进来。这样工程就创建完毕了。

二、网卡驱动的安装:

该库以DOS Ethernet Packet Driver作为底层驱动。Packet Driver是一个硬件相关的设备驱动程序,不同网卡的Packet Driver是不同的,一般可在网卡安装盘DOS目录或PCPKT目录下找到,也可到www.simtel.net下载。找出目录下的.com文件(可能有好几个,可以逐个试),以我的任务为例,我使用过NE2000兼容网卡和D-LINK网卡,都在它们的驱动包里找到了Packet Driver。放入DOS中手工运行.com文件:NE2000 0x62或者DLKFET 0x62(62和60都是网卡的中断号,二者皆可)。成功后会出现网卡信息,显示正确的网卡mac地址,否则,提示错误信息或者显示网卡的广播地址。告诉你Packet Drive和网卡不匹配。安装成功后,系统即可运行TCP/IP程序,可将该命令加载到Autoexec.bat文件中。Packet Drive需在每次系统启动后重新加载;

另外,建议在Config.sys中加入对扩展内存的支持,并将DOS驻留到高端。下面是一个完整的Config.sys文件的例子。

Config.sys

DEVICE=HIMEM.SYS

DOS=HIGH,UMB

FILES=40

三、代码编写:

准备工作都做完了,接下来即可编写代码了。

以下为客户端代码例子:

#include <stdio.h>

#include <string.h>

#include <rtos.h>

#include <net.h>

#include <mem.h>

#include <stdlib.h>

#include <ctype.h>

void main(void)

{

static tcp_Socket s;

char remotbuf[100] = "lanry";

char serverIp[20] = "192.168.0.100"; //服务器IP地址

char AddrBuf[50];

char szRead[512];

DWORD host;

int status;

int rlen = 5;

sock_init(); /*初始化协议栈*/

printf("WATTCP.CFG address is: [%s]\n", inet_ntoa(AddrBuf, gethostid()));

printf("Connecting to %s:%d\n", serverIp, 9104);

host = inet_addr(serverIp); /*服务器端IP*/

if(!tcp_open(&s, 0, host, 9104, NULL)) /*连接服务器*/

{

printf("Unable to open TCPC session\n");

goto sock_err;

}

printf("Wating to be established\n\r");

sock_wait_established(&s, sock_delay, NULL, &status);

printf("Connection is Successful!\n");

/*以下代码用户可以根据需要修改*/

while(1)

{

rt_sleep(10);

tcp_tick(NULL); //给协议栈执行机会

sock_write(&s, (byte *)remotbuf, rlen); //向服务端发送信息

//接收服务端发送来的信息

if(sock_dataready(&s))

{

memset(szRead, 0, 512);

//无阻塞接收数据,另外一个阻塞接收数据函数为sock_read

sock_fastread(&s, (byte*)szRead, sizeof(szRead));

}

}

sock_err:

puts("Unable to connect to the server!\n");

sock_close(&s);

}

编译运行看看,98下是否出现“NO PACKET DRVIER FOUND”?

没问题,因为PACKET DRIVER是针对纯DOS下的驱动,所以98下无法进行socket初始化。

四、设置IP:

在DOS系统下IP的概念不只是相对机器而言,也相对程序而言。同一台机器中不同的TCP程序也可有不同的IP。机器的IP地址只有在程序运行时才能确定。使用WATTCP库的TCP程序,其IP设置在程序同目录下的wattcp.cfg文件中。Socket初始化时系统在当前路径和设置路径中查找配置文件,把配置文件放在当前路径下以便系统能找到配置文件。最小的配置文件包含以下内容:本地IP 地址、子网掩码、网关。例如:

my_ip=192.168.0.8 #IP地址

netmask=255.255.255.0 #子网掩码

nameserver=192.168.0.1 #名称服务器

gateway=192.168.0.1 #网关

domainslist="uwaterloo.ca" #域列表

配置文件可以包含任何服务器或客户机需要的参数。如ftp服务的密码等。若只是进行C/S模式通信,则按如上配置文件已经够用。

五、测试

既然是C/S模式编程,有客户端也应该有服务端,读者可自己写个简易服务端以供测试。PC和PC之间可使用对等线或普通网线互连,服务端设置好IP,客户端重启进入DOS系统,加载PACKET DRIVER。确保wattcp.cfg设置正确。可以运行程序了。呵呵,是不是看到服务端在accept函数上的断点跳过去了?如果答案是肯定的,我的这篇文章目的也达到了!

点击下载源代码

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
>>返回首页<<
推荐阅读
 
 
频道精选
 
静静地坐在废墟上,四周的荒凉一望无际,忽然觉得,凄凉也很美
© 2005- 王朝网络 版权所有