1.4 数据的接收 之 UDP解析

​ 对于UDP协议的处理是从udp_handler()函数开始的。我们知道,这个函数是从tcp_tick()调过来的,其参数就是要处理的数据指针。此时,我们已经可以确定这个数据包使用的是UDP协议。接下来就是判断一下该数据包是否是发送给我们的包。很简单,我们仅仅处理我们感兴趣的包就可以了。其中,包括广播包和明确发给我们的数据包(当然,还应该有我们加入的组播组的数据包,但是WatTCP并不支持组播,所以将组播包也一并丢弃)。当,是我们的包以后,我们再看一下端口是否正确。如果端口不正确,当然也是不可以的。相关代码如下:
pctcp.c ==> udp_handler( in_Header *ip )

    if ( ((~temp & ~sin_mask) != 0) &&  /* not a broadcast packet*/
        ((( temp - my_ip_addr) > multihomes )   /* not my address */
        && my_ip_addr)) /* and I know my address */

    len = in_GetHdrlenBytes(ip);
    up = (udp_Header *)((byte *)ip + len);      /* udp segment pointer */
    len = intel16( up->length );

    /* demux to active sockets */
    for ( s = udp_allsocs; s; s = s->next ) {
#ifdef DEBUG
        if ( s->safetysig != SAFETYUDP ) {
            if (debug_on) outs("\n\rUDP: Chain Error\n\r");  // R. Whitby
        }
#endif

        if ( (s->hisport != 0) &&
             (intel16( up->dstPort ) == s->myport) &&
             (intel16( up->srcPort ) == s->hisport) &&
             ((intel( ip->destination ) & sin_mask)  == (s->myaddr & sin_mask)) &&
             (intel( ip->source ) == s->hisaddr )) 
            break;
    }

​ 上面的工作完成以后,我们就可以知道是这个数据包是哪个套接字的数据了。于是,我们接下来就是真正的解析UDP数据包了。我们知道在UDP数据包里面包含了一些基本信息,包括发送者的IP等等。这些信息解析完毕后,看一下数据接收者(接收这个数据包的应用程序)所提供的套接字中是否包含了一个处理函数。如果提供了,就直接调用这个函数继续处理。从应用程序的角度讲,一个数据包到达了。如果没有提供,就将数据拷贝到该套接字的数据缓存中,等待程序自己处理。
​ 到这儿为止,UDP数据的接收就完成了。是不是很简单呢?确实如此。源码之下了无秘密。
​ 不过,您可能还是不明白数据是如何与应用程序接上茬的。下一篇,我们就举一个简单的例子,看一下,接收数据的整个流程。

你可能感兴趣的:(WatTcp源码分析)