⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 vxclt.c

📁 vxworks作为客户端的网络通断检测程序
💻 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 + -