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

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

?? tftpserver.c.txt

?? linux下的tftp源代碼,分為服務器端和連接客戶端
?? TXT
字號:
#include "tftpserver.h"

struct CONTEXT *contextlist;

int main(int argc, char* argv[])
{	
	int sock;	
	struct sockaddr_in ServAddr;
	struct sockaddr_in ClientAddr;
	struct in_addr *clientaddr;
	unsigned int ClientAddrLen;
	unsigned short ServPort;
	unsigned short *opcode;
	int ret=0;
	unsigned char msg[600];
	int msgsize;

	contextlist = NULL;
	ServPort = atoi(argv[1]);	

	if((sock=socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP))<0)
	{
		printf("\n Error : socket() failed\n");
		exit(-1);
	}
	memset(&ServAddr, 0, sizeof(ServAddr));
	ServAddr.sin_family = AF_INET;	
	ServAddr.sin_addr.s_addr = htonl(INADDR_ANY);
	ServAddr.sin_port = htons(ServPort);

	if(bind(sock, (struct sockaddr*)&ServAddr, sizeof(ServAddr))<0)
	{
		printf("\n Error : bind() failed\n");
		exit(-1);
	}

	for(;;)
	{
		ClientAddrLen = sizeof(ClientAddr);
		memset(msg, 0, sizeof(msg));

		if( (msgsize = recvfrom(sock, msg, 600, 0, (struct sockaddr*)&ClientAddr, 
			&ClientAddrLen) ) < 0 )
		{
			printf("\n Error : recvfrom() failed !!\n");
			exit(-1);
		}

		opcode = (unsigned short*)msg;
		switch(ntohs(*opcode))
		{
			case RRQ_OPCODE :
				printf("\n recv RRQ[%d] \n", msgsize);
				ret = process_RRQ(sock, msg, msgsize, &ClientAddr, ClientAddrLen);
				break;
			case WRQ_OPCODE :
				ret = process_WRQ(sock, msg, msgsize, &ClientAddr, ClientAddrLen);
				break;
			case DATA_OPCODE :
				ret = process_DATA(sock, msg, msgsize, &ClientAddr, ClientAddrLen);
				break;
			case ACK_OPCODE :
				printf("\n recv ACK[%d] \n", msgsize);
				ret = process_ACK(sock, msg, msgsize, &ClientAddr, ClientAddrLen);
				break;
			case ERROR_OPCODE :
				ret = process_ERROR(sock, msg, msgsize, &ClientAddr, ClientAddrLen);
				break;
			default :
				printf("\n ERROR :  Receive Unknown OpCode Packet !! -> Ignore ");
				ret=1;
		}
		if( ret <0)
		{
			remove_all_context();
			close(sock);
			exit(-1);
		}
	}
	return 0;
}

int process_RRQ(int socket, char *msg, int recvsize, 
		struct sockaddr_in *clientaddr, int clientaddrsize)
{
	FILE *fp;
	struct RRQ *rrqpacket;
	struct DATA	*datapacket;
	char sendmsg[600];
	size_t readsize;
	int sendsize;
	struct CONTEXT *pContext;
	
	if( recvsize != sizeof(struct RRQ))
	{
		printf("\n Error : Bad RRQ size: %d ", recvsize);
		send_error(socket, clientaddr, clientaddrsize, 0, "Bad Packet Size");
		return 1;
	}

	rrqpacket = (struct RRQ *)msg;
	if(strcmp(rrqpacket->Mode, BIN) != 0)
	{
		printf("\n Error : Bad RRQ mode: %s field", rrqpacket->Mode);
		send_error(socket, clientaddr, clientaddrsize, 0, "Illegal Mode");
		return 1;
	}
	printf("\n process_RRQ : filename %s", rrqpacket->FileName);

	if((fp = fopen(rrqpacket->FileName, "r+b"))==NULL)
	{
		printf("\n Error : file[%s] not found", rrqpacket->FileName);
		send_error(socket, clientaddr, clientaddrsize, 1, "File not found");
		return 1;
	}
	
	// Context creation ...
	if( (pContext=(struct CONTEXT*)malloc(sizeof(struct CONTEXT))) == NULL)
	{
		printf("\n ERROR: malloc error");
		send_error(socket, clientaddr, clientaddrsize, 0, "malloc error");
		fclose(fp);
		return -1;
	}
	memset(pContext, 0, sizeof(struct CONTEXT));
	
	// Context initialize ...
	pContext->State = SEND_DATA_STATE;
	pContext->RecvNumber = 1;
	pContext->SendNumber = 1;
	pContext->CurrentByteSize = 0;
	
	// Send first DATA packet ..
	datapacket = (struct DATA *)sendmsg;
	datapacket->OpCode = htons(DATA_OPCODE);


	readsize = fread(datapacket->Data, 1, 512, fp);

	if( readsize <= 0)
	{
		printf("\n ERROR: fread() error");
		send_error(socket, clientaddr, clientaddrsize, 0, "fread error");
		fclose(fp);
		free(pContext);
		return -1;
	}
	datapacket->BlockNumber = htons(pContext->SendNumber);  // == 1
	sendsize = sendto(socket, sendmsg, sizeof(struct DATA)+readsize-1, 0, 
		(struct sockaddr*)clientaddr, clientaddrsize);
	printf("\n Send DATA[%d]  BlockNumber[%u]\n", sendsize, ntohs(datapacket->BlockNumber));

	// state processing ...
	if (readsize < 512)
		pContext->State = WAITING_CLOSE_STATE;
	else
		pContext->State = SEND_DATA_STATE;
	pContext->CurrentByteSize=readsize;
	strcpy(pContext->FileName, rrqpacket->FileName);
	pContext->fp = fp;
	memcpy( &(pContext->ClientAddr), clientaddr, sizeof(struct sockaddr_in) );

	// Context insertion ..
	pContext->next=contextlist;
	contextlist=pContext;

	return 1;
}

int process_ACK(int socket, char *msg, int recvsize, 
		struct sockaddr_in *clientaddr, int clientaddrsize)
{
	FILE *fp;
	struct ACK *ackpacket;
	struct DATA	*datapacket;
	char sendmsg[600];
	size_t readsize;
	int sendsize;
	struct CONTEXT *pContext;

	ackpacket = (struct ACK *)msg;
	pContext = find_context(clientaddr);

	if( pContext == NULL)
	{
		printf("\n Error : recv ACK but No Context.. ignore  ");
		send_error(socket, clientaddr, clientaddrsize, 0, "ACK but No Context");
		return 1;
	}
	
	if( recvsize != sizeof(struct ACK))
	{
		printf("\n Error : Bad ACK size: %d ", recvsize);
		send_error(socket, clientaddr, clientaddrsize, 0, "ACK but Bad Packet Size");
		remove_context(pContext);
		return 1;
	}

	if( pContext->State != SEND_DATA_STATE && pContext->State != WAITING_CLOSE_STATE)
	{
		printf("\n Error : ACK but bad State %d", pContext->State);
		send_error(socket, clientaddr, clientaddrsize, 0, "ACK but Bad State");
		remove_context(pContext);
		return 1;
	}
	if( pContext->SendNumber != ntohs(ackpacket->BlockNumber) )
	{
		printf("\n Error : recv ACK but bad Ack num %u", ntohs(ackpacket->BlockNumber));
		send_error(socket, clientaddr, clientaddrsize, 0, "ACK but Bad Block Number");
		remove_context(pContext);
		return 1;
	}

	// State == WAITING_CLOSE_STATE
	if ( pContext->State == WAITING_CLOSE_STATE)
	{
		printf("\n All Data Sending ...\n");
		fclose(pContext->fp);
		remove_context(pContext);
		return 1;
	}


	// Make and Send  DATA packet ..
	datapacket = (struct DATA *)sendmsg;
	datapacket->OpCode = htons(DATA_OPCODE);
	readsize = fread(datapacket->Data, 1, 512, pContext->fp);

	if( readsize <= 0)
	{
		printf("\n ERROR: fread() error");
		send_error(socket, clientaddr, clientaddrsize, 0, "fread error");
		fclose(pContext->fp);
		remove_context(pContext);
		return -1;
	}
	++(pContext->SendNumber);  // increase the send block counter ..
	datapacket->BlockNumber = htons(pContext->SendNumber);   
	sendsize = sendto(socket, sendmsg, sizeof(struct DATA)+readsize-1, 0, 
		(struct sockaddr*)clientaddr, clientaddrsize);
	printf("\n Send DATA[%d]  BlockNumber[%u]\n", sendsize, ntohs(datapacket->BlockNumber));

	// state processing ...
	if (readsize < 512)
		pContext->State = WAITING_CLOSE_STATE;
	else
		pContext->State = SEND_DATA_STATE;
	pContext->CurrentByteSize += readsize;
	return 1;
}

int process_DATA(int socket, char *msg, int recvsize, 
		struct sockaddr_in *clientaddr, int clientaddrsize)
{
	printf("\n Not Implemented yet.. ");
	return 1;
}

int process_WRQ(int socket, char *msg, int recvsize, 
		struct sockaddr_in *clientaddr, int clientaddrsize)
{
	printf("\n Not Implemented yet.. ");
	return 1;
}

int process_ERROR(int socket, char *msg, int recvsize, 
		struct sockaddr_in *clientaddr, int clientaddrsize)
{
	struct ERROR *errorpacket;

	if( recvsize < sizeof(struct ERROR))
	{
		printf("\n Error Packet : Bad ERROR size: %d ", recvsize);
		return -1;
	}
	errorpacket = (struct ERROR *)msg;

	printf("\n ERROR packet recv  ErrorNumber: %d  ErrorMsg : %s", 
		ntohs(errorpacket->OpCode), errorpacket->ErrorData);

	return -1;

}

struct CONTEXT *find_context(struct sockaddr_in *clientaddr)
{
	struct CONTEXT *pContext;

	pContext=contextlist;
	while(pContext)
	{
		if( !memcmp(&(pContext->ClientAddr), clientaddr, sizeof(struct sockaddr_in)) )
			return pContext;
		pContext=pContext->next;
	}
	return NULL;
}

int remove_context(struct CONTEXT *pContext)
{
	struct CONTEXT *p, *q;

	p=q=contextlist;

	while(p)
	{
		if( p==pContext)
		{
			//first context ..
			if( p==q)
			{
				contextlist=p->next;
				free(p);
				return 1;
			}
			else
			{
				q->next=p->next;
				free(p);
				return 1;
			}
		}
		q=p;
		p=p->next;
	}
	return 0;
}

int remove_all_context(void)
{
	struct CONTEXT *p, *temp;

	if(!contextlist)
		return 0;

	p=contextlist;
	while(p)
	{
		temp=p;
		p=p->next;
		free(temp);
	}
	contextlist=NULL;
	return 0;
}

int send_error(int socket, struct sockaddr_in *clientaddr, int clientaddrsize, 
			unsigned short errorcode, char *errormsg)
{
	char sendmsg[128];
	struct ERROR *errorpacket;
	int	sendsize;

	errorpacket = (struct ERROR *)sendmsg;
	errorpacket->OpCode = htons(ERROR_OPCODE);
	errorpacket->ErrorNumber = htons(errorcode); // file not found ..
	strcpy(errorpacket->ErrorData, errormsg);

	sendsize = sendto(socket, errorpacket, sizeof(struct ERROR)+strlen(errormsg)-1, 0,
		(struct sockaddr*)clientaddr, clientaddrsize);
	
	printf("\n Send ERROR[%d]  OpCode[%u] ErrorNum[%u] ErrorMsg[%s]\n", sendsize, 
		ntohs(errorpacket->OpCode), ntohs(errorpacket->ErrorNumber), errorpacket->ErrorData);

	return 1;
}


?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
色呦呦国产精品| 国产精品理论在线观看| 中文字幕不卡一区| 日韩精品成人一区二区在线| 成人h版在线观看| 欧美美女bb生活片| 亚洲人吸女人奶水| 欧美蜜桃一区二区三区| 国产精品久久久久天堂| 亚洲二区在线视频| 成人网在线播放| 精品国产伦一区二区三区观看体验| 亚洲欧美在线视频| 国产一区二区三区观看| 9191精品国产综合久久久久久| 综合在线观看色| 懂色av一区二区三区蜜臀 | 日本不卡一区二区| 91老师国产黑色丝袜在线| 中文字幕av一区二区三区| 紧缚奴在线一区二区三区| 日韩三级视频在线看| 亚洲成人av一区| 欧美日韩精品三区| 亚洲国产综合人成综合网站| 91福利小视频| 亚洲主播在线观看| 欧美日韩国产在线观看| 亚洲一二三四区不卡| 在线看国产一区| 夜夜嗨av一区二区三区中文字幕 | 欧美精品1区2区| 一区二区三区自拍| 91黄视频在线观看| 亚洲电影你懂得| 在线播放国产精品二区一二区四区| 亚洲成人1区2区| 91精品国产综合久久久蜜臀图片| 午夜视频在线观看一区二区三区| 欧美日韩国产高清一区二区三区 | 欧美色电影在线| 亚洲自拍偷拍图区| 欧美高清视频www夜色资源网| 亚洲国产精品久久艾草纯爱| 欧美日本国产视频| 欧美a级理论片| 久久久噜噜噜久久中文字幕色伊伊 | 国产米奇在线777精品观看| 精品国偷自产国产一区| 国产麻豆精品视频| 成人欧美一区二区三区在线播放| 色综合久久中文综合久久97 | 17c精品麻豆一区二区免费| 91美女福利视频| 性做久久久久久免费观看| 欧美电影免费观看高清完整版 | 色婷婷亚洲一区二区三区| 亚洲已满18点击进入久久| 日韩免费看的电影| 成人综合在线网站| 亚洲h动漫在线| 精品99一区二区三区| 91网页版在线| 麻豆91在线看| 亚洲欧美日韩在线不卡| 日韩一区二区三区免费观看| caoporen国产精品视频| 日韩国产一区二| 中文字幕一区二区不卡| 日韩女优制服丝袜电影| 99免费精品在线| 伦理电影国产精品| 一区二区三区久久| 国产亚洲女人久久久久毛片| 欧美视频一区二区三区四区| 国产成人精品1024| 日韩二区在线观看| 亚洲免费在线视频| 久久久精品日韩欧美| 精品视频999| 99国产一区二区三精品乱码| 国产综合成人久久大片91| 一区二区不卡在线视频 午夜欧美不卡在| 日韩精品综合一本久道在线视频| 色94色欧美sute亚洲线路二| 国产高清不卡一区二区| 日本麻豆一区二区三区视频| 亚洲激情网站免费观看| 国产精品污网站| 日韩美女一区二区三区| 在线观看日产精品| av在线综合网| 粉嫩av一区二区三区| 国产在线麻豆精品观看| 美日韩一区二区| 婷婷中文字幕综合| 亚洲一区二区三区激情| 亚洲免费观看在线视频| 欧美—级在线免费片| 久久精品无码一区二区三区| 日韩欧美亚洲国产精品字幕久久久 | 国产成人av电影在线播放| 老色鬼精品视频在线观看播放| 香蕉影视欧美成人| 夜夜夜精品看看| 亚洲资源在线观看| 亚洲精品乱码久久久久久黑人| 国产欧美一区二区精品仙草咪| 26uuu精品一区二区| 日韩女同互慰一区二区| 精品久久一区二区三区| 欧美xxxx老人做受| 久久久久国产成人精品亚洲午夜| 久久午夜色播影院免费高清| 久久综合九色综合97婷婷| 精品少妇一区二区三区视频免付费 | 亚洲日本护士毛茸茸| 国产精品电影一区二区三区| 国产精品久久久久久久久久免费看| 国产免费久久精品| 国产精品久久久久久久久免费丝袜| 国产精品乱码一区二区三区软件 | www一区二区| 久久久99精品久久| 欧美激情综合在线| 亚洲色图在线播放| 五月天久久比比资源色| 日本在线不卡视频一二三区| 麻豆91在线观看| 国产东北露脸精品视频| eeuss鲁片一区二区三区| 在线亚洲高清视频| 欧美电影免费观看高清完整版| 久久久久久久久久久电影| 国产精品国产三级国产普通话99| 亚洲一区二区中文在线| 美女脱光内衣内裤视频久久网站 | 亚洲一区二区偷拍精品| 日韩精品欧美精品| 国产精品 欧美精品| 91在线视频观看| 日韩一区二区免费在线电影| 国产日韩欧美综合一区| 玉足女爽爽91| 狠狠色狠狠色综合系列| 99久久精品免费精品国产| 5566中文字幕一区二区电影 | 精品av综合导航| 亚洲天堂成人在线观看| 日本亚洲免费观看| 成人黄色电影在线| 欧美一级高清片| 亚洲日本一区二区三区| 美女视频黄a大片欧美| 99精品视频一区二区| 4438成人网| 亚洲人一二三区| 蜜臀av在线播放一区二区三区 | 日韩一区二区高清| 国产精品久久二区二区| 裸体健美xxxx欧美裸体表演| 色婷婷av久久久久久久| 国产亚洲成年网址在线观看| 亚洲在线免费播放| 国产精品一区不卡| 91精品国产综合久久精品性色| 国产精品全国免费观看高清| 日韩av网站在线观看| 在线精品国精品国产尤物884a| 国产亚洲1区2区3区| 免费成人在线观看| 欧美日韩一区视频| 亚洲精品视频免费看| 粉嫩高潮美女一区二区三区| 日韩一级片在线观看| 午夜视黄欧洲亚洲| 欧美在线free| 亚洲少妇屁股交4| 成人黄色国产精品网站大全在线免费观看| 日韩一区二区在线观看| 亚洲国产精品一区二区久久恐怖片 | 在线播放欧美女士性生活| 亚洲精选免费视频| 99久久久精品| 日韩美女久久久| 99精品在线免费| 国产精品色眯眯| 粉嫩在线一区二区三区视频| 久久久久国产精品麻豆ai换脸| 久久国产精品免费| 欧美不卡在线视频| 欧美aaaaaa午夜精品| 欧美一区二区三区在| 午夜亚洲国产au精品一区二区| 在线观看av一区二区| 亚洲国产精品麻豆| 欧美人xxxx| 青青草97国产精品免费观看| 欧美另类高清zo欧美| 日韩高清在线电影|