软件总框架
输入系统:网络输入编程
需要实现网络输入设备结构体
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,
};
总结:
- 开发板作为UDP服务器
- NetinputDeviceInit()初始化网络输入设备,通过socket()打开套接字,获得套接字描述符,使用bind()函数将套接字和ip、端口绑定。
- NetinputDeviceExit()实现网络输入设备退出,通过close()关闭套接字
- NetinputGetInputEvent()获取网络输入事件,通过recvfrom()接收客户端数据报文, 通过gettimeofday()获得时间