用wattcp库实现实模式dos下的TCPIP通讯(总算完整了)_第1页
用wattcp库实现实模式dos下的TCPIP通讯(总算完整了)_第2页
用wattcp库实现实模式dos下的TCPIP通讯(总算完整了)_第3页
用wattcp库实现实模式dos下的TCPIP通讯(总算完整了)_第4页
用wattcp库实现实模式dos下的TCPIP通讯(总算完整了)_第5页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、用wattcp库实现实模式dos下的TCP/IP通讯(总算完整了) 收藏之前的文章在这:实现dos real model下的TCP/IP编程(上)总之最近比较忙, 想系统的总结下实在时间窘迫,前面那篇写了一半,本来想简单写写从环境搭建到完成编码的过程, 但是仔细一看之前写的那篇, 夹杂了很多废话, 没有直切主题, 想重新编辑一下,算了,还是重新开贴吧./-正文-首先看题目: dos 环境下, 实模式(不是DJGPP),用wattcp库, TCP/IP通讯, 其中需要注意的:1, dos没有固定的ip, 比如dos系统运行后, 工控机连上路由器, 此时这个dos系统是没有ip地址的(别想着能pi

2、ng到, 连ip都没有,拿什么ping?), 当一个支持packet driver的程序在dos系统上运行起来之后, dos才有了一个固定的ip, 这时候就可以ping到这台运行dos的主机了;PATH=C:;C:DOS7;C:DRIVER;E100bdos 0x62注意第二行,我用的工控机的型号研华3355,网卡芯片是intel 82551QM,驱动程序是"E100bdos.exe", 0x60是网卡中断, 还可以是0x61,0x62,理论上0x60-0x80的中断号都可以;4, 打开bc31,建立一个空工程(这里不推荐自己新建工程,因为bc31中的工程有很多选项,包括编

3、译器优化选项,浮点处理选项, 所以还是找个工程模版吧,改个名就成了)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,内如如下,7, wattcp提供的是C函数库,若要编译C

4、+程序,需要在包含头文件前加入如下指令:#ifdef _cplusplusextern "C"#include "wattcp.h"#endif8, 这样就能引用wattcp里面的函数了,下面介绍几个重要函数, wattcp提供了很多功能类似可选择, 其实用不到那么多, 记住下面几个就行了,(1)void sock_init(),读取tcp.cfg里的设置参数, 初始化协议栈,(2)struct tcp_Socket, 很重要的结构体, 相当于当前socket的句柄;(3)void sock_mode( tcp_Socket *s, word mode

5、); 设置传输模式(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、方的监听端口;(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 ),分别是读,写函数用法很简单,类

7、似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

8、 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-文件view p

9、laincopy to clipboardprint?#define _CPLUSPLUS#ifdef _CPLUSPLUSextern "C"#include "tcp.h"typedef unsigned long DWORD;#endif#define _CPLUSPLUS#ifdef _CPLUSPLUSextern "C"#include "tcp.h"typedef unsigned long DWORD;#endif(2)-WATTEST.CPP-文件view plaincopy to clipboa

10、rdprint?#include "WATTEST.H"#include <stdio.h>#include <dos.h>#include <string.h>static tcp_Socket s; /定义句柄,保证程序内全周期有效unsigned char addr_buff20;unsigned char send_buff30="transmission ok."unsigned char receive_buff128;unsigned char msg="please send msg to s

11、erver"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

12、_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"); /向服务端发送信息doif(sock_dataready(&

13、;s)/判断有数据发过来memset(receive_buff,'0',100);sock_fastread(&s,receive_buff,100); /接受数据printf("received: %sn",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

14、 error ! n");sock_close(&s);#include "WATTEST.H"#include <stdio.h>#include <dos.h>#include <string.h>static tcp_Socket s; /定义句柄,保证程序内全周期有效unsigned char addr_buff20;unsigned char send_buff30="transmission ok."unsigned char receive_buff128;unsigned char m

15、sg="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_l

16、isten %-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"); /向服务端发送信息doif(sock_dataready(&s)/判断有数据发过来memset(receive_buff,'0',100);sock_fastread(&s,receive_bu

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论