示例#1
0
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));
示例#2
0
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;               
}