![]() |
中国DOS联盟-- 联合DOS 推动DOS 发展DOS --联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum |
| 游客 | 登录 | 注册 | 会员 | 搜索 | 中国DOS联盟 |
|
中国DOS联盟论坛 现在时间是 2026-09-15 00:41 |
共 47,812 主题排行 / 349,917 发帖 / 今日 0 篇 / 48,268 会员排行 |
| DOS开发编程 & 发展交流 (开发室) » [原创/教程] 用wattcp库实现dos下的TCP/IP编程 |
| 可打印版本 2,662 / 5 |
| 第1楼 cir2633 | 发表于 2010-01-29 11:20 |
| 初级用户 发帖 23 积分 52 | |
|
[原创/教程] 用wattcp库实现dos下的TCP/IP编程 起因:
原来的程序是运行在工控机上的,一般称为"下位机", 上面是ms dos71操作系统, 下位机程序负责控制机械部件,从AD卡中采集数据, 然后通过串口的方式发送到上位机(就是一台PC机,上面运行一个数据分析软件,能接收串口发来的数据并处理) 老板一句话:串口通讯太土, 改成网线通讯的! 然后就开始了我的改代码之路 偶然的机会,我在论坛找到了2003年的帖子,地址 http://www.cn-dos.net/forum/viewthread.php?tid=4451&fpage=1 未完待续, 楼下逐步更新 ------------------------------------------------ 目前正在动手做, 暂定用wattcp库头, 其他内容会逐步更新上来 现在cndos的版面狠冷清的说, 找到的帖子居然都是7年前的,,,,,,,, [ Last edited by cir2633 on 2010-4-2 at 10:35 ] |
|
| 第2楼 cir2633 | 发表于 2010-01-29 11:20 |
| 初级用户 发帖 23 积分 52 | |
|
终于做完了,把我网志里的贴上来:
http://blog.csdn.net/dos5gw/archive/2010/03/29/5429582.aspx ------------>>用wattcp库实现实模式dos下的TCP/IP通讯(总算完整了) <<-------------- ---------------------------------------------------------------------------------------------------------------- ---------------------------------------------------------------------------------------------------------------- 总之最近比较忙, 想系统的总结下实在时间窘迫,前面那篇写了一半,本来想简单写写从环境搭建到完成编码的过程, 但是仔细一看之前写的那篇, 夹杂了很多废话, 没有直切主题, 想重新编辑一下,,,,,算了,还是重新开贴吧... //---正文-------------- 首先看题目: dos 环境下, 实模式(不是DJGPP),用wattcp库, TCP/IP通讯, 其中需要注意的: 1, dos没有固定的ip, 比如dos系统运行后, 工控机连上路由器, 此时这个dos系统是没有ip地址的(别想着能ping到, 连ip都没有,拿什么ping?), 当一个支持packet driver的程序在dos系统上运行起来之后, dos才有了一个固定的ip, 这时候就可以ping到这台运行dos的主机了; 2, wattcp库,完全开源的dos下的socket库, 功能够多且稳定, 但是接口手册是收费的-_-!! 库文件下载地址:___ 3, wattcp库是基于packet driver网卡驱动规范的,所以必须找到你网卡的packet driver类型的驱动,详细见http://blog.csdn.net/dos5gw/archive/2010/01/29/5267737.aspx, ghost中的网络对拷功能就是基于wattcp库完成的; DOS下的网卡驱动安装方式比较特殊,其驱动程序一般是一个*.com或*.exe文件,首先把该网卡驱动拷贝到任意路径,比如C:\DRIVER,然后在autoexec.bat文件中加入"@网卡驱动名 网卡中断号",比如: PATH=C:\;C:\DOS7;C:\DRIVER; @E100bdos 0x62 注意第二行,我用的工控机的型号研华3355,网卡芯片是intel 82551QM,驱动程序是"E100bdos.exe", 0x60是网卡中断, 还可以是0x61,0x62,理论上0x60----0x80的中断号都可以; 4, 打开bc31,建立一个空工程(这里不推荐自己新建工程,因为bc31中的工程有很多选项,包括编译器优化选项,浮点处理选项, 所以还是找个工程模版吧,改个名就成了) 5, wattcp库 \lib目录下即是库(wattcphg.lib / wattcplg.lib / wattcpsm.lib分别对应巨/大/微模式), 添加到你的bc31建的工程里,alt+p-->add->选择对应的*.lib文件, 一般选择large or huge模式; 6, wattcp库有一个必要的配置文件"tcp.cfg", 放在程序当前目录,比如程序是在c:\tcpprogreme\路径下执行的,这个路径下就要有一个tcp.cfg,内如如下, my_ip=192.168.188.2 netmask=255.255.255.0 7, wattcp提供的是C函数库,若要编译C++程序,需要在包含头文件前加入如下指令: #ifdef _cplusplus extern "C"{ #include "wattcp.h" } #endif 8, 这样就能引用wattcp里面的函数了,下面介绍几个重要函数, wattcp提供了很多功能类似可选择, 其实用不到那么多, 记住下面几个就行了, (1)void sock_init(),读取tcp.cfg里的设置参数, 初始化协议栈, (2)struct tcp_Socket, 很重要的结构体, 相当于当前socket的句柄; (3)void sock_mode( tcp_Socket *s, word mode ); 设置传输模式 (4)int tcp_listen( tcp_Socket *s, word lport, longword ina, word port, int (*signal_handler), word timeout ); 一般用在服务器端,比如你想在dos端做server, 并上开一个监听, 第二参数lport是本地监听端口; (5)int tcp_open( tcp_Socket *s, word lport, longword ina, word port, int (*signal_handler)); 一般用在client端, 请求远端的socket连接. port参数是对方的监听端口; (6)word sock_established(tcp_Socket *s );等待连接建立,一般用在server端,在listen函数之后; (7)word tcp_tick( tcp_Socke *s ); 协议栈执行, 注意这个函数要在程序里 隔一段时间执行一次, 最好放在循环里(dos下的程序本来就是循环吗-_-!!),如果长时间没执行次函数, 后果~不清楚~ (8)int sock_gets( tcp_Socke *s, char *text, int len )和char sock_puts( tcp_Socke *s, char *text ),分别是读,写函数用法很简单,类似puts()和gets(),比如sock_puts(&s,"hello wattcp")就是向对端发送文本消息,这两个函数只能在sock_mode( s, TCP_MODE_ASCII );之后,也就是设置为asc码传输模式时才能用,不过不推荐这两个读写函数,因为如果你的待发送数据缓冲char里有"0x00"这样的数据, 也就是asc码的'\0',那么sock_puts会认为是字符串的结束符而丢弃第一个'\0'之后的字符; (9)int sock_fastread(tcp_Socke *s, byte *dp, int len )和int sock_write( tcp_Socke * s, byte *data, int len );二进制方式的读写函数,返回值是读/写成功的字符数,推荐用这两个读写,就不会出现(8)中的问题了; (10)不要用int sock_read !! int sock_fastread和它的区别在于,sock_read是阻塞函数, 比如执行sock_read(&sock,ReceiveBuff,LEN)后, 函数会一直阻塞在此函数, 知道读到LEN个字节为止,而 sock_fastread则不会阻塞; 9, 代码示例1,用wattcp实现一个服务端程序,开启后在某个端口等待socket连接请求, 具体见6楼 ; 10, 如果你想写dos环境下的的客户端程序, 请参考:http://www.wangchao.net.cn/bbsdetail_147812.html ---完---终于做完了,把我网志里的贴上来: [ Last edited by cir2633 on 2010-4-2 at 10:46 ] |
|
| 第3楼 shenyouzhe | 发表于 2010-02-24 16:13 |
| 新手上路 发帖 4 积分 10 | |
|
等待中
|
|
| 第4楼 dalong7137 | 发表于 2010-03-16 20:42 |
| 新手上路 发帖 8 积分 18 | |
|
期待楼主分享
|
|
| 第5楼 cir2633 | 发表于 2010-04-02 10:40 |
| 初级用户 发帖 23 积分 52 | |
|
------------------------附件醒目--------------------------
-------------------------------------------------------------- --------------------------------------------------------------- 汗,,,貌似不支持大附件,上传至http://download.csdn.net/source/2194787 目录说明: \borland c++ 3.1代码例子: 改为英文目录,可在dos环境下用bc31执行build all; \dos下的网卡驱动: 包括Realtek,intel网卡驱动; \wattcp: wattcp库及代码 \windows环境sock调试工具: 可以建立多个TCP/UDP客户端/服务端,发送/接受文本/二进制消息; [ Last edited by cir2633 on 2010-4-2 at 10:50 ] |
|
| 第6楼 cir2633 | 发表于 2010-04-02 10:43 |
| 初级用户 发帖 23 积分 52 | |
|
接2楼代码例子 (1)--WATTEST.H--文件
view plaincopy to clipboardprint? #define _CPLUSPLUS #ifdef _CPLUSPLUS extern "C"{ #include "tcp.h" typedef unsigned long DWORD; } #endif (2)--WATTEST.CPP--文件 view plaincopy to clipboardprint? #include "WATTEST.H" #include <stdio.h> #include <dos.h> #include <string.h> static tcp_Socket s; //定义句柄,保证程序内全周期有效 unsigned char addr_buff[20]; unsigned char send_buff[30]="transmission ok..."; unsigned char receive_buff[128]; unsigned char msg[]="please send msg to server"; int listen_port=9109; //服务端的监听端口 void main(void){ //borland c++里支持void main()的,,, int status; sock_init(); //初始化协议栈 sock_mode(&s,TCP_MODE_BINARY);//二进制传输模式 printf("_sock_init success !\n"); tcp_listen(&s,listen_port,0,0,NULL,0);//在指定端口处监听 printf("_sock_listen @ %-16s:%5d !\n",inet_ntoa(addr_buff,gethostid()),listen_port); while(!sock_established(&s)) //等待客户端连接 { tcp_tick(&s); //协议栈执行 delay(100); } printf("tcp has been sock_established... \n"); //打印此句,表示已经连接 sock_write(&s,msg,sizeof(msg));//向客户端发送 //sock_puts(&s,"connected! \n"); //向服务端发送信息 do{ if(sock_dataready(&s)){//判断有数据发过来 memset(receive_buff,'\0',100); sock_fastread(&s,receive_buff,100); //接受数据 printf("received: %s\n",receive_buff); sock_write(&s,send_buff,sizeof(send_buff));//向client发送 } }while(tcp_tick(&s)); //sock_established()出错后默认goto此标签 sock_err: printf("!!! sock_wait_established fff error ! \n"); sock_close(&s); } |
|
|
[ 联系联盟系统管理团队 -
中国DOS联盟 -
标准版 ] Sponsored by ifanr Inc | © 2001–2023 |