数字量产工具:输入系统-网络编程

软件总框架

输入系统:网络输入编程

需要实现网络输入设备结构体

static InputDevice g_tNetinputDev = {

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

};

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)
{
    unsigned char ucRecvBuf[1000];
    int iRecvLen;
    struct sockaddr_in tSocketClientAddr;

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

        ucRecvBuf[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, ucRecvBuf, 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,

};

总结:

  1. 开发板作为UDP服务器
  2. NetinputDeviceInit()初始化网络输入设备,通过socket()打开套接字,获得套接字描述符,使用bind()函数将套接字和ip、端口绑定。
  3. NetinputDeviceExit()实现网络输入设备退出,通过close()关闭套接字
  4. NetinputGetInputEvent()获取网络输入事件,通过recvfrom()接收客户端数据报文, 通过gettimeofday()获得时间

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值