(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);
}
}
|