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

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

?? tftpserver.cpp

?? 一個簡單的tftp服務器
?? CPP
?? 第 1 頁 / 共 4 頁
字號:
/***************************************************************************   Copyright (C) 2005 by Achal Dhir                                      **   achaldhir@gmail.com                                                   **                                                                         **   This program is free software; you can redistribute it and/or modify  **   it under the terms of the GNU General Public License as published by  **   the Free Software Foundation; either version 2 of the License, or     **   (at your option) any later version.                                   **                                                                         **   This program is distributed in the hope that it will be useful,       **   but WITHOUT ANY WARRANTY; without even the implied warranty of        **   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         **   GNU General Public License for more details.                          **                                                                         **   You should have received a copy of the GNU General Public License     **   along with this program; if not, write to the                         **   Free Software Foundation, Inc.,                                       **   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             ****************************************************************************/// tftpserver.cpp#include <sys/types.h>#include <limits.h>#include <sys/socket.h>#include <netinet/in.h>#include <arpa/inet.h>#include <netdb.h>#include <unistd.h>#include <signal.h>#include <stdio.h>#include <fcntl.h>#include <errno.h>#include <sys/time.h>#include <time.h>#include <stdlib.h>#include <limits.h>#include <memory.h>#include <sys/stat.h>#include <stdio.h>#include <syslog.h>#include <string>#include <pthread.h>#include <sys/socket.h>#include <sys/ioctl.h>#include <map>using namespace std;#include "tftpserver.h"//Global Variablesbool kRunning = true;myMap tftpCache;myMultiMap tftpAge;bool verbatim = false;char iniFile[256]="";char logFile[256]="";WORD blksize = 65464;WORD timeout = 3;data2 cfig;char tempbuff[256];char logBuff[512];char sVersion[] = "TFTP Server SinglePort Version 1.55 Unix Built 1551";packet* datain;int main(int argc, char **argv){	signal(SIGINT, catch_int);	signal(SIGABRT, catch_int);	signal(SIGTERM, catch_int);	signal(SIGQUIT, catch_int);	signal(SIGTSTP, catch_int);	signal(SIGHUP, catch_int);    logBuff[0] = 0;    for (int i = 1; i < argc; i++)    {        if (!strcasecmp(argv[i], "-v"))            verbatim = true;        else if (!strcmp(argv[i], "-i") && argc > i + 1 && argv[i + 1][0] != '-' )        {            myTrim(iniFile, argv[i + 1]);            i++;        }        else if (!strcmp(argv[i], "-l") && argc > i + 1 && argv[i + 1][0] != '-' )        {            myTrim(logFile, argv[i + 1]);            i++;        }        else if (!strncasecmp(argv[i], "-i", 2))            myTrim(iniFile, argv[i] + 2);        else if (!strncasecmp(argv[i], "-l", 2))            myTrim(logFile, argv[i] + 2);        else            sprintf(logBuff, "Error: Invalid Argument %s", argv[i]);    }	if (!iniFile[0])		strcpy(iniFile,"/etc/tftpserver.ini");	if (verbatim)	{		if (logBuff[0])		{			printf("%s\n", logBuff);			exit(EXIT_FAILURE);		}		init();		timeval tv;		fd_set readfds;		request req;		datain = (packet*)calloc(1, blksize + 4);		int fdsReady = 0;		if (!datain)		{			sprintf(logBuff,"Memory Error");			logMess(logBuff, 0);			exit(1);		}		if (cfig.tftpConn[0].server)		{			printf("\nAccepting requests..\n");			do			{				FD_ZERO(&readfds);				tv.tv_sec = 1;				tv.tv_usec = 0;				for (int i = 0; i < MAX_SERVERS && cfig.tftpConn[i].server; i++)					FD_SET(cfig.tftpConn[i].sock, &readfds);				fdsReady = select(cfig.maxFD, &readfds, NULL, NULL, &tv);				//if (errno)				//	printf("%s\n", strerror(errno));				for (int i = 0; fdsReady > 0 && i < MAX_SERVERS && cfig.tftpConn[i].server; i++)				{					if (FD_ISSET(cfig.tftpConn[i].sock, &readfds))					{						fdsReady--;						memset(&req, 0, sizeof(request));						memset(datain, 0, blksize + 4);						req.clientsize = sizeof(req.client);						req.sockInd = i;						errno = 0;						req.bytesRecd = recvfrom(cfig.tftpConn[req.sockInd].sock, (char*)datain, blksize + 4, 0, (sockaddr*)&req.client, &req.clientsize);						if (req.bytesRecd < 4 || errno)							continue;						//printf("%u=%u\n", req.bytesRecd, blksize + 4);						sprintf(req.mapname, "%s:%u", inet_ntoa(req.client.sin_addr), ntohs(req.client.sin_port));						request *req1 = tftpCache[req.mapname];						if (!req1)							tftpCache.erase(req.mapname);						//printf("%u\n",req1);						//printf("Here\n");						if (req1)						{							req1->bytesRecd = req.bytesRecd;							if (ntohs(datain->opcode) == 3 && req1->opcode == 2)							{								if ((WORD)req1->bytesRecd  <= req1->blksize + 4)								{									req1->tblock = req1->block + 1;									if (req1->attempt <= 3 && ntohs(datain->block) == req1->tblock)									{										req1->block = req1->tblock;										req1->fblock++;										req1->attempt = 0;										req1->acout.opcode = htons(4);										req1->acout.block = ntohs(req1->block);										processRecv(req1);									}								}								else								{									req1->serverError.opcode = htons(5);									req1->serverError.errorcode = htons(4);									req1->bytesSent = sendto(cfig.tftpConn[req1->sockInd].sock, (const char*)&req1->serverError, strlen(req1->serverError.errormessage) + 5, 0, (sockaddr*)&req1->client, req1->clientsize);									sprintf(req1->serverError.errormessage, "Error: Incoming Packet too large");									logMess(req1, 1);									req1->attempt = UCHAR_MAX;								}							}							else if (ntohs(datain->opcode) == 4 && req1->opcode == 1)							{								if (req1->bytesRecd >= 4)								{									if (req1->attempt <= 3 && ntohs(datain->block) == req1->block)									{										req1->block++;										req1->fblock++;										req1->attempt = 0;										processSend(req1);									}								}							}							else if (req1->bytesRecd > 512)							{								req1->serverError.opcode = htons(5);								req1->serverError.errorcode = htons(4);								req1->bytesSent = sendto(cfig.tftpConn[req1->sockInd].sock, (const char*)&req1->serverError, strlen(req1->serverError.errormessage) + 5, 0, (sockaddr*)&req1->client, req1->clientsize);								sprintf(req1->serverError.errormessage, "Error: Incoming Packet too large");								logMess(req1, 1);								req1->attempt = UCHAR_MAX;							}							else if (ntohs(datain->opcode) == 1 || ntohs(datain->opcode) == 2)							{								if (req1->file)								{									fclose(req1->file);									req1->file = 0;								}								if (!processNew(&req))								{									memcpy(req1, &req, sizeof(request));								}							}							else if (ntohs(datain->opcode) == 5)							{								sprintf(req1->serverError.errormessage, "Error %i at Client, %s", ntohs(datain->block), &datain->buffer);								logMess(req1, 1);								req1->attempt = UCHAR_MAX;								if (req1->file)								{									fclose(req1->file);									req1->file = 0;								}							}							else							{								req1->serverError.opcode = htons(5);								req1->serverError.errorcode = htons(4);								sprintf(req1->serverError.errormessage, "Unexpected Option Code %u", ntohs(datain->opcode));								req1->bytesSent = sendto(cfig.tftpConn[req1->sockInd].sock, (const char*)&req1->serverError, strlen(req1->serverError.errormessage) + 5, 0, (sockaddr*)&req1->client, req1->clientsize);								logMess(req1, 1);								req1->attempt = UCHAR_MAX;								if (req1->file)								{									fclose(req1->file);									req1->file = 0;								}							}						}						else if (req.bytesRecd < 4 || errno)						{							req.serverError.opcode = htons(5);							req.serverError.errorcode = htons(0);							sprintf(req.serverError.errormessage, "Communication Error");							logMess(&req, 1);						}						else if (ntohs(datain->opcode) != 1 && ntohs(datain->opcode) != 2)						{							req.serverError.opcode = htons(5);							req.serverError.errorcode = htons(5);							sprintf(req.serverError.errormessage, "Unknown transfer ID");							req.bytesSent = sendto(cfig.tftpConn[i].sock, (const char*)&req.serverError, strlen(req.serverError.errormessage) + 5, 0, (sockaddr*)&req.client, req.clientsize);							logMess(&req, 1);						}						else if (req.bytesRecd > 512)						{							req.serverError.opcode = htons(5);							req.serverError.errorcode = htons(4);							sprintf(req.serverError.errormessage, "Error: Incoming Packet too large");							req.bytesSent = sendto(cfig.tftpConn[i].sock, (const char*)&req.serverError, strlen(req.serverError.errormessage) + 5, 0, (sockaddr*)&req.client, req.clientsize);							logMess(&req, 1);						}						else if (ntohs(datain->opcode) == 5)						{							sprintf(req.serverError.errormessage, "Error %i at Client, %s", ntohs(datain->block), &datain->buffer);							logMess(&req, 1);						}						else						{							if (cfig.hostRanges[0].rangeStart)							{								DWORD iip = ntohl(req.client.sin_addr.s_addr);								BYTE allowed = false;								for (WORD j = 0; j <= sizeof(cfig.hostRanges) && cfig.hostRanges[j].rangeStart; j++)								{									if (iip >= cfig.hostRanges[j].rangeStart && iip <= cfig.hostRanges[j].rangeEnd)									{										allowed = true;										break;									}								}								if (!allowed)								{									req.serverError.opcode = htons(5);									req.serverError.errorcode = htons(2);									strcpy(req.serverError.errormessage, "Access Denied");									logMess(&req, 1);									req.bytesSent = sendto(cfig.tftpConn[i].sock, (const char*)&req.serverError, strlen(req.serverError.errormessage) + 5, 0, (sockaddr*)&req.client, req.clientsize);									continue;								}							}							if (!processNew(&req))							{								request *req1 = (request*)calloc(1, sizeof(request));								if (!req1)								{									sprintf(logBuff,"Memory Error");									logMess(logBuff, 1);									continue;								}								memcpy(req1, &req, sizeof(request));								tftpCache[req1->mapname] = req1;								tftpAge.insert(pair<long, request*>(req1->expiry, req1));							}						}					}				}				myMultiMap::iterator p = tftpAge.begin();				myMultiMap::iterator q;				time_t currentTime = time(NULL);				while (p != tftpAge.end())				{					if (!tftpAge.size())						break;					request *req = p->second;					if (p->first > currentTime)					{						break;					}					else if (p->first < req->expiry && req->expiry > currentTime)					{						q = p;						p++;						tftpAge.erase(q);						tftpAge.insert(pair<long, request*>(req->expiry, req));					}					else if (req->expiry <= currentTime && req->attempt >= 3)					{						if (req->attempt < UCHAR_MAX)						{							req->serverError.opcode = htons(5);							req->serverError.errorcode = htons(0);							if (req->fblock && !req->block)								strcpy(req->serverError.errormessage, "Large File, Block# Rollover not supported by Client");							else								strcpy(req->serverError.errormessage, "Timeout");							req->bytesSent = sendto(cfig.tftpConn[req->sockInd].sock, (const char*) &req->serverError, strlen(req->serverError.errormessage) + 5, 0, (sockaddr*)&req->client, req->clientsize);							logMess(req, 1);						}						q = p;						p++;						tftpAge.erase(q);						tftpCache.erase(req->mapname);						clean(req);					}					else if (req->expiry <= currentTime)					{						if (ntohs(req->acout.opcode) == 3)						{							if (processSend(req))								req->attempt = 255;							else							{								req->attempt++;								req->expiry = currentTime + req->timeout;							}						}						else						{							errno = 0;							req->bytesSent = sendto(cfig.tftpConn[req->sockInd].sock, (const char*)&req->acout, req->bytesSent, 0, (sockaddr*)&req->client, req->clientsize);							if (errno)								req->attempt = 255;							else							{								req->attempt++;								req->expiry = currentTime + req->timeout;							}						}						p++;					}					else						p++;				}			}			while (kRunning);		}	}	else	{		if(logBuff[0])		{			syslog(LOG_MAKEPRI(LOG_LOCAL1, LOG_CRIT), logBuff);			exit(EXIT_FAILURE);		}		/* Our process ID and Session ID */		pid_t pid, sid;		/* Fork off the parent process */		pid = fork();		if (pid < 0)		{			exit(EXIT_FAILURE);		}		/* If we got a good PID, then		we can exit the parent process. */		if (pid > 0)		{			exit(EXIT_SUCCESS);		}		/* Change the file mode mask */		umask(0);		/* Open any logs here */		/* Create a new SID for the child process */		sid = setsid();		if (sid < 0)		{			/* Log the failure */			exit(EXIT_FAILURE);		}		/* Change the current working directory */		if ((chdir("/")) < 0)		{			/* Log the failure */			exit(EXIT_FAILURE);		}		/* Close out the standard file descriptors */		close(STDIN_FILENO);		close(STDOUT_FILENO);		close(STDERR_FILENO);		/* Daemon-specific initialization goes here */		//Initialize		init();		timeval tv;		fd_set readfds;		request req;		datain = (packet*)calloc(1, blksize + 4);		int fdsReady = 0;		if (!datain)		{			sprintf(logBuff,"Memory Error");			logMess(logBuff, 0);			exit(1);		}		if (cfig.tftpConn[0].server)		{			do			{				FD_ZERO(&readfds);				tv.tv_sec = 1;				tv.tv_usec = 0;				for (int i = 0; i < MAX_SERVERS && cfig.tftpConn[i].server; i++)					FD_SET(cfig.tftpConn[i].sock, &readfds);				fdsReady = select(cfig.maxFD, &readfds, NULL, NULL, &tv);				//if (errno)				//	printf("%s\n", strerror(errno));				for (int i = 0; fdsReady > 0 && i < MAX_SERVERS && cfig.tftpConn[i].server; i++)				{					if (FD_ISSET(cfig.tftpConn[i].sock, &readfds))					{						fdsReady--;						memset(&req, 0, sizeof(request));						memset(datain, 0, blksize + 4);						req.clientsize = sizeof(req.client);						req.sockInd = i;						errno = 0;						req.bytesRecd = recvfrom(cfig.tftpConn[req.sockInd].sock, (char*)datain, blksize + 4, 0, (sockaddr*)&req.client, &req.clientsize);						if (req.bytesRecd < 4 || errno)							continue;						//printf("%u=%u\n", req.bytesRecd, blksize + 4);						sprintf(req.mapname, "%s:%u", inet_ntoa(req.client.sin_addr), ntohs(req.client.sin_port));

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美不卡一区二区三区| 久久日一线二线三线suv| 日韩三级免费观看| 中文字幕视频一区| 久久精品99国产精品| 色婷婷久久久久swag精品 | 91福利精品第一导航| 久久综合久久综合久久综合| 亚洲成人777| 99久久精品国产导航| 26uuu欧美| 麻豆久久久久久| 欧美精品一二三| 亚洲乱码日产精品bd| 成人黄色av电影| 久久亚洲影视婷婷| 久久99国产精品久久99| 欧美系列一区二区| 亚洲伦在线观看| 波多野结衣在线aⅴ中文字幕不卡| 日韩欧美高清一区| 日韩和欧美一区二区三区| 日本道色综合久久| ...xxx性欧美| 91免费版pro下载短视频| 欧美激情一区二区三区四区| 久久97超碰色| 久久久不卡网国产精品二区| 久久99精品久久久久久久久久久久| 91精品国模一区二区三区| 天天射综合影视| 欧美精品久久天天躁| 午夜精品在线看| 5月丁香婷婷综合| 秋霞av亚洲一区二区三| 欧美一区二区三区婷婷月色| 日韩av电影免费观看高清完整版在线观看 | 91精品国产综合久久久蜜臀粉嫩| 亚洲韩国一区二区三区| 欧美日韩免费一区二区三区| 亚洲777理论| 欧美成人精品1314www| 国产专区欧美精品| 日本一区二区久久| 在线视频国产一区| 视频一区中文字幕| 精品日韩在线一区| 成人午夜激情片| 一区二区在线观看不卡| 欧美精品在线观看一区二区| 久久精品99国产精品日本| 久久久精品免费免费| 99天天综合性| 丝袜诱惑亚洲看片 | 91在线精品一区二区三区| 亚洲精品免费播放| 91麻豆精品国产91久久久久久| 精品一区免费av| 国产精品国产成人国产三级| 色一区在线观看| 免费人成在线不卡| 中文一区在线播放 | 欧美亚洲综合另类| 免费人成在线不卡| 国产精品久久久一本精品 | 国产欧美日韩三级| 在线观看亚洲精品视频| 蜜乳av一区二区| 国产精品第13页| 欧美久久一二区| 波多野结衣精品在线| 免费高清不卡av| 亚洲欧洲韩国日本视频| 欧美一区二区在线视频| 99久久久国产精品免费蜜臀| 秋霞成人午夜伦在线观看| 最好看的中文字幕久久| 欧美变态口味重另类| 色哟哟一区二区三区| 久久99国产精品成人| 一区二区三区精品在线| 国产日本欧洲亚洲| 日韩一区二区在线观看| 在线观看视频一区| 丰满岳乱妇一区二区三区| 青青草原综合久久大伊人精品| 亚洲欧洲三级电影| 久久欧美中文字幕| 欧美一区二区久久| 欧美影视一区在线| 99精品欧美一区| 国产在线麻豆精品观看| 午夜精彩视频在线观看不卡| 亚洲免费观看高清完整版在线 | 亚洲电影一级黄| 亚洲精品免费播放| 国产精品国产馆在线真实露脸| 精品国产伦一区二区三区观看方式| 欧美午夜影院一区| 在线一区二区观看| 99国产精品一区| 成人久久18免费网站麻豆 | 日本一二三不卡| 欧美成人精品福利| 日韩精品一区国产麻豆| 欧美色综合网站| 欧美综合天天夜夜久久| 色菇凉天天综合网| 一本到三区不卡视频| 色综合久久综合中文综合网| 欧美日产国产精品| 色系网站成人免费| 一本高清dvd不卡在线观看| av电影天堂一区二区在线观看| 成人性生交大片免费看中文网站| 国产成人在线网站| 成人国产视频在线观看| 99精品欧美一区二区三区小说 | 国产精品69久久久久水密桃 | 五月天激情综合| 午夜a成v人精品| 日欧美一区二区| 精品一区二区日韩| 国产一区二区三区免费在线观看| 精品一区二区在线播放| 激情亚洲综合在线| 成人一区在线观看| 一本到三区不卡视频| 欧美三级韩国三级日本三斤| 欧美精品vⅰdeose4hd| 日韩欧美一区中文| 国产午夜一区二区三区| 亚洲欧洲三级电影| 日韩高清在线观看| 国产精品2024| 日本韩国一区二区三区视频| 欧美色图在线观看| 日韩精品一区二区三区四区 | 欧美大肚乱孕交hd孕妇| 久久天堂av综合合色蜜桃网| 欧美国产日产图区| 亚洲一区二区三区免费视频| 日韩成人精品在线| 国产不卡高清在线观看视频| 色菇凉天天综合网| 精品国产免费人成电影在线观看四季| 国产婷婷一区二区| 一区二区三区四区不卡在线| 美女视频黄a大片欧美| 国产91富婆露脸刺激对白 | 97久久精品人人做人人爽| 欧美无乱码久久久免费午夜一区 | 亚洲另类春色校园小说| 日韩精品电影在线观看| 成人性视频网站| 欧美高清视频不卡网| 久久精品欧美日韩精品| 亚洲自拍另类综合| 丰满白嫩尤物一区二区| 88在线观看91蜜桃国自产| 国产精品色哟哟| 蜜臂av日日欢夜夜爽一区| 色欧美片视频在线观看在线视频| 日韩免费观看2025年上映的电影 | 国产精品美女久久久久aⅴ国产馆| 日韩高清不卡在线| 色琪琪一区二区三区亚洲区| 国产片一区二区| 美腿丝袜亚洲一区| 欧美撒尿777hd撒尿| 亚洲日本乱码在线观看| 国产精品一区二区三区网站| 欧美一级二级在线观看| 亚洲综合色噜噜狠狠| 成人性生交大片免费看中文| 国产欧美日韩在线观看| 日韩高清在线观看| 欧美日韩在线三区| 一区二区在线观看av| 91在线丨porny丨国产| 欧美激情一区三区| 国产不卡视频在线播放| 精品国产91亚洲一区二区三区婷婷| 亚洲成人动漫在线观看| 色婷婷激情综合| 中文字幕中文字幕在线一区| 国产精品91xxx| 国产欧美一区二区三区在线看蜜臀 | 欧美一区二区三区在线观看| 亚洲乱码国产乱码精品精小说| 国产69精品一区二区亚洲孕妇| 精品国产区一区| 国精产品一区一区三区mba桃花| 91精品国产高清一区二区三区| 夜夜精品浪潮av一区二区三区| 91福利国产精品| 亚洲成a人在线观看| 欧美日韩国产综合一区二区三区| 一区二区三区国产豹纹内裤在线| 色综合久久天天|