/**********************************************************************
netTask.c
vxWorks作为server,双缓冲网络通讯,带网络监控,同时支持通讯协议
函数:
void netInit(int mode);
void netCMDRecv();
void netCMDExplain();
void netCMDSend();
void netCloseAll(int mode);
void netCheckLink();
char netCMDAdd(unsigned char *pBuff, int buffLen, int cmdNum, unsigned char priority);
char netRecvSize(unsigned char *pBuff, int len);
调用:
netTask.c
extern char t0x0200(unsigned char *pBuff);
extern char t0x0400(unsigned char *pBuff);
extern char t0x1600(unsigned char*pBuff);
netQueue.c
extern void queueInit();
extern char queueAdd(int index, unsigned char* pBuff, int pri);
extern char queueDelHead(int index);
extern char queueDelAll();
被调用:
用户程序初始化部分
netTask.c
**********************************************************************/
#include "vxWorks.h"
#include "logLib.h"
#include "taskLib.h"
#include "stdio.h"
#include "memLib.h"
#include "stdLib.h"
#include "sysLib.h"
#include "bootLib.h"
#include "sockLib.h"
#include "ioLib.h"
#include "inetLib.h"
#include "string.h"
#include "fioLib.h"
#include "semLib.h"
#include "netinet\\tcp.h"
#include "board.h"
/*通讯程序用全局变量、信号灯、宏定义*/
void netInit(int mode);
void netCMDRecv();
void netCMDExplain();
void netCMDSend();
void netCloseAll(int mode);
void netCheckLink();
char netRecvSize(unsigned char *pBuff, int len)
char netCMDAdd(unsigned char *pBuff, int buffLen, int cmdNum, unsigned char priority);
/*通讯程序用全局变量、信号灯、宏定义*/
int flagNetInit = NET_INIT_NULL; /*服务器初始化标志,程序中省略了对应的判断和操作*/
int listenSkt; /*命令通道侦听socket*/
int commuSkt; /*命令通道通讯socket*/
SEM_ID semQueueRecv; /*网络接收缓冲队列信号灯*/
SEM_ID semQueueSend; /*网络发送缓冲队列信号灯*/
SEM_ID semCmdLink; /*网络连接出错信号灯*/
struct cmdSingle *queueHead[QUEUE_NUM],*queueRear[QUEUE_NUM];
/**********************************************************************
void netInit(int mode);
函数说明: 网络初始化程序
参数: mode, 分为MODE_NET_DEFAULT 和MODE_NET_REINIT 两种,
分别对应初始化侦听+通讯套接字和只初始化通讯套接字两种。
返回: 无
调用: void netCMDRecv();
void netCMDExplain();
void netCMDSend();
void netCheckLink();
netQUEUE.C
extern void queueInit();
被调用: 用户程序初始化模块
void netCloseAll(int mode);
**********************************************************************/
void netInit(int mode)
{
struct sockaddr_in serverAddr;
struct sockaddr_in clientAddr;
int sockAddrSize;
int i;
char optval; /*需初始化*/
if (flagNetInit == NET_INIT_COMMUSKT)/*如果已经初始化了,不在重复进行*/
{
return;
}
/*建立本地的侦听用套接字listenSkt 并bind和listen*/
if((mode == MODE_NET_DEFAULT) && (flagNetInit == NET_INIT_NULL))
{
if ((listenSkt = socket(AF_INET,SOCK_STREAM,0)) == ERROR)
{
logMsg("netInit:can not openlisten socket\n",0,0,0,0,0,0);
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);/*htons : converts a u_short from host to TCP/IP network byte order */
serverAddr.sin_addr.s_addr = htonl(INADDR_ANY);/*htonl:converts a u_long from host to TCP/IP network byte order */
if (bind(listenSkt,(struct sockaddr *)&serverAddr,sockAddrSize) == ERROR)
{
logMsg("netInit:unable to bind to port %d\n",LOCAL_SERVER_PORT,0,0,0,0,0);
close(listenSkt);
return;
}
logMsg("netInit:successfully bind to port %d\n",LOCAL_SERVER_PORT,0,0,0,0,0);
if (listen (listenSkt,1) == ERROR)
{
logMsg("netInit:can not listen to port %d\n",LOCAL_SERVER_PORT,0,0,0,0,0);
close(listenSkt);
return;
}
flagNetInit = NET_INIT_LISTENSKT;
}
/*接收外部联接,建立通讯套接字commuSkt*/
if(flagNetInit = NET_INIT_LISTENSKT)
{
sockAddrSize = sizeof(struct sockaddr_in);
commuSkt = accept(listenSkt,(struct sockaddr *)(&clientAddr),&sockAddrSize);
if(commuSkt = ERROR)
{
logMsg("netInit:can not accept command socket\n",0,0,0,0,0,0);
close(listenSkt);
return;
}
setsockopt (commuSkt,IPPROTO_TCP,TCP_NODELAY,&optval,sizeof(optval));/*所有数据即时发送*/
/*初始化网络通信的缓冲队列*/
queueInit();
/*初始化缓冲队列的计数型信号灯*/
semQueueSend= semCCreate(SEM_Q_FIFO,0);
semQueueRecv= semCCreate(SEM_Q_FIFO,0);
if ((semQueueSend == NULL) ||(semQueueRecv == NULL))/*创建信号灯失败*/
{
semDelete(semQueueSend);
semDelete(semQueueRecv);
}
taskSpawn(TNAME_NETCHECKLINK,TPRI_NETCHECKLINK,0,
USER_STACK_SIZE, (FUNCPTR)netCheckLink,0,0,0,0,0,0,0,0,0,0);
taskSpawn(TNAME_NETRECV,TPRI_NETRECV,0,
USER_STACK_SIZE,(FUNCPTR)netCMDRecv,0,0,0,0,0,0,0,0,0,0);
taskSpawn(TNAME_NETEXPLAIN,TPRI_NETEXPLAIN,0,
USER_STACK_SIZE,(FUNCPTR)netCMDExplain,0,0,0,0,0,0,0,0,0,0);
taskSpawn(TNAME_NETSEND,TPRI_NETSEND,0,
USER_STACK_SIZE,(FUNCPTR)netCMDSend,0,0,0,0,0,0,0,0,0,0);
flagNetInit = NET_INIT_COMMUSKT;
logMsg("netInit:net Init finished\n",0,0,0,0,0,0);
}
}
/**********************************************************************
void netCMDRecv()
函数说明: 信息接收任务。循环从网络接收数据,打包后添加到缓冲队列,等待信息解释任务处理
参数: 无
返回: 无
调用: char netRecvSize(unsigned char *pBuff,int len)
netQueue.c
char queueAdd(int index, unsigned char* pBuff, int pri)
被调用: STATUS netInit();
**********************************************************************/
void netCMDRecv()
{
unsigned char buff[8];
unsigned char *pBuff;
int lenAll;
char pri;
char state = STATUS_NORMAL;
static int i;
/*循环接收*/
while(1)
{
if(netRecvSize(buff,8) != STATUS_NORMAL)
{
logMsg("netCMDRecv: error in head Recv netRecvSize(buff,8)\n",0,0,0,0,0,0);
break;
}
else
{
#ifdef LOG_NETMAG_HEAD/*打印接收到的网络消息的前8BYTE*/
printf("netCmdRecv:print out head 8 bytes\n");
for (i=0; i<8; i++)
{
printf("0x%02x",buff[i]);
}
printf("\n");
#endif
/*计算需要缓冲的长度*/
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);
if (state != STATUS_NORMAL)
{
logMsg("netCMDRecv: error in rear part recv netRecvSize(pBuff,%d)\n",lenAll - 8,0,0,0,0,0);
break;
}
}
/*正确接收了所有数据,添加到接收缓冲队列中*/
if (state == STATUS_NORMAL)
{
queueAdd(QUEUE_INDEX_RECV,pBuff,buff[6]);
senGive(semQueueRecv);
}
}
}
}
logMsg("netCMDRecv: something wrong,now exit\n",0,0,0,0,0,0);
}
/**********************************************************************
void netCMDExplain()
函数描述: 主循环消息处理和状态发送�
net.rar_net_vxworks_vxworks net_vxworks 函数_vxworks 网络
版权申诉
145 浏览量
2022-09-20
16:26:03
上传
评论
收藏 7KB RAR 举报
钱亚锋
- 粉丝: 85
- 资源: 1万+
最新资源
- 高性能量化工具 hikyuu 2.0.3 python3.9 ubuntu 安装包
- Cyclone Version 9.51
- 高性能量化回测工具 hikyuu 2.0.3 python 3.12 windows 安装包
- 省级城乡居民基本养老保险情况数据集(2010-2022年).xlsx
- 舞队填写版.cpp
- 基于BP神经网络的多输入单输出回归预测.zip
- 高性能量化回测工具 hikyuu 2.0.3 python 3.9 windows 安装包
- 省级城镇职工基本养老保险情况2000-2022年.xlsx
- 高性能量化回测工具 hikyuu 2.0.3 python 3.10 windows 安装包
- 算法部署-使用OpenVINO+C#部署PaddleOCR字符识别算法-项目源码-优质项目实战.zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈