static void handleEvent(void* vcontext) { struct UDPAddrInterface_pvt* context = (struct UDPAddrInterface_pvt*) vcontext; struct Message message = { .bytes = context->messageBuff.content, .padding = UDPAddrInterface_PADDING, .length = UDPAddrInterface_MAX_PACKET_SIZE }; struct Sockaddr_storage addrStore; int rc = Socket_recvfrom(context->socket, message.bytes, message.length, 0, &addrStore); if (rc < 0) { return; } if (addrStore.addr.addrLen != context->pub.addr->addrLen) { return; } message.length = rc; Message_push(&message, &addrStore, addrStore.addr.addrLen); if (context->pub.generic.receiveMessage) { context->pub.generic.receiveMessage(&message, &context->pub.generic); } } struct AddrInterface* UDPAddrInterface_new(struct EventBase* base, struct Sockaddr* addr, struct Allocator* allocator, struct Except* exHandler, struct Log* logger) { struct UDPAddrInterface_pvt* context = Allocator_malloc(allocator, sizeof(struct UDPAddrInterface_pvt)); Bits_memcpyConst(context, (&(struct UDPAddrInterface_pvt) { .pub = { .generic = { .sendMessage = sendMessage, .senderContext = context, .allocator = allocator }, }, .logger = logger, .socket = -1 }), sizeof(struct UDPAddrInterface_pvt));
void Socket_DoUDPServer(void) { int readnum; int ret; fd_set readfds, exceptfds; struct sockaddr_t addr; socklen_t addrLen = sizeof(struct sockaddr_t); int messagelen; /*报文长度*/ int varlen; /*可变数据长度字段的长度*/ struct timeval_t t; t.tv_sec = 0;//秒 t.tv_usec = 0;//微秒 if( g_UDPServerFd <=0 ) { return ; } FD_ZERO(&readfds); FD_SET(g_UDPServerFd, &readfds); ret = select((g_UDPServerFd+1), &readfds, NULL, &exceptfds, &t); if(ret<0) { return ; } memset(g_stSocketRecBuffer, 0x0, SOCKET_RECBUFFER_LEN); if( FD_ISSET(g_UDPServerFd, &readfds) ) { readnum = Socket_recvfrom(g_UDPServerFd, g_stSocketRecBuffer, SOCKET_RECBUFFER_LEN, &addr, &addrLen); if (readnum <= 0) { return; } /*根据报文中的报文长度确定报文是否是一个有效的报文*/ varlen = mqtt_num_rem_len_bytes(g_stSocketRecBuffer+4); //这个地方+3是因为MQTT库里面实现把 UDP flag算到messagelen里面,这里为了跟mqtt库保持一致所以加3 messagelen = mqtt_parse_rem_len(g_stSocketRecBuffer+3); if ((messagelen+varlen+XPG_PACKET_VERSIONLEN) != readnum) { /*报文长度错误*/ GAgent_Printf(GAGENT_WARNING, "Invalid UDP packet length"); return; } if (readnum < SOCKET_RECBUFFER_LEN) { Socket_DispatchUDPRecvData(g_stSocketRecBuffer, varlen, messagelen, addr, addrLen); return; } if (readnum >= SOCKET_RECBUFFER_LEN) { /*根据目前的情况,不可能出现这个问题。增加调试信息*/ GAgent_Printf(GAGENT_WARNING, "TOO LENGTH OF UDP Packet Size."); ; } } return; }