⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gprs_udp.cpp

📁 gprs协议实现
💻 CPP
字号:
#include <stdio.h>
#include <string.h>
#include "GPRS_ppp.h"
#include "GPRS_net.h"
#include "GPRS_ip.h"
#include "GPRS_udp.h"

extern IPKT *ip_in;				/* received ip packedt */		
extern IPKT *ip_out;			    	/* being transmit ip packedt */	
extern NODE Locnode;			    	/* locate node */	
extern NODE  hostnode;                     	/* host node */

/* Return UDP data length (-1 if no data), 0 if not UDP */

short is_udp(short len)
{
    UDPKT * udp;
    unsigned short sum;
    short dlen=0;
                                       /* Check protocol & minimum length */
    if (len>=sizeof(UDPHDR))
    {
        udp = (UDPKT *)ip_in;              /* Do checksum */
        sum = check_udp(udp, ip_in->i.sip, ip_in->i.dip, len);
        if (!udp->u.check || sum==0xffff)
        {                               /* If zero or correct.. */
            len -= sizeof(UDPHDR);      /* Subtract header len */
            dlen = len>0 ? len : -1;    /* Return -1 if data len=0 */
        }
    }
    return(dlen);
}

/* Make a UDP datagram given the source & destination, data len */
void make_udp(NODE *srcep, NODE *destp, unsigned short dlen)
{
    UDPKT *udp;
    unsigned short ulen;
    udp = (UDPKT *)ip_out;
    udp->u.sport = srcep->port;          /* Set ports */
    udp->u.dport = destp->port;
	ulen = dlen + sizeof(UDPHDR);
    udp->u.len = ulen;
    udp->u.check = 0;
    #ifdef bigend
    	swap_udp(udp);
    #endif
    make_ip(srcep, destp, PUDP, (unsigned short)(ulen));
    udp->u.check = ~check_udp(udp, srcep->ip, destp->ip, ulen);
    if (udp->u.check == 0)              /* Change sum of 0 to FFFF */
        udp->u.check = 0xffff;
}

/* Return TCP checksum, given UDP (header + data) length.
** The values must be in network byte-order */

unsigned short check_udp(UDPKT *udp, unsigned long sip, unsigned long dip, unsigned short ulen)
{
    PHDR tph;
    unsigned long sum;
    sum = csum(&udp->u, (unsigned short)ulen);           /* Checksum TCP segment */
    #ifdef bigend
            tph.len = swapw((unsigned short)ulen);                /* Make pseudo-header */
            tph.srce = swapl(sip);
            tph.dest = swapl(dip);
    #else
            tph.len = (unsigned short)ulen;                /* Make pseudo-header */
            tph.srce = sip;
            tph.dest = dip;
    #endif
    tph.z = 0;
    tph.pcol =  udp->i.pcol;
    sum += csum(&tph, sizeof(tph));             	 /* Checksum pseudo-header */
    return((unsigned short)(sum + (sum /0x10000)));      /* Return total plus carry */
}
/* Swap byte order of shorts in TCP header */
void swap_udp(UDPKT *udp)
{
    udp->u.sport = swapw(udp->u.sport);
    udp->u.dport = swapw(udp->u.dport);
    udp->u.len = swapw(udp->u.len);
}


/* Send a UDP datagram, given destination node, data and length */

void udp_transmit(NODE *sp, NODE *dp, void *dat, unsigned short len)
{
    UDPKT *udp;
    udp = (UDPKT *)ip_out;
    memmove(udp->udpdata, dat, len);
    make_udp(sp, dp, (unsigned short)max(len, 0));
    IPNetSend();
}

/* Get the frame driver type, source port, IP and Ethernet addrs */

void getudp_srce(NODE *np)
{
    UDPKT *udp;
    memset(np, 0, sizeof(NODE));        /* Clear unused fields */
    getip_srce(np);                	/* Get dtype, srce IP and Ether addrs */
    udp = (UDPKT *)ip_in;
    np->port = udp->u.sport;            /* Get source port */
}

/* Get complete TCP local node data corresponding to frame dest IP address
** Return 0 if no matching node */

short getudp_locdest(NODE *np)
{
    UDPKT *udp;
    short ok;
    ok = getip_locdest(np);          /* Get addresses, dtype & netmask */
    udp = (UDPKT *)ip_in;          /* Get dest port */
    np->port = udp->u.dport;
    return(ok);
}
//  deal udp datagram
void UDP_Handler(unsigned short len)
{
	NODE loc,rem;
	UDPKT *udp;
	udp=(UDPKT *)ip_in;
        swap_udp(udp);
	getudp_srce(&rem);
	getudp_locdest(&loc);
//        swap_udp(udp);
	if (loc.port == locnode.port)                   /* Client response */
	{
		//数据处理
                udp_transmit(&loc, &rem, udp->udpdata, len);
	}
    	else if (loc.port == ECHOPORT)                  /* Echo req: resend data */
        	udp_transmit(&loc, &rem, udp->udpdata, len);

}


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -