| 
				 (2)函数编制 
在主机打开VxWorks应用程序开发工具Tornado,新建立一个“可下载的应用模块”工程,然后在该工程中新建一个“C/C++source File”文件,取名为mypro.c。在该文件中加入初始化函数如下所示: 
void init(int mode) 
{ 
    /*建立本地的侦听用套接字listenSkt 并bind和listen*/ 
    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长度的首帧数据,从该数据中取出byte3和byte4计算出所要接收数据的长度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.命令处理 
将接收到的数据首帧的byte0和byte1取出计算出命令字,根据命令字进行相应的操作。在命令处理中采用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); 
        } 
} 			
				 |