数字量产工具:输入系统-网络输入单元测试

软件总框架:

网络输入单元测试

main 函数:

int main(int argc, char **argv)
{
    InputEvent event;
    int ret;
    g_tNetinputDev.DeviceInit();
    while (1)
    {
        ret = g_tNetinputDev.GetInputEvent(&event);
        if (ret)
        {
            printf("GetInputEvent err\r\n");
            return -1;
        }
        else
        {
            printf("iType       =%d\r\n", event.iType);
            printf("str         =%s\r\n", event.str);
        }
    }
    return 0;
}

编译调试后,netinput.c 内容

#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include "input_manager.h"

#define SERVER_PORT 8888

static int g_iSocketServer;

static int NetinputGetInputEvent(PInputEvent ptInputEvent)
{
    char aRecvBuf[1000];
    int iRecvLen;
    struct sockaddr_in tSocketClientAddr;

    unsigned int iAddrLen = sizeof(struct sockaddr);
    /* 接收客户端数据报,返回的为接收到的字节数 */
    iRecvLen = recvfrom(g_iSocketServer, aRecvBuf, sizeof(aRecvBuf), 0, (struct sockaddr *)&tSocketClientAddr, &iAddrLen);
    if (iRecvLen > 0)
    {

        aRecvBuf[iRecvLen] = '\0';
        //printf("Get Msg from %s : %s\n", inet_ntoa(socket_client_addr.sin_addr), buf);
        ptInputEvent->iType = INPUT_TYPE_NET;
        gettimeofday(&ptInputEvent->tTime, NULL);
        strncpy(ptInputEvent->str, aRecvBuf, 1000);
        ptInputEvent->str[999] = '\0';
        return 0;
    }
    else
        return -1;
}

static int NetinputDeviceInit(void)
{
    struct sockaddr_in tSocketServerAddr;
    int iRet;

    /*创建数据报套接字*/
    g_iSocketServer = socket(AF_INET, SOCK_DGRAM, 0);
    if (g_iSocketServer == -1)
    {
        printf("socket error");
        return -1;
    }

    /* 服务器端填充 sockaddr_in结构 */
    tSocketServerAddr.sin_family = AF_INET;
    tSocketServerAddr.sin_port = htons(SERVER_PORT);
    tSocketServerAddr.sin_addr.s_addr = INADDR_ANY;
    memset(tSocketServerAddr.sin_zero, 0, 8);

    /*绑定套接字*/
    iRet = bind(g_iSocketServer, (const struct sockaddr *)&tSocketServerAddr, sizeof(struct sockaddr));
    if (iRet == -1)
    {
        printf("bind error!\n");
        return -1;
    }
    return 0;
}

static int NetinputDeviceExit(void)
{
    close(g_iSocketServer);
    return 0;
}

static InputDevice g_tNetinputDev = {

    .name = "netinput",
    .GetInputEvent = NetinputGetInputEvent,
    .DeviceInit = NetinputDeviceInit,
    .DeviceExit = NetinputDeviceExit,

};

#if 1

int main(int argc, char **argv)
{
    InputEvent event;
    int ret;
    g_tNetinputDev.DeviceInit();
    while (1)
    {
        ret = g_tNetinputDev.GetInputEvent(&event);
        if (ret)
        {
            printf("GetInputEvent err\r\n");
            return -1;
        }
        else
        {
            printf("iType       =%d\r\n", event.iType);
            printf("str         =%s\r\n", event.str);
        }
    }
    return 0;
}

#endif

在unittest目录下添加 client.c

#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <stdio.h>

#define SERVER_PORT 8888

int main(int argc, char **argv)
{
	int iSocketClient;
	struct sockaddr_in tSocketServerAddr;

	int iRet;
	int iSendLen;
	int iAddrLen;

	if (argc != 3)
	{
		printf("Usage:\n");
		printf("%s <server_ip> <str>\n", argv[0]);
		return -1;
	}

	iSocketClient = socket(AF_INET, SOCK_DGRAM, 0);

	tSocketServerAddr.sin_family = AF_INET;
	tSocketServerAddr.sin_port = htons(SERVER_PORT); /* host to net, short */
	//tSocketServerAddr.sin_addr.s_addr = INADDR_ANY;
	if (0 == inet_aton(argv[1], &tSocketServerAddr.sin_addr))
	{
		printf("invalid server_ip\n");
		return -1;
	}
	memset(tSocketServerAddr.sin_zero, 0, 8);

#if 0
	iRet = connect(iSocketClient, (const struct sockaddr *)&tSocketServerAddr, sizeof(struct sockaddr));	
	if (-1 == iRet)
	{
		printf("connect error!\n");
		return -1;
	}
#endif

	iAddrLen = sizeof(struct sockaddr);
	iSendLen = sendto(iSocketClient, argv[2], strlen(argv[2]), 0,
					  (const struct sockaddr *)&tSocketServerAddr, iAddrLen);

	close(iSocketClient);

	return 0;
}

单独编译client.c

arm-linux-gnueabihf-gcc -o client client.c

单元测试:

总结:

  1. 添加main函数,使用g_tNetinputDev.DeviceInit()完成输入设备初始化,使用g_tNetinputDev.GetInputEvent(&event)完成输入事件数据获取。
  2. 添加client.c ,使用socket()函数创建套接字,使用sendto()函数向服务器发送数据;若使用了connect()函数连接远端服务器,则需要使用send函数发送数据。使用close()函数关闭套接字。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值