你好,欢迎来到电脑编程技巧与维护杂志社! 杂志社简介广告服务读者反馈编程社区  
合订本订阅
 
 
您的位置:杂志经典 / 网络与通信
基于VxWorks网络通信系统的研究(中)
 

(2)函数编制

在主机打开VxWorks应用程序开发工具Tornado,新建立一个“可下载的应用模块”工程,然后在该工程中新建一个“C/C++source File”文件,取名为mypro.c。在该文件中加入初始化函数如下所示:

void init(int mode)

{

    /*建立本地的侦听用套接字listenSkt bindlisten*/

    if(flagNetInit==0x02)

        return;

    if((mode == 0) && (flagNetInit == 0))

    {

        if((listenSkt = socket (AF_INET, SOCK_STREAM, 0)) == ERROR)

                        return;

        sockAddrSize = sizeof (struct sockaddr_in);

        bzero ((char *) &serverAddr, sockAddrSize);

        serverAddr.sin_family = AF_INET;

 

        serverAddr.sin_len = (u_char) sockAddrSize;

        serverAddr.sin_port = htons (LOCAL_SERVER_PORT);

        serverAddr.sin_addr.s_addr = htonl (INADDR_ANY);

        if (bind (listenSkt, (struct sockaddr *) &serverAddr, sockAddrSize) == ERROR)

        {

            close(listenSkt);

            return;

        }

        if (listen (listenSkt, 1) == ERROR)

        {

            close (listenSkt);       

            return;

        }

        flagNetInit=0x01;  

    }

    /*接收外部联接,建立通讯套接字commuSkt*/

    if(flagNetInit==0x01)

    {

        sockAddrSize = sizeof (struct sockaddr_in);

        commuSkt = accept(listenSkt, (struct sockaddr*)(&clientAddr), &sockAddrSize);

        if(commuSkt==ERROR)

        {

            close (listenSkt);

            return;

        }

        setsockopt (commuSkt, IPPROTO_TCP, TCP_NODELAY, &optval, sizeof (optval));

    }

}

2.命令接收

1)主要用到的函数

int recv(int s,char *buf,int bufLen,int flags)

该函数用于从已经建立的基于连接的套按字中接收数据。

2)数据格式

在网络通讯中规定统一的发送或接收的数据格式。设定一次发送或者接收的帧长度最大为1024B。每一组数据的前8B格式固定,byte7之后的数据也被称为命令参数,是长度不固定、解释方式由命令号决定的纯数据。通讯协议中使用的基本帧格式如图3所示。


3  通信中数据的基本格式

3)函数编制

数据接收方式采取循环接收方式,先接收8B长度的首帧数据,从该数据中取出byte3byte4计算出所要接收数据的长度len,然后再接收len-8的数据长度。具体编制方法在mypro.c中加入如下函数:

void RecCmd ()

{

    unsigned char *pBuff;

    int lenAll;

    char state=STATUS_NORMAL;  

    while(1)

    {

        if(netRecvSize(buff,8)!=STATUS_NORMAL)

            break;

        else       

        {

            lenAll = ((buff[2]*0x1000000)&0xFF000000)+

((buff[3]*0x10000)&0xFF0000)+((buff[4]*0x100)&0xFF00)+buff[5];

            pBuff = malloc(lenAll*sizeof(char));

            if(pBuff!=NULL)

            {

                memcpy(pBuff,buff,8*sizeof(char));

                if(lenAll>8)

                    state = netRecvSize(pBuff+8,lenAll-8);

            }

        }

    }

}

char netRecvSize(unsigned char *pBuff, int len)

{

    while(len>0)

    {

        recvLen = recv(commuSkt,pBuff+len-remainLen, remainLen,0);

        if( (recvLen==ERROR) || (recvLen ==0) )

            return(STATUS_ERROR);

        len = len-recvLen;

    }

    return(STATUS_NORMAL);

}

3.命令处理

将接收到的数据首帧的byte0byte1取出计算出命令字,根据命令字进行相应的操作。在命令处理中采用0x7300来产生10个随机数,然后将10个随机数转换成字符串(各随机数之间加字符’x’隔开)存入字符串数组中向上位机发送,0x7400退出程序。

void CmdExplain()

{

    unsigned char *pBegin;

    int     CMDNum;

    CMDNum = pBegin[0]*0x100+pBegin[1];

    switch(CMDNum)

        {

            case 0x7300:

                state=t0x7300(pBegin);

                break;

            case 0x7400:

                close(commuSkt);

                ……

            default:

                logMsg("command 0x%04x is not supported\n",CMDNum,0,0,0,0,0);

        }

}

  推荐精品文章

·2024年12月目录 
·2024年11月目录 
·2024年10月目录 
·2024年9月目录 
·2024年8月目录 
·2024年7月目录 
·2024年6月目录 
·2024年5月目录 
·2024年4月目录 
·2024年3月目录 
·2024年2月目录 
·2024年1月目录
·2023年12月目录
·2023年11月目录

  联系方式
TEL:010-82561037
Fax: 010-82561614
QQ: 100164630
Mail:gaojian@comprg.com.cn

  友情链接
 
Copyright 2001-2010, www.comprg.com.cn, All Rights Reserved
京ICP备14022230号-1,电话/传真:010-82561037 82561614 ,Mail:gaojian@comprg.com.cn
地址:北京市海淀区远大路20号宝蓝大厦E座704,邮编:100089