亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? dhcpc.c

?? Linux下DHCP Client的實現。
?? C
?? 第 1 頁 / 共 5 頁
字號:
//dhcpc.c
//

/************************************
 *			Include files
 ***********************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <time.h>	//for time
#include <fcntl.h>	//for O_RDWR,open
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>	//for inet_ntoa, inet_aton
#include <sys/ioctl.h>
#include <sys/poll.h>	//for poll
#include <linux/if.h>	//for ifreq
#include <linux/route.h>
#include <unistd.h>		//for close
#include <features.h>    /* for the glibc version number */
#if __GLIBC__ >= 2 && __GLIBC_MINOR >= 1
#include <netpacket/packet.h>
#include <net/ethernet.h>     /* the L2 protocols */
#else
#include <asm/types.h>
#include <linux/if_packet.h>
#include <linux/if_ether.h>   /* The L2 protocols */
#endif

#include "dhcpc.h"


#define	INVALID_SOCKET_HANDLE	-1
#define closesocket close
#ifndef	INVALID_SOCKET
	#define	INVALID_SOCKET	-1
#endif//!INVALID_SOCKET
#define UDP_HDRLEN sizeof(struct udphdr)

#define IGW_BUFGET16(cp)                \
  (((unsigned short)(*(char *)(cp)) << 8 & 0xFF00) | (*((char *)(cp) + 1) & 0xFF))

typedef	int	SOCKET;

static int				g_dcskfd =INVALID_SOCKET_HANDLE;
static SOCKET			s_iConfigClientSocket = INVALID_SOCKET;
static SOCKET			s_iConfigServerSocket = INVALID_SOCKET;
int32_t				Fds_To_Poll = MAX_FDS_TOPOLL - 1;
SOCKET				s_iDCSocket = INVALID_SOCKET;
uint32_t				CurrentTime = 0;
uint32_t				g_uiStartLeaseTime = 0;
static struct			sockaddr_in s_DhcpClientAddr= {0};
static struct			sockaddr_in s_DhcpServerAddr = {0};
DHCPCIpAddressInfo_t     DHCPCIpAddressInfo;
DHCPClientBlock_t		*pDHCPClientCtxtBlockHead = NULL;
DHCPClientBlock_t		*pDHCPClientCtxtBlockTail = NULL;
DHCPClientBlock_t		*g_pDHCPClientCurrent  = NULL;		/* point to current interface*/
DHCPWAITEvent_t		*pDHCPClientTimerHead = NULL;
DHCPWAITEvent_t		*pDHCPClientTimerTail = NULL;
DHCPWAITEvent_t		*pDHCPClientTimerCurrent = NULL;
struct DHCPClientFunctions DHCPCFunctionInfo;
struct dhcp_packet		DhClientRequestPkt;
struct pollfd			DHCPClientPollFds[MAX_FDS_TOPOLL];
struct	sockaddr_in     *DhcpClientAddr= NULL;


void DHCPClientPrintAllTransActionId(void);

static void	ZComIOControlClose(void)
{
	if (INVALID_SOCKET_HANDLE!=g_dcskfd)
	{
		close(g_dcskfd);
		g_dcskfd = INVALID_SOCKET_HANDLE;
	}
}

int	ZComIOControl(int request, void* pData)
{
	if (INVALID_SOCKET_HANDLE==g_dcskfd)
	{
		static int	fIsFirstOpen = 1;

		g_dcskfd = socket(AF_INET, SOCK_DGRAM, 0);
		if (INVALID_SOCKET_HANDLE==g_dcskfd)
		{
			printf("%s: socket error!\n", __FUNCTION__);
			return -1;
		}
		if (fIsFirstOpen)
		{
			fIsFirstOpen = 0;
			atexit(ZComIOControlClose);
		}
	}

	return ioctl(g_dcskfd, request, pData);
}

///////////////////////////////////////////////////////////////////////////////
// ifconfig routines
///////////////////////////////////////////////////////////////////////////////
#ifndef IFNAMSIZ
#define IFNAMSIZ                16 
#endif

bool_t IsInterfaceUp(const char *cszIfName)
{
	struct ifreq ifr = {{{0}}};

	strncpy(ifr.ifr_name, cszIfName, IFNAMSIZ);

	if (ZComIOControl(SIOCGIFFLAGS, &ifr)>=0)
	{
		return (IFF_UP | IFF_RUNNING)
			== (ifr.ifr_flags & (IFF_UP | IFF_RUNNING));
	}

	//printf("Iface: %s not exist!\n", cszIfName);
	return FALSE;
}

static bool_t InterfaceSockaddrSet(
		const char *cszIfName,
		in_addr_t in_addr,
		int request)
{
	struct ifreq ifr = {{{0}}};
	struct sockaddr_in *pSockAddr = (struct sockaddr_in *)&ifr.ifr_addr;

	strncpy(ifr.ifr_name, cszIfName, IFNAMSIZ);
	pSockAddr->sin_family = AF_INET;
	pSockAddr->sin_addr.s_addr = in_addr;

	return ZComIOControl(request, &ifr)>=0;
}

#if 0
static in_addr_t InterfaceSockaddrGet(const char *cszIfName, int request)
{
	struct ifreq ifr = {{{0}}};
	struct sockaddr_in *pSockAddr = (struct sockaddr_in *)&ifr.ifr_addr;

	strncpy(ifr.ifr_name, cszIfName, IFNAMSIZ);
	pSockAddr->sin_family = AF_INET;
	if (ZComIOControl(request, &ifr)>=0
		&& AF_INET==pSockAddr->sin_family)
	{
		return pSockAddr->sin_addr.s_addr;
	}
	return INADDR_ANY;
}
#endif

void GetHostName(char *str)
{
	if (0 != gethostname(str, 100))
	{
		str[0] = '\0';
	}
}

int DHCPClientGetLeaseTime(uint32_t *pReqLease)
{
	*pReqLease = 100;//60*24*60*60;  //Lease time
	return TRUE;
}

void TimerStart(DHCPWAITEvent_t *p, uint32_t iTimeoutTime, enum WaitEventType EventType)
{
	if (NULL == p)
	{
		return;
	}
	if (0!= iTimeoutTime)
	{
		time((time_t *)&(p->iWaitStartTime));
		p->iWaitTimeOutTime = iTimeoutTime;
	}
#ifdef XHEMA_DEBUG
	printf("Timeout start : %s\n", p->pPointToBlock->cszIfName);
#endif
	p->EventType = EventType;
	p->bStartWaitEvent = TRUE;
}

void TimerStop(DHCPWAITEvent_t *p)
{
	if (NULL == p)
	{
		return;
	}
	p->bStartWaitEvent = FALSE;
}

//Enable DHCP client and listen at 68 port(DHCP client)
int32_t DHCPClientActiveSocketFd(int32_t bActive)
{
	int32_t iSockFd = 0;
	
	if (bActive)
	{
		if ((iSockFd = socket(PF_PACKET, SOCK_DGRAM, htons(ETH_P_IP)))<0)
		{
			perror("create lpf socket error");
			return FALSE;
		}
		s_iDCSocket = iSockFd;
		Fds_To_Poll = MAX_FDS_TOPOLL;
		DHCPClientPollFds[1].fd = s_iDCSocket;
		DHCPClientPollFds[1].events = POLLIN;
		return TRUE;
	}
	else
	{
		if (s_iDCSocket)
		{
			close(s_iDCSocket);
			s_iDCSocket = 0;
			Fds_To_Poll = MAX_FDS_TOPOLL - 1;
		}
	}
	return TRUE;
}

void Daemon_Init(bool_t fVerbose)
{
#if 1
	if (fVerbose)
	{
		daemon(0, 1);
	}
	else
	{
		daemon(0, 0);
	}
#else
	int devnullfd;
	chdir ("/");
	switch (fork() )
	{
	case -1:
		printf("Daemon_Init: error in fork\r\n");
		exit(1);
	case 0: /** Child **/
		break;
	default:
		/** Parent **/
		exit(0);
	}
	if ( setsid() == -1 )
	{
		printf("Daemon_Init: setsid error\r\n");
		exit(1);
	}
	
	devnullfd = open("/dev/null", O_RDWR);
	if ( devnullfd == -1 )
	{
		printf("Null device open failed\r\n");
		return;
	}
	close(0);
	close(1);
	close(2);
	
	dup2(devnullfd, 0);
	dup2(devnullfd, 1);
	dup2(devnullfd, 2);
	close(devnullfd);
	return;
#endif
}

uint32_t checksum (uint8_t *buf,int nbytes,uint32_t sum)
{
	int i;

	/* Checksum all the pairs of bytes first */
	for (i = 0; i < (nbytes & ~1); i += 2) {
		sum += (uint16_t) ntohs(*((uint16_t *)(buf + i)));
		/* Add carry. */
		if (sum > 0xFFFF)
			sum -= 0xFFFF;
	}

	/* If there's a single byte left over, checksum it, too.   Network
	byte order is big-endian, so the remaining byte is the high byte. */

	if (i < nbytes) {
		sum += buf [i] << 8;
		/* Add carry. */
		if (sum > 0xFFFF)
			sum -= 0xFFFF;
	}

	return sum;
}

uint32_t wrapsum (uint32_t sum)
{

	sum = ~sum & 0xFFFF;

	return htons(sum);
}

void GetHwAddr(uint8_t *hw, const char *cszIfName)
{
	struct ifreq ifr;

	memset(&ifr, 0, sizeof ifr);
	strcpy(ifr.ifr_name, cszIfName);
	if (ZComIOControl(SIOCGIFHWADDR,&ifr)<0)
	{
		printf("Error In Getting The HWADDR fron Iface %s\n",cszIfName);
		return;
	}
	memcpy(hw,ifr.ifr_addr.sa_data,6);
	return;
}

int getIndexByIfName(const char *cszIfName)
{
	struct ifreq ifr;
	int32_t fd, iResult ;
	
	if((fd = socket(PF_INET,SOCK_STREAM,0)) < 0)
	{
		perror("socket failed");
		return -1 ;
	}
	/*fill the given index value to get the Ifacename. */
	strcpy(ifr.ifr_name, cszIfName);
	if((iResult = ioctl(fd,SIOCGIFINDEX,&ifr)) < 0)
	{
		close(fd);
		return -1 ;
	}
	close(fd);
	return ifr.ifr_ifindex;
}

bool_t getIfNamebyIndex(int index, char *pIfName)
{
	struct ifreq ifr;
	int32_t fd, iResult ;
	
	if((fd = socket(PF_INET,SOCK_STREAM,0)) < 0)
	{
		perror("socket failed");
		return FALSE ;
	}
	/*fill the given index value to get the Ifacename. */
	ifr.ifr_ifindex=index;
	if((iResult = ioctl(fd,SIOCGIFNAME,&ifr)) < 0)
	{
		close(fd);
		return FALSE ;
	}
	strcpy(pIfName, ifr.ifr_name);
	close(fd);
	return TRUE;
}

void IGWAssembleEthernetHeader (
		uint8_t *buf, 
		int *bufix, 
		struct hardware *from,
		struct hardware *to
	)
{
	struct ethhdr eh;

	if (to && to -> hlen == 6)
	{
		//memcpy(eh.h_dest, to->haddr, 6); /*xhema */
		memset(eh.h_dest,0xff, 6);
	}
	else
	{
		memset(eh.h_dest,0xff, 6);
	}

	memcpy(eh.h_source,from->haddr,6);

	eh.h_proto = htons(0x800);

	memcpy(buf, &eh, sizeof(eh));
	*bufix += sizeof eh;
}

void IGWAssembleUdpIpHeader(uint8_t *buf, int32_t *bufix, ipaddr from, 
			ipaddr to,int32_t port,uint8_t *data,int32_t len)
{
	struct iphdr iphdr;
	struct udphdr udp;

	/* Fill out the IP header */
#if defined RUNONPC
	iphdr.ver = 5;
	iphdr.hlen = 4;
#else
	iphdr.ver = 4;
	iphdr.hlen = 5;
#endif
	iphdr.tos = IPTOS_LOWDELAY;
	iphdr.tot_len = htons(sizeof(iphdr) + sizeof(udp) + len);
	iphdr.id = 0;
	iphdr.frag_off = 0;
	iphdr.ttl = 16;
	iphdr.protocol = IPPROTO_UDP;
	iphdr.check = 0;
	iphdr.saddr = from;
	iphdr.daddr = to;

	/* Checksum the IP header */
	iphdr.check = wrapsum (checksum ((uint8_t *)&iphdr, sizeof(iphdr), 0));
	/* Copy the ip header into the buffer... */
	memcpy(&buf[*bufix], &iphdr, sizeof(iphdr));
	//memcpy(buf+*bufix, &iphdr, sizeof(iphdr));
	*bufix += sizeof(iphdr);

	/* Fill out the UDP header */
	udp.source = htons(BOOTP_PORT + 1);              /* XXX */
	udp.dest = htons(port);                    /* XXX */

	udp.len = htons(sizeof(udp) + len);
	memset (&udp.check, 0, sizeof(udp.check));

	/* Compute UDP checksums, including the ``pseudo-header'', the UDP
	header and the data. */

	udp.check = wrapsum (checksum ((uint8_t *)&udp, sizeof udp,checksum (data, len,checksum ((uint8_t *)&iphdr.saddr,2 * sizeof(iphdr.saddr),IPPROTO_UDP + (uint32_t)ntohs (udp.len)))));
	//printf("udp source = %d udp dest = %d udp len =%d
	/* Copy the udp header into the buffer */
	memcpy (&buf[*bufix], &udp, sizeof udp);
	*bufix += sizeof udp;
}

//////////////////////////////////////////////////////////////////
//					DHCP protocol
//////////////////////////////////////////////////////////////////
void DHCPCAddOptionsToPkt(
		uint8_t *caSendingPkt,
        DHCPClientBlock_t *pCurCtxtBlock,
        uint32_t  *ulTotLength,
        uint8_t ucDHCPMsgType
	)
{
	uint8_t *PktPos;
	ipaddr iTmpAddr;
	PktPos = caSendingPkt + *ulTotLength;
	memcpy(PktPos, DHCP_OPTIONS_COOKIE, 4);
	PktPos += 4;
	*ulTotLength += 4;
	*PktPos++ = DHCP_MESSAGE_TYPE;
	*PktPos++ = DHCP_MESSAGE_OPTION_LEN;
	if (ucDHCPMsgType == DHCPDISCOVER)
	{
		*PktPos++ = DHCPDISCOVER;
	}
	else
	{
		*PktPos++ = DHCPREQUEST;
	}
	*ulTotLength += 3;

	if (pCurCtxtBlock->CurrentState == DHCP_CLIENT_REQUEST)
	{
		if (pCurCtxtBlock->DHCPServerIpAddr>0)
		{
			*PktPos++ = DHO_DHCP_SERVER_IDENTIFIER;
			*PktPos++ = sizeof(ipaddr);
			*ulTotLength += 2;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
久久免费视频色| 精品国产精品一区二区夜夜嗨| 美女视频黄 久久| 天天影视色香欲综合网老头| 亚洲一区二区影院| 亚洲第一成年网| 亚洲成av人**亚洲成av**| 亚洲高清三级视频| 日韩精品每日更新| 美女一区二区视频| 国产一区福利在线| 成人精品国产福利| 色综合天天性综合| 色哟哟在线观看一区二区三区| 色综合久久综合网97色综合| 91黄视频在线观看| 欧美一区二区三区四区五区| 日韩三级视频在线看| 久久青草欧美一区二区三区| 欧美激情在线看| 一区二区三区在线观看欧美| 五月天丁香久久| 国产自产高清不卡| 91亚洲男人天堂| 欧美精品在线观看播放| 欧美成人激情免费网| 国产精品热久久久久夜色精品三区 | 亚洲色图都市小说| 亚洲国产综合在线| 国内精品久久久久影院一蜜桃| 丰满少妇久久久久久久| 在线免费不卡电影| 26uuu国产电影一区二区| 中文字幕一区av| 免费看日韩a级影片| 成人免费高清视频在线观看| 欧美视频在线观看一区二区| 欧美v日韩v国产v| 亚洲嫩草精品久久| 国产精一区二区三区| 在线视频亚洲一区| 久久九九影视网| 亚洲观看高清完整版在线观看 | 久久99精品国产麻豆不卡| 不卡av在线免费观看| 正在播放亚洲一区| 亚洲婷婷综合色高清在线| 久久99国产精品麻豆| 在线观看成人免费视频| 亚洲国产岛国毛片在线| eeuss鲁一区二区三区| 欧美二区在线观看| 亚洲欧洲99久久| 欧美影院一区二区三区| 久久久久9999亚洲精品| 成人午夜精品在线| 亚洲精品精品亚洲| 欧美日韩一区三区| 久久99久久99小草精品免视看| 国产亚洲一本大道中文在线| 91麻豆国产香蕉久久精品| 亚洲大尺度视频在线观看| 日韩欧美中文字幕公布| 国产69精品久久99不卡| 亚洲精品国产一区二区精华液 | 亚洲男人的天堂av| 欧美精选一区二区| 国产成人在线免费| 亚洲国产日韩精品| 精品国产一二三| 日本道色综合久久| 久久99日本精品| 亚洲美女免费在线| 精品成人一区二区三区四区| 91丝袜国产在线播放| 日韩高清欧美激情| 国产精品美女久久久久高潮| 7777精品伊人久久久大香线蕉完整版 | 色噜噜狠狠色综合中国| 久热成人在线视频| 一区二区三区四区蜜桃| 久久综合网色—综合色88| 色8久久人人97超碰香蕉987| 国产一区视频网站| 日韩成人dvd| 亚洲激情图片一区| 欧美韩国日本一区| 精品久久免费看| 精品视频999| 91色.com| 处破女av一区二区| 国产一区二区三区电影在线观看| 亚洲综合精品久久| 亚洲视频资源在线| 国产亚洲短视频| 欧美va亚洲va香蕉在线| 欧美日韩中字一区| 色94色欧美sute亚洲线路一久| 国产91对白在线观看九色| 久久99精品久久只有精品| 偷窥少妇高潮呻吟av久久免费| 亚洲精品视频一区二区| 国产精品午夜电影| 久久精品日韩一区二区三区| 日韩免费在线观看| 日韩欧美在线综合网| 欧美日本一道本在线视频| 欧美性欧美巨大黑白大战| 97精品久久久久中文字幕| 不卡区在线中文字幕| 成人在线视频首页| 国产99久久久国产精品潘金网站| 国内成人精品2018免费看| 免费欧美在线视频| 久久国产尿小便嘘嘘尿| 美女一区二区视频| 精品一区二区精品| 国产又黄又大久久| 国产福利不卡视频| 国产成人av网站| 不卡的av电影| 色婷婷综合久久久| 欧美吻胸吃奶大尺度电影 | 国产成人免费视频精品含羞草妖精 | 欧美一级国产精品| 日韩写真欧美这视频| 精品福利二区三区| 国产欧美精品一区二区三区四区| 国产精品亲子乱子伦xxxx裸| 国产精品视频第一区| 亚洲欧美日韩在线不卡| 亚洲福利视频一区| 日韩av在线发布| 国产精品自拍网站| 99精品久久只有精品| 欧美亚洲综合一区| 欧美一区二区福利在线| 久久久精品黄色| 亚洲色大成网站www久久九九| 亚洲韩国一区二区三区| 久久99精品国产.久久久久| 国产成人激情av| 91国偷自产一区二区使用方法| 欧美男女性生活在线直播观看| 精品少妇一区二区三区在线播放| 日本一区二区三区四区| 亚洲夂夂婷婷色拍ww47| 久久91精品久久久久久秒播| 成人免费看片app下载| 精品视频全国免费看| 国产亚洲成aⅴ人片在线观看| 一区二区在线看| 精品亚洲免费视频| 日本韩国欧美国产| 久久久综合网站| 亚洲va中文字幕| 高清久久久久久| 91精品国产综合久久久久久| 欧美高清在线一区| 热久久国产精品| 91视频在线观看免费| 精品精品欲导航| 一区二区三区在线播| 国产剧情一区在线| 51久久夜色精品国产麻豆| 最新久久zyz资源站| 久久成人免费网站| 在线观看成人小视频| 国产拍揄自揄精品视频麻豆| 日韩电影在线免费观看| jvid福利写真一区二区三区| 日韩精品一区二区三区中文精品 | 91丨九色porny丨蝌蚪| 精品乱码亚洲一区二区不卡| 亚洲精品乱码久久久久久黑人 | 久久久美女毛片| 午夜精品福利一区二区三区av| 99九九99九九九视频精品| 亚洲精品一区二区三区四区高清 | 亚洲女与黑人做爰| 国产成人亚洲精品狼色在线| 日韩欧美综合在线| 婷婷六月综合亚洲| 欧美在线综合视频| 亚洲视频综合在线| 99久精品国产| 国产精品激情偷乱一区二区∴| 国产一区欧美一区| 2024国产精品视频| 狠狠色综合播放一区二区| 51精品久久久久久久蜜臀| 午夜一区二区三区在线观看| 色嗨嗨av一区二区三区| 亚洲摸摸操操av| 一本一本大道香蕉久在线精品 | 久久久久久毛片| 国产一区二区三区观看| 久久一日本道色综合| 久久精品久久精品| 日韩精品最新网址|