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

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

?? ntp_iocompletionport.c

?? Network time protocol source study
?? C
字號:
#ifdef HAVE_CONFIG_H# include <config.h>#endif#if defined (HAVE_IO_COMPLETION_PORT)#include <stddef.h>#include <stdio.h>#include <process.h>#include "ntp_stdlib.h"#include "syslog.h"#include "ntp_machine.h"#include "ntp_fp.h"#include "ntp.h"#include "ntpd.h"#include "ntp_refclock.h"#include "ntp_iocompletionport.h"#include "transmitbuff.h"static HANDLE hIoCompletionPort = NULL;static int OnExitRequest(DWORD Key, struct IoCompletionInfo *Info, DWORD Bytes){  (void) Info;  (void) Bytes;  (void) Key;  return 0; /* auto-fail to request an exit */}static IoCompletionInfo ExitRequest;/*  This function will add an entry to the I/O completion port *  that will signal the I/O thread to exit (gracefully) */static voidsignal_io_completion_port_exit(){	ExitRequest.iofunction = OnExitRequest;	if (!PostQueuedCompletionStatus(hIoCompletionPort, 0, 0, &ExitRequest.overlapped)) {		msyslog(LOG_ERR, "Can't request service thread to exit: %m");		exit(1);	}}static void __cdecl iocompletionthread(void *NotUsed){	DWORD BytesTransferred = 0;	DWORD Key = 0;	IoCompletionInfo * Overlapped = NULL;	(void) NotUsed;	/*	Set the thread priority high enough so I/O will	 *	preempt normal recv packet processing, but not	 * 	higher than the timer sync thread.	 */	if (!SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_ABOVE_NORMAL)) {		msyslog(LOG_ERR, "Can't set thread priority: %m");	}	for (;;) {		while (GetQueuedCompletionStatus(hIoCompletionPort, &BytesTransferred, &Key, & (LPOVERLAPPED) Overlapped, INFINITE)) {			if (Overlapped != NULL && 				Overlapped->iofunction != NULL) {				if (!Overlapped->iofunction(Key, Overlapped, BytesTransferred)) {#ifdef DEBUG			msyslog(LOG_INFO, "Overlapped IO Thread Exits: %m");	#endif				return ; /* fail */				}			}		}	}}/*  Create/initialise the I/O creation port */extern voidinit_io_completion_port(	void	){	hIoCompletionPort = CreateIoCompletionPort(INVALID_HANDLE_VALUE, NULL, 0, 0);	if (hIoCompletionPort == NULL) {		msyslog(LOG_ERR, "Can't create I/O completion port: %m");		exit(1);	}		/* Have one thread servicing I/O - there were 4, but this would 	 * somehow cause NTP to stop replying to ntpq requests; TODO 	 */	_beginthread(iocompletionthread, 0, NULL);}	extern voiduninit_io_completion_port(	void	){	if (hIoCompletionPort != NULL) {		/*  Get each of the service threads to exit		*/		signal_io_completion_port_exit();	}}static int QueueIORead( struct refclockio *rio ) {	struct recvbuf *buff;	buff = get_free_recv_buffer();		if (buff == NULL)		return 0;		buff->fd = rio->fd;	buff->iocompletioninfo.iofunction = OnIoReadComplete;	if (!ReadFile((HANDLE) buff->fd, &buff->recv_buffer, sizeof(buff->recv_buffer), NULL, &buff->iocompletioninfo.overlapped)) {			DWORD Result = GetLastError();			switch (Result) {									case NO_ERROR :					case ERROR_HANDLE_EOF :					case ERROR_IO_PENDING :				break ;				default:					msyslog(LOG_ERR, "Can't read from Refclock: %m");					freerecvbuf(buff);					return 0;			}	}	return 1;}/* Return 1 on Successful Read */static int OnIoReadComplete(DWORD i, struct IoCompletionInfo *Info, DWORD Bytes){	struct recvbuf *buff = NULL;	struct refclockio * rio = (struct refclockio *) i;	/*  Convert the overlapped pointer back to a recvbuf pointer.	*/	buff = (struct recvbuf *) ( ((char *) Info) - offsetof(struct recvbuf, iocompletioninfo));	if (Bytes > 0) { /* ignore 0 bytes read due to timeout's */		get_systime(&buff->recv_time);		buff->recv_length = (int) Bytes;		buff->receiver = rio->clock_recv;		buff->dstadr = NULL;		buff->recv_srcclock = rio->srcclock;		add_full_recv_buffer(buff);		buff = NULL;	}	else  		freerecvbuf(buff);	QueueIORead( rio );	return 1;}/*  Add a reference clock data structures I/O handles to *  the I/O completion port. Return 1 if any error. */  intio_completion_port_add_clock_io(	struct refclockio *rio	){	if (NULL == CreateIoCompletionPort((HANDLE) rio->fd, hIoCompletionPort, (DWORD) rio, 0)) {		msyslog(LOG_ERR, "Can't add COM port to i/o completion port: %m");		return 1;	}	QueueIORead( rio );	return 0;}/* Queue a receiver on a socket. Returns 0 if no buffer can be queud */static unsigned long QueueSocketRecv(SOCKET s) {		struct recvbuf *buff;	buff = get_free_recv_buffer();	if (buff != NULL) {		DWORD BytesReceived = 0;		DWORD Flags = 0;		buff->iocompletioninfo.iofunction = OnSocketRecv;		buff->fd = s;		buff->AddressLength = sizeof(struct sockaddr_in);		if (SOCKET_ERROR == WSARecvFrom(buff->fd, &buff->wsabuff, 1, 						&BytesReceived, &Flags, 						(struct sockaddr *) &buff->recv_srcadr, &buff->AddressLength, 						&buff->iocompletioninfo.overlapped, NULL)) {			DWORD Result = WSAGetLastError();			switch (Result) {				case NO_ERROR :				case WSA_IO_INCOMPLETE :				case WSA_WAIT_IO_COMPLETION :				case WSA_IO_PENDING :				break ;				case WSAENOTSOCK :					msyslog(LOG_ERR, "Can't read from socket, because it isn't a socket: %m");					freerecvbuf(buff);					return 0;					break;				case WSAEFAULT :					msyslog(LOG_ERR, "The buffers parameter is incorrect: %m");					freerecvbuf(buff);					return 0;				break;				default :				  /* nop */ ;			}		}	}	else 		return 0;	return 1;}/* Returns 0 if any Error */static int OnSocketRecv(DWORD i, struct IoCompletionInfo *Info, DWORD Bytes){	struct recvbuf *buff = NULL;	struct interface * inter = (struct interface *) i;		/*  Convert the overlapped pointer back to a recvbuf pointer.	*/		buff = (struct recvbuf *) ( ((char *) Info) - offsetof(struct recvbuf, iocompletioninfo));	get_systime(&buff->recv_time);			if (Bytes > 0) {			buff->recv_length = (int) Bytes;		buff->receiver = receive; 		buff->dstadr = inter;#ifdef DEBUG		if (debug > 3) {		char  strbuffer[256];		DWORD strlength = sizeof(strbuffer);		if (0 == WSAAddressToString((struct sockaddr *) &buff->recv_srcadr, buff->AddressLength, NULL, strbuffer, &strlength))   			printf("Received %d bytes from %s\n", Bytes, strbuffer);	}#endif		add_full_recv_buffer(buff);	}	else {		freerecvbuf(buff);	}	QueueSocketRecv(inter->fd);	return 1;}/*  Add a socket handle to the I/O completion port, and send an I/O *  read request to the kernel. * *  Note: As per the winsock documentation, we use WSARecvFrom. Using *        ReadFile() is less efficient. */extern voidio_completion_port_add_socket(struct interface *inter){	if (NULL == CreateIoCompletionPort((HANDLE) inter->fd, hIoCompletionPort, (DWORD) inter, 0)) {		msyslog(LOG_ERR, "Can't add socket to i/o completion port: %m");	}	else QueueSocketRecv(inter->fd);}static int OnSendToComplete(DWORD Key, struct IoCompletionInfo *Info, DWORD Bytes){	transmitbuf *buff = NULL;	(void) Bytes;	(void) Key;	buff = (struct transmitbuf *) ( ((char *) Info) - offsetof(struct transmitbuf, iocompletioninfo));	free_transmit_buffer(buff);	return 1;}static int OnWriteComplete(DWORD Key, struct IoCompletionInfo *Info, DWORD Bytes){	transmitbuf *buff = NULL;	(void) Bytes;	(void) Key;	buff = (struct transmitbuf *) ( ((char *) Info) - offsetof(struct transmitbuf, iocompletioninfo));	free_transmit_buffer(buff);	return 1;}DWORD	io_completion_port_sendto(	struct interface *inter,		struct pkt *pkt,		int len, 	struct sockaddr_in* dest){	transmitbuf *buff = NULL;	DWORD Result = ERROR_SUCCESS;	if (len <= sizeof(buff->pkt)) {		buff = get_free_transmit_buffer();		if (buff != NULL) {			DWORD BytesSent = 0;			DWORD Flags = 0;			memcpy(&buff->pkt, pkt, len);			buff->wsabuf.buf = buff->pkt;			buff->wsabuf.len = len;			buff->iocompletioninfo.iofunction = OnSendToComplete;			Result = WSASendTo(inter->fd, &buff->wsabuf, 1, &BytesSent, Flags, (struct sockaddr *) dest, sizeof(struct sockaddr_in), &buff->iocompletioninfo.overlapped, NULL);#ifdef DEBUG			if (debug > 2) {				char  strbuffer[256];				DWORD strlength = sizeof(strbuffer);				if (0 == WSAAddressToString((LPSOCKADDR) dest, sizeof(*dest), NULL, strbuffer, &strlength))   					printf("SendTo - %d bytes to %s : %d\n", len, strbuffer, Result);			}#endif		}		else {#ifdef DEBUG			if (debug)			printf("No more transmit buffers left - data discarded\n");#endif		return ~ERROR_SUCCESS;		}	}	else {#ifdef DEBUG		if (debug) printf("Packet too large\n");#endif		return ~ERROR_SUCCESS;	}	return Result;}/* * Async IO Write */DWORD	io_completion_port_write(	HANDLE fd,		char *pkt,		int len){	transmitbuf *buff = NULL;	DWORD lpNumberOfBytesWritten;	DWORD Result = -1;	if (len <= sizeof(buff->pkt)) {		buff = get_free_transmit_buffer();		if (buff != NULL) {			DWORD BytesSent = 0;			DWORD Flags = 0;			memcpy(&buff->pkt, pkt, len);			buff->iocompletioninfo.iofunction = OnWriteComplete;			Result = WriteFile(fd, buff->pkt, len, &lpNumberOfBytesWritten, &buff->iocompletioninfo.overlapped);#ifdef DEBUG			if (debug > 2) {				printf("SendTo - %d bytes %d\n", len, Result);			}#endif			if (Result) return len;		}		else {#ifdef DEBUG			if (debug)			printf("No more transmit buffers left - data discarded\n");#endif		}	}	else {#ifdef DEBUG		if (debug) printf("Packet too large\n");#endif	}	return Result;}#else  static int NonEmptyCompilationUnit;#endif

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产亚洲成av人在线观看导航| 亚洲日本一区二区三区| 亚洲免费视频成人| 亚洲一区二区三区视频在线播放 | 91九色最新地址| 国产精品久久久久婷婷| 国产不卡视频在线观看| 欧美精品一区视频| 不卡欧美aaaaa| 国产丝袜欧美中文另类| 97久久精品人人做人人爽50路| 亚洲成人黄色影院| 4438成人网| 国产综合色视频| 亚洲欧洲一区二区在线播放| 91片在线免费观看| 亚洲成人高清在线| 亚洲视频 欧洲视频| 日本韩国一区二区三区视频| 亚洲电影一区二区三区| 91精品国产综合久久精品性色| 国产乱码精品一区二区三区av | 激情文学综合插| 亚洲天堂中文字幕| 欧美一级艳片视频免费观看| 成人蜜臀av电影| 午夜不卡av在线| 日韩精品在线网站| 91成人在线观看喷潮| 国产精品一区三区| 日本午夜一区二区| 一区二区在线免费| 中文字幕精品一区二区精品绿巨人| 欧美视频一区二区三区四区 | 亚洲男人的天堂在线观看| 欧美不卡视频一区| 欧美日韩国产免费一区二区 | 国产精品私人影院| 精品国产一区二区三区久久久蜜月| 色综合天天综合网天天看片| 老司机免费视频一区二区三区| 亚洲资源中文字幕| 一区二区三区四区不卡在线| 欧美极品另类videosde| 精品国产制服丝袜高跟| 欧美福利一区二区| 91精品国模一区二区三区| 日本乱人伦aⅴ精品| 91成人免费电影| 欧美日本在线播放| 欧洲国内综合视频| 91精品国产色综合久久不卡电影 | 国产精品不卡一区| 最新日韩在线视频| 一区二区三区中文字幕在线观看| 亚洲一级电影视频| 亚洲午夜免费电影| 美女性感视频久久| 国产凹凸在线观看一区二区| 成人免费毛片app| 91电影在线观看| 日韩免费电影一区| 中文字幕在线观看一区| 亚洲国产aⅴ天堂久久| 日韩 欧美一区二区三区| 精品一区二区三区久久久| zzijzzij亚洲日本少妇熟睡| 欧美视频三区在线播放| 日韩免费一区二区三区在线播放| 国产亚洲精品超碰| 亚洲综合区在线| 粉嫩蜜臀av国产精品网站| 日本二三区不卡| 国产日韩欧美a| 丝袜诱惑制服诱惑色一区在线观看 | 亚洲黄色片在线观看| 免费在线观看精品| 色88888久久久久久影院野外| 91精品国产高清一区二区三区| 日本一区二区综合亚洲| 亚洲综合色网站| 99久久精品免费看国产| 2020国产精品自拍| 美国精品在线观看| 欧美亚洲国产bt| 亚洲另类中文字| 国产+成+人+亚洲欧洲自线| 日韩精品一区在线观看| 性感美女极品91精品| 色综合一个色综合亚洲| 中文字幕一区二区在线观看| 国产精品中文字幕日韩精品 | 亚洲免费在线视频| 成人精品免费看| 国产精品国模大尺度视频| 国产精品亚洲第一区在线暖暖韩国| 3d动漫精品啪啪| 日本女人一区二区三区| 日韩女优毛片在线| 国内外成人在线| 中文一区一区三区高中清不卡| 国模冰冰炮一区二区| 久久久久国产精品免费免费搜索| 麻豆国产一区二区| 久久精品综合网| jlzzjlzz国产精品久久| 亚洲美女视频在线观看| 欧美三级欧美一级| 麻豆国产精品视频| 国产欧美视频一区二区三区| 成人一区在线看| 亚洲制服丝袜一区| 精品国一区二区三区| www.亚洲色图| 午夜久久久久久久久| 久久综合色综合88| 色综合久久久久久久| 麻豆成人久久精品二区三区红 | 日本一区二区三区高清不卡| 不卡电影免费在线播放一区| 亚洲成人高清在线| 国产精品毛片久久久久久久| 色琪琪一区二区三区亚洲区| 天天综合网天天综合色| 中文久久乱码一区二区| 欧美二区三区的天堂| 国产成人av资源| 日本免费在线视频不卡一不卡二| 国产免费成人在线视频| 欧美一区二区在线不卡| 91在线porny国产在线看| 精品一区精品二区高清| 亚洲一二三四在线观看| 国产精品久久久久久久久快鸭| 日韩写真欧美这视频| 欧美日韩亚洲综合| 9i看片成人免费高清| 99久久精品免费看| 91丝袜美女网| 色香色香欲天天天影视综合网| 成人少妇影院yyyy| 色菇凉天天综合网| 国产高清亚洲一区| 国产精品一区2区| 国产精品一区二区免费不卡| 韩国理伦片一区二区三区在线播放| 午夜成人免费视频| 日本女优在线视频一区二区| 麻豆精品一二三| 国产自产高清不卡| 国产91精品入口| 不卡一区二区三区四区| 91在线你懂得| 精品视频在线免费看| 欧美一区二区精品在线| 2020国产精品自拍| 亚洲免费av高清| 日韩中文字幕麻豆| 国产成人精品亚洲日本在线桃色| 成人va在线观看| 精品国产一区久久| 日本一二三四高清不卡| 亚洲激情网站免费观看| 免费的国产精品| 91一区二区三区在线观看| 欧美亚洲高清一区| 精品电影一区二区三区| 国产精品水嫩水嫩| 午夜不卡av在线| 91在线你懂得| 久久久精品综合| 亚洲第一二三四区| 国产激情91久久精品导航| 色94色欧美sute亚洲线路二| 精品国产污网站| 中文字幕一区二区不卡| 麻豆91精品视频| 欧美性videosxxxxx| 国产精品天天看| 成人午夜碰碰视频| 久久久久久久久97黄色工厂| 香蕉久久一区二区不卡无毒影院 | 青草国产精品久久久久久| 91啪九色porn原创视频在线观看| 精品国产91九色蝌蚪| 日韩激情视频网站| 欧美色欧美亚洲另类二区| 亚洲女女做受ⅹxx高潮| 99久久婷婷国产综合精品电影| 久久久午夜精品| 丁香另类激情小说| 国产精品午夜电影| 成人av网在线| 日本一区二区三区四区在线视频| 天天综合网 天天综合色| 欧美日韩中文国产| 日本v片在线高清不卡在线观看| 欧美一区二区三区小说| 久久激情五月婷婷| 久久久精品黄色|