• WINDOWS (服务器) 和 DOS(客户端) 网络互连 基于TCP/IP的编程实现


    一:系统的提出
      在网络技术的发展下,基于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.com
    C:/NET/umb.com
    C:/NET/tcptsr.exe
    C:/NET/sockets.exe   
    C:/NET/tinyrfc.exe
    C:/NET/nmtsr.exe
    C:/NET/emsbfr.exe
    C:/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( &current_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

  • 相关阅读:
    MyBatis3: There is no getter for property named 'code' in 'class java.lang.String'
    jQuery获取Select选择的Text和 Value(转)
    mybatis3 :insert返回插入的主键(selectKey)
    【转】Mybatis/Ibatis,数据库操作的返回值
    Android问题-打开DelphiXE8与DelphiXE10编译空工程提示“[Exec Error] The command exited with code 1.”
    Android问题-打开DelphiXE8与DelphiXE10新建一个空工程提示"out of memory"
    BAT-使用BAT生成快捷方式
    给 TTreeView 添加复选框
    跨进程发送消息数据
    鼠标拖动虚影效果
  • 原文地址:https://www.cnblogs.com/hehe520/p/6329836.html
Copyright © 2020-2023  润新知