实现dos real model下的TCP/IP编程(上)
来源:互联网 发布:hybbs2.0论坛源码 编辑:程序博客网 时间:2024/05/17 01:55
首先看题目: 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库, 功能够多且稳定, 但是接口手册是收费的-_-!! 库文件下载地址:http://dos5gw.download.csdn.net/ ;
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
gateway=192.168.188.252
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, 服务端代码:
(1)--WATTEST.H--文件
- #define _CPLUSPLUS
- #ifdef _CPLUSPLUS
- extern "C"{
- #include "tcp.h"
- typedef unsigned long DWORD;
- }
- #endif
(2)--WATTEST.CPP--文件
- #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);
- }
10, 如果你想写dos环境下的的客户端程序, 请参考:http://www.wangchao.net.cn/bbsdetail_147812.html
---完---
- 实现dos real model下的TCP/IP编程(上)
- 实现dos real model下的TCP/IP编程(上) 关键字dos, socket, tcp ip, wattcp
- 实现dos real model下的TCP/IP编程(下)
- 纯DOS下的 TCP/IP编程
- C语言实现DOS下的TCP/IP通信
- WINDOWS (服务器) 和 DOS(客户端) 网络互连 基于TCP/IP的编程实现
- WINDOWS (服务器) 和 DOS(客户端) 网络互连 基于TCP/IP的编程实现
- WINDOWS (服务器) 和 DOS(客户端) 网络互连 基于TCP/IP的编程实现
- WINDOWS (服务器) 和 DOS(客户端) 网络互连 基于TCP/IP的编程实现
- WINDOWS (服务器) 和 DOS(客户端) 网络互连 基于TCP/IP的编程实现
- 用wattcp库实现实模式dos下的TCP/IP通讯(总算完整了)
- 用wattcp库实现实模式dos下的TCP/IP通讯
- TCP/IP编程实现
- tcp/ip编程之多客户端的实现
- windows下tcp ip栈的实现
- TCP/IP 在 Windows 下的实现
- Linux下的TCP/IP编程----多播和广播的实现
- linux下用TCP/IP编程实现远程文件传输
- static关键字的作用
- 华为内部面试题库---(16)
- 热迁移save分析(3)
- 九度1502(折半法)
- 精选面试算法的实现之一
- 实现dos real model下的TCP/IP编程(上)
- win7系统下安装SQL2005(SQL Server 2005)图文教程
- error C2036: “void *”: 未知的大小
- 实现单元测试
- DataGridView单元格合并(画边框实现)
- POI读取Excel方式两种遍历方式
- [小代码]从resources里播放视频文件
- 想發表短片,用Youtube 還是 Vimeo?
- tomcat虚拟路径的几种配置方法