📄 vxclt.c
字号:
/**********************************************************************
chengjy@felab, copyright 2002-2004
vxClt.c
VxWorks下建立客户端的程序框架,包括网络监测模块。
函数:
void netCltInit();
void netCltSend();
void netCltCloseAll();
void netCltCheckLink();
void netCltCheckByRecv();
调用: 无
被调用: shell下手动调用
说明: 注意本文档仅仅是框架,用户还需要
根据需要添加内容。为了简洁起见,函数都设定为无返回。
**********************************************************************/
#include "vxWorks.h"
#include "taskLib.h"
#include "sockLib.h"
#include "inetLib.h"
#include "ioLib.h"
#include "logLib.h"
#include "string.h"
#include "stdio.h"
#include "netinet\\tcp.h"
#include "semLib.h"
#include "vxClt.h"
int netCltSkt; /*客户端通讯用套接字*/
SEM_ID semNetCltLink; /*网络连接出错信号灯*/
void netCltInit();
void netCltSend();
void netCltCloseAll();
void netCltCheckLink();
void netCltCheckByRecv();
/**********************************************************************
void netCltInit();
函数描述: 客户端初始化,建立到服务器的通讯通道
参数: 无
返回: 无
调用:
void netCltCheckLink();
void netCltCheckByRecv();
被调用:
命令通道的连接命令
**********************************************************************/
void netCltInit()
{
int mlen;
int i;
struct sockaddr_in serverAddr;
struct timeval connectTimeOut;
int sockAddrSize;
char remoteIP[20];
UINT portNum;
UINT maxPort;
char optval = 1;
/*新建socket*/
if ((netCltSkt = socket (AF_INET, SOCK_STREAM, 0)) == ERROR)
{
logMsg("geNetDataInit: unable to create 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_addr.s_addr = inet_addr (REMOTE_SERVER_IP);
serverAddr.sin_port = htons (REMOTE_SERVER_PORT);
/*设置连接超时时间*/
connectTimeOut.tv_sec = 2; /*2s*/
connectTimeOut.tv_usec = 0; /*0ms*/
/*连接服务器*/
logMsg("geNetDataInit: connect %s\n port %d......\n",REMOTE_SERVER_IP,REMOTE_SERVER_PORT,0,0,0,0);
if(connectWithTimeout(netCltSkt,(struct sockaddr *) &serverAddr, sockAddrSize,&connectTimeOut) == ERROR)
{
logMsg("failed\n",0,0,0,0,0,0);
close(netCltSkt);
return;
}
else
{
logMsg("succeeded!\n",0,0,0,0,0,0);
/*所有的数据都必须立刻发送*/
setsockopt (netCltSkt, IPPROTO_TCP, TCP_NODELAY, &optval, sizeof (optval));
}
if(taskNameToId(TNAME_NETCLTCHECKLINK)==ERROR)
{
taskSpawn(TNAME_NETCLTCHECKLINK,TPRI_NETCLTCHECKLINK,0,USER_STACK_SIZE,
(FUNCPTR)netCltCheckLink,0,0,0,0,0,0,0,0,0,0);
}
}
/**********************************************************************
void netCltSend()
函数说明: 发送数据到服务器端
参数: 无
返回: 无
调用: 无
被调用: 需要发送数据的程序
**********************************************************************/
void netCltSend()
{
if(send(netCltSkt,0,0,0/*替换成实际的参数*/)==ERROR)
{
semGive(semNetCltLink);
}
}
/**********************************************************************
void netCltCloseAll()
函数描述: 客户端退出,结束socket 通讯。
参数: 无
返回: 无
调用: 无
被调用: void netCltCheckLink();
**********************************************************************/
void netCltCloseAll()
{
int taskId;
/*关闭客户端通讯socket*/
close(netCltSkt);
/*删除监控任务*/
taskId = taskNameToId(TNAME_NETCLTCHECKLINK);
if(taskId!= ERROR && taskId != taskIdSelf())
taskDelete(taskId);
logMsg("geNetDataCloseAll: socket closed\n",0,0,0,0,0,0);
}
/**********************************************************************
void netCltCheckLink()
函数说明: 检测网络是否正常,如果不正常,关闭客户端
参数: 无
返回: 无
调用: void netCltCheckByRecv()
被调用: void netCltInit()
**********************************************************************/
void netCltCheckLink()
{
int taskId;
/*创建信号灯,并发起通过接收数据监视网络的任务*/
semNetCltLink= semBCreate(SEM_Q_FIFO,0);
if(taskNameToId(TNAME_NETCLTCHKBYRECV)==ERROR)
{
taskSpawn(TNAME_NETCLTCHKBYRECV,TPRI_NETCLTCHKBYRECV,0,USER_STACK_SIZE,
(FUNCPTR)netCltCheckByRecv,0,0,0,0,0,0,0,0,0,0);
}
/*如果获得了信号灯,表示网络已经断开*/
if(semTake(semNetCltLink,WAIT_FOREVER)==OK)
{
taskId = taskNameToId(TNAME_NETCLTCHKBYRECV);
if(taskId!= ERROR && taskId != taskIdSelf())
taskDelete(taskId);
semDelete(semNetCltLink);
/*调用netCltCloseAll 关闭客户端*/
taskSpawn(TNAME_NETCLTCLOSEALL,TPRI_NETCLTCLOSEALL,0,USER_STACK_SIZE,
(FUNCPTR)netCltCloseAll,0,0,0,0,0,0,0,0,0,0);
}
}
/**********************************************************************
void netCltCheckByRecv()
函数说明: 通过recv()监测网络,一旦不正常就释放信号灯
通知netCltCheckLink()
参数: 无
返回: 无
调用: 无
被调用: void netCltCheckLink()
**********************************************************************/
void netCltCheckByRecv()
{
char buff[2];
int buffLen;
while(1)
{
buffLen= recv(netCltSkt,buff,1,0);
if(buffLen==0 || buffLen==ERROR)
{
semGive(semNetCltLink);
break;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -