一:系统的提出 在网络技术的发展下,基于LIN网的应用有成本低,速度快等特点. 由于客户机在商场pos机或者是工业现场通常采用DOS环境(因其实时和易于操作硬件, 以及占用磁盘空间少等特点),而在服务器端因界面设计和友好的用户接口常采用WIN9x开发二:WIN9X端的实现 采用流行的WIN9X的网络设置与wsock32.ocx控件配合编程,可以使用 vb编写服务器界面实现 ,本系统采用tcp协议。 具体实现比较简单,网上有大量的例子。四:DOS端网络设置
dos客户端需要安装ms-client for msdos(winnt4光盘上有,dos时代用的联网程序)
在AUTOEXEC.BAT中加载MS CLIENT FOR DOS的SOCKETS.EXE 套接字驱动程序
AUTOEXEC.BAT文件
c:/NET/netbind.comC:/NET/umb.comC:/NET/tcptsr.exeC:/NET/sockets.exe C:/NET/tinyrfc.exeC:/NET/nmtsr.exeC:/NET/emsbfr.exeC:/NET/net start
修改net目录下的tcputils.ini文件,在[tcpglobal]段中加上hostname=localhost(你的机器名)
五:DOS端软件设计 采用tcp协议 例程如下:
//开发环境:DOS622 BC++3.1
/********************************************文 件 名:client.c开发成员:吴建平功 能:DOS客户端发送消息最后修改:2001-08-20*********************************************/
//服务器名称从ini文件中取得//用户输入消息后发送 #include <time.h>#include <stdlib.h>#include <stdio.h>#include <string.h>#include <mem.h>#include <netdb.h>#include <sys/types.h>#include <sys/socket.h>#include <netinet/in.h>#include <sock_err.h>
#define BUFFER_SIZE 1000#define LINE_LEN 70#define INI_FILE "netsend.ini"
char sendbuf[BUFFER_SIZE];char recvbuf[BUFFER_SIZE];struct sockaddr_in server_addr, client_addr;
int f_getinikey(char * fname,char *section,char *key,char *value); int sleep(int seconds ){ long start_seconds, current_seconds, end_seconds;
time( &start_seconds ); end_seconds = start_seconds + (long) seconds;
do { time( ¤t_seconds ); } while ( current_seconds < end_seconds ); return( 0 );} /*** 这个程序是一个sockets 客户端,它将尝试连接到一个远程服务器节点,发送数据,然后接收*/
main( argc, argv )int argc;char *argv[];{ int rc, i, len, total, size, sd, seconds; char ls_server_ip[20]; char ls_localhost_name[20]; if ( argc < 2 ){ printf( "用法: %s <消息> /n", argv[0] ); exit( 1 ); }
/********************************************************************** *从配置文件中读机器ip地址 **********************************************************************/ memset(ls_server_ip,0x00,sizeof(ls_server_ip)); if(f_getinikey(INI_FILE,"Server","IP",ls_server_ip) <= 0){ printf( "取服务器地址配置文件[netsend.ini]时出错/n"); exit( 1 ); } memset(ls_localhost_name,0x00,sizeof(ls_localhost_name)); if(f_getinikey(INI_FILE,"LocalHost","HostName",ls_localhost_name) <= 0){ printf( "取本机地址配置文件[netsend.ini]时出错/n"); exit( 1 ); }
/*
** 建立一个局部通讯端点 */
sd = socket( AF_INET, SOCK_STREAM, 0 ); if ( sd < 0 ) { printf( "错误: socket() 调用失败 w/rc=%d, errno=%d/n", sd, errno ); exit( 1 ); } printf( "socket() 返回 %d/n", sd );
/*
** 用必要的信息填充socket地址结构
** 远程服务器节点(引入连接的远程节点IP地址 和 端口)尝试连接服务器
** 调用 until循环 直到 远程服务器连接成功或超时
*/
server_addr.sin_family = AF_INET; server_addr.sin_port =htons(6000); server_addr.sin_addr.s_addr = inet_addr( ls_server_ip );
rc = connect( sd, (struct sockaddr *) &server_addr, sizeof(server_addr) ); if ( rc < 0 ) { printf( "错误: connect() 调用失败 w/errno=%d/n", errno ); close_socket( sd ); exit( 1 ); } printf( "确定连接 0x%lx/n", server_addr.sin_addr ); //seconds = atoi( argv[4] ); seconds = 1 ; printf( "等待 %d 秒 在发送数据前.../n", seconds ); sleep( seconds );
/* ** Send the number of bytes specified on the command line to the server. */
//for (i=0; i<size; i++) // sendbuf[i] = ( i % 26 ) + 'a'; strcpy( sendbuf,ls_localhost_name); strcat( sendbuf,"|");
for (i=1; i<argc;i++) strcat( sendbuf, argv[i]);
//strcpy(sendbuf , "hello,server!"); size = strlen(sendbuf) ; len = send( sd, sendbuf, size, 0 );
total = 0; printf( "正在尝试接收数据/n" ); do { len = recv( sd, &recvbuf[total], size-total, 0 ); if ( len < 0 ) { printf( "错误: recv() 调用失败 w/errno=%d/n", errno ); close_socket( sd ); exit( 1 ); } printf( "recv() 返回 %d 字节/n", len ); total += len; } while ( total < 2 );
printf( "接收缓冲区:/n" ); for (i=0; i<len; i++) { printf( "%c", recvbuf[i] ); if ( i % LINE_LEN == LINE_LEN - 1 ) { printf( "/n" ); } } printf( "/n" ); printf("消息发送成功/n") ;
/* ** 所有数据传输完成后,关闭socket后退出. */ close_socket( sd ); exit( 0 ); return;}
在项目文件中需包含dos_socket.lib,在mircrosoft tcp/ip sdk for dos 1.0中有
微软的开发包(微软提供)比较适合 TCP/IP的套接字开发
Microsoft TCP/IP Sockets Development Kit 1.0 for dos & windows 开发包
http://www.csdn.net/develop/article/files/mstcpsdk.rar
(感谢郭红俊帮助上传)
coolstar 修改于2002-07-02