lib1
来源:互联网 发布:java求数组的实际长度 编辑:程序博客网 时间:2024/06/04 17:43
// testlib1.cpp : Defines the entry point for the console application.//#include "stdafx.h"#include "queue.h"#include "event.h"#include <windows.h>#include <stdio.h>#include <stdlib.h>#include <time.h>#pragma comment(lib, "ws2_32.lib")//#include <sys/time.h>//#include <sys/queue.h>#include <stdio.h>#include <stdlib.h>//#include <unistd.h>#include <errno.h>#include <string.h>#ifdef USE_LOG#include "log.h"#else#define LOG_DBG(x)#define log_error(x)perror(x)#endif#include "event.h"#ifndef howmany#define howmany(x, y) (((x)+((y)-1))/(y))#endif/* Prototypes */void event_add_post(EVENT_BASE* base,struct event *);voidevent_init(EVENT_BASE* base){TAILQ_INIT(&base->timequeue);TAILQ_INIT(&base->writequeue);TAILQ_INIT(&base->readqueue);TAILQ_INIT(&base->addqueue);base->event_inloop = 0;base->event_readset = &(base->m_event_readset);base->event_writeset = &(base->m_event_writeset);}/* * Called with the highest fd that we know about. If it is 0, completely * recalculate everything. */intevent_dispatch(EVENT_BASE* base){struct timeval tv;struct event *ev, *old;int res;FD_ZERO(base->event_readset);FD_ZERO(base->event_writeset);while (1) {TAILQ_FOREACH(ev, &base->writequeue, ev_write_next){FD_SET(ev->ev_fd, base->event_writeset);printf("w fd=%d\n",ev->ev_fd);}TAILQ_FOREACH(ev, &base->readqueue, ev_read_next){FD_SET(ev->ev_fd, base->event_readset);printf("r fd=%d\n",ev->ev_fd);}timeout_next(base,&tv);if ((res = select(0, base->event_readset, base->event_writeset, NULL, &tv)) == -1) { int iErr = WSAGetLastError(); printf("Faild to select sockt in server!(Error: %d)\r\n", iErr); if (errno != EINTR) {log_error("select");return (-1);} //WSACleanup(); Sleep(100); continue;}LOG_DBG((LOG_MISC, 80, __FUNCTION__": select reports %d", res));base->event_inloop = 1;for (ev = TAILQ_FIRST(&base->readqueue); ev;) {old = TAILQ_NEXT(ev, ev_read_next);if (FD_ISSET(ev->ev_fd, base->event_readset)) {event_del(base,ev);(*ev->ev_callback)(ev->ev_fd, EV_READ, ev->ev_arg);}ev = old;}for (ev = TAILQ_FIRST(&base->writequeue); ev;) {old = TAILQ_NEXT(ev, ev_read_next);//???if (FD_ISSET(ev->ev_fd, base->event_writeset)) {event_del(base,ev);(*ev->ev_callback)(ev->ev_fd, EV_WRITE, ev->ev_arg);}ev = old;}base->event_inloop = 0;for (ev = TAILQ_FIRST(&base->addqueue); ev; ev = TAILQ_FIRST(&base->addqueue)) {TAILQ_REMOVE(&base->addqueue, ev, ev_add_next);ev->ev_flags &= ~EVLIST_ADD;event_add_post( base,ev);}timeout_process(base);}return (0);}voidevent_set(struct event *ev, int fd, short events, void (*callback)(int, short, void *), void *arg){ev->ev_callback = callback;ev->ev_arg = arg;ev->ev_fd = fd;ev->ev_events = events;ev->ev_flags = EVLIST_INIT;}/* * Checks if a specific event is pending or scheduled. */intevent_pending(struct event *ev, short event, struct timeval *tv){int flags = ev->ev_flags;/* * We might not have been able to add it to the actual queue yet, * check if we will enqueue later. */if (ev->ev_flags & EVLIST_ADD)flags |= (ev->ev_events & (EV_READ|EV_WRITE));event &= (EV_TIMEOUT|EV_READ|EV_WRITE);/* See if there is a timeout that we should report */if (tv != NULL && (flags & event & EV_TIMEOUT))*tv = ev->ev_timeout;return (flags & event);}voidevent_add(EVENT_BASE* base,struct event *ev, struct timeval *tv){LOG_DBG((LOG_MISC, 55, "event_add: event: %p, %s%s%scall %p", ev, ev->ev_events & EV_READ ? "EV_READ " : " ", ev->ev_events & EV_WRITE ? "EV_WRITE " : " ", tv ? "EV_TIMEOUT " : " ", ev->ev_callback));if (tv != NULL) {struct timeval now;struct event *tmp;gettimeofday(&now, NULL);//timeradd(&now, tv, &ev->ev_timeout);ev->ev_timeout.tv_usec = (now.tv_usec + tv->tv_usec)%(1000*1000);ev->ev_timeout.tv_sec = now.tv_sec + tv->tv_sec+(now.tv_usec + tv->tv_usec)/(1000*1000);LOG_DBG((LOG_MISC, 55, "event_add: timeout in %d seconds, call %p", tv->tv_sec, ev->ev_callback));if (ev->ev_flags & EVLIST_TIMEOUT)TAILQ_REMOVE(&base->timequeue, ev, ev_timeout_next);/* Insert in right temporal order */for (tmp = TAILQ_FIRST(&base->timequeue); tmp; tmp = TAILQ_NEXT(tmp, ev_timeout_next)) { if (timercmp(&ev->ev_timeout, &tmp->ev_timeout, <=)) break;}if (tmp)TAILQ_INSERT_BEFORE(tmp, ev, ev_timeout_next);elseTAILQ_INSERT_TAIL(&base->timequeue, ev, ev_timeout_next);ev->ev_flags |= EVLIST_TIMEOUT;}if (base->event_inloop) {/* We are in the event loop right now, we have to * postpone the change until later. */if (ev->ev_flags & EVLIST_ADD)return;TAILQ_INSERT_TAIL(&base->addqueue, ev, ev_add_next);ev->ev_flags |= EVLIST_ADD;} elseevent_add_post(base,ev);}voidevent_add_post(EVENT_BASE* base,struct event *ev){ printf("add post fd %d\n",ev->ev_fd);ev->myBase = base;if ((ev->ev_events & EV_READ) && !(ev->ev_flags & EVLIST_READ)) {TAILQ_INSERT_TAIL(&base->readqueue, ev, ev_read_next);ev->ev_flags |= EVLIST_READ;}if ((ev->ev_events & EV_WRITE) && !(ev->ev_flags & EVLIST_WRITE)) {TAILQ_INSERT_TAIL(&base->writequeue, ev, ev_write_next);ev->ev_flags |= EVLIST_WRITE;}}voidevent_del(EVENT_BASE* base,struct event *ev){printf("del post fd %d\n",ev->ev_fd)LOG_DBG((LOG_MISC, 80, "event_del: %p, callback %p", ev, ev->ev_callback));if (ev->ev_flags & EVLIST_ADD) {TAILQ_REMOVE(&base->addqueue, ev, ev_add_next);ev->ev_flags &= ~EVLIST_ADD;}if (ev->ev_flags & EVLIST_TIMEOUT) {TAILQ_REMOVE(&base->timequeue, ev, ev_timeout_next);ev->ev_flags &= ~EVLIST_TIMEOUT;}if (ev->ev_flags & EVLIST_READ) {TAILQ_REMOVE(&base->readqueue, ev, ev_read_next);ev->ev_flags &= ~EVLIST_READ;}if (ev->ev_flags & EVLIST_WRITE) {TAILQ_REMOVE(&base->writequeue, ev, ev_write_next);ev->ev_flags &= ~EVLIST_WRITE;}}inttimeout_next(EVENT_BASE* base,struct timeval *tv){struct timeval now;struct event *ev;if ((ev = TAILQ_FIRST(&base->timequeue)) == NULL) {timerclear(tv);tv->tv_sec = TIMEOUT_DEFAULT;return (0);}if (gettimeofday(&now, NULL) == -1)return (-1);if (timercmp(&ev->ev_timeout, &now, <=)) {timerclear(tv);return (0);}timersub(&ev->ev_timeout, &now, tv);LOG_DBG((LOG_MISC, 60, "timeout_next: in %d seconds", tv->tv_sec));return (0);}voidtimeout_process(EVENT_BASE* base){struct timeval now;struct event *ev;gettimeofday(&now, NULL);while ((ev = TAILQ_FIRST(&base->timequeue)) != NULL) {if (timercmp(&ev->ev_timeout, &now, >))break;TAILQ_REMOVE(&base->timequeue, ev, ev_timeout_next);ev->ev_flags &= ~EVLIST_TIMEOUT;LOG_DBG((LOG_MISC, 60, "timeout_process: call %p", ev->ev_callback));(*ev->ev_callback)(ev->ev_fd, EV_TIMEOUT, ev->ev_arg);}}int timersub(struct timeval *y, struct timeval *x,struct timeval* result ){ int nsec; if ( x->tv_sec > y->tv_sec ) return -1; if ((x->tv_sec==y->tv_sec) && (x->tv_usec>y->tv_usec)) return -1; result->tv_sec = ( y->tv_sec-x->tv_sec ); result->tv_usec = ( y->tv_usec-x->tv_usec ); if (result->tv_usec<0) { result->tv_sec--; result->tv_usec+=1000000; } return 0;}int gettimeofday(struct timeval *tp, void *tzp){time_t clock;struct tm tm;SYSTEMTIME wtm;GetLocalTime(&wtm);tm.tm_year = wtm.wYear - 1900;tm.tm_mon = wtm.wMonth - 1;tm.tm_mday = wtm.wDay;tm.tm_hour = wtm.wHour;tm.tm_min = wtm.wMinute;tm.tm_sec = wtm.wSecond;tm. tm_isdst = -1;clock = mktime(&tm);tp->tv_sec = clock;tp->tv_usec = wtm.wMilliseconds * 1000;return (0);}#define STR_SERVER_IP "127.0.0.1" #define INT_SERVER_PORT 80 #define INT_DATABUFFER_SIZE 2560 void sock_read(int fd, short event, void *arg){ char buf[25500]; int len; struct event *ev = (struct event *)arg;printf("recv fd=%d \n ",fd); len = recv(fd, buf, sizeof(buf)-1, 0); if (len == -1) { perror("recv error\n"); if (errno != EAGAIN && errno != EINTR) { printf("---close fd=%d\n",fd);if(fd!=INVALID_SOCKET){closesocket(fd);fd = INVALID_SOCKET;} free(ev); } return; } else if (len == 0) { printf("----close fd=%d\n",fd); if(fd!=INVALID_SOCKET){closesocket(fd);fd = INVALID_SOCKET;} fprintf(stderr, "Connection closed\n"); free(ev); return; } buf[len] = '\0'; fprintf(stdout, "Read: %s\n", buf);send(fd, buf, strlen(buf), 0);printf("-----close fd=%d\n",fd);if(fd!=INVALID_SOCKET){closesocket(fd);fd = INVALID_SOCKET;} free(ev); /* Reschedule this event */ //event_add((EVENT_BASE*)ev->myBase,ev, NULL);}void sock_accept(int fd, short event, void *arg){ struct event *ev = (struct event *)arg; sockaddr_in addr; int len = sizeof(addr); //由于此结构要长期使用,所以rev必须动态分配,否则离开此函数后会自动释放,导致segment fault struct event* rev = (struct event*)malloc(sizeof(*rev)); int s = accept(fd,(sockaddr *) &addr, &len); if (s == -1) { perror("accept error\n"); return; } fprintf(stdout, "accept socket: %d\n", s);if (INVALID_SOCKET != s) { printf("%s:%d has connected server!\r\n", inet_ntoa(addr.sin_addr), ntohs(addr.sin_port)); } /* Initalize one event */ event_set(rev, s, EV_READ, sock_read, rev); /* Add it to the active events, without a timeout */ event_add((EVENT_BASE*)ev->myBase,rev, NULL); /* Reschedule this event */ event_add((EVENT_BASE*)ev->myBase,ev, NULL);}int main(int argc, char* argv[]){EVENT_BASE base;WORD dwVersion = MAKEWORD(2,2); WSAData wsaData; WSAStartup(WINSOCK_VERSION,&wsaData); SOCKET sockServer = socket(AF_INET, SOCK_STREAM, 0); if (INVALID_SOCKET == sockServer) { printf("Failed to create socket!\r\n"); WSACleanup(); return -1; } sockaddr_in addrServer; memset(&addrServer,0,sizeof(sockaddr_in)); addrServer.sin_family = AF_INET; addrServer.sin_port = htons(INT_SERVER_PORT); addrServer.sin_addr.S_un.S_addr = htonl(INADDR_ANY); //addrServer.sin_addr.s_addr = htonl(INADDR_ANY); int iResult; bool bReuseAddr = true; iResult=setsockopt(sockServer,SOL_SOCKET,SO_REUSEADDR,(char *)&bReuseAddr,sizeof(bReuseAddr)); if(SOCKET_ERROR == iResult) { printf("Failed to set resueaddr socket!\r\n"); WSACleanup(); return -1; } //unsigned long cmd = 1; // iResult= ioctlsocket(sockServer,FIONBIO,&cmd); iResult = bind(sockServer,(sockaddr *)&addrServer,sizeof(addrServer)); if (SOCKET_ERROR == iResult) { printf("Failed to bind address!\r\n"); WSACleanup(); return -1; } if (0 != listen(sockServer,5)) { printf("Failed to listen client!\r\n"); WSACleanup(); return -1; }struct event ev;/* Initalize the event library */ event_init(&base); /* Initalize one event */ event_set(&ev, sockServer, EV_READ, sock_accept, &ev); /* Add it to the active events, without a timeout */ event_add(&base,&ev, NULL); event_dispatch(&base);printf("Hello World!\n");return 0;}select convert(varchar(22),ticketid) as strTicketID, vpath from ZX025022129.monitor.dbo.pshttp20160106 where url = 'http://baidu.com/' and ((ticketid &0x00000000ffffffff)+ vtime*4294967296) >= 2983700887072440620 order by ((ticketid &0x00000000ffffffff)+ vtime*4294967296)
0 0
- lib1
- javaweb学习总结(八)——HttpServletResponse对象(二)
- PAT1008
- 最短路径算法之Dijkstra算法(邻接矩阵实现)
- [python爬虫] 爬取图片无法打开或已损坏的简单探讨
- 第六章 用堆栈视图(Stack Views)来设计UI
- lib1
- image recognition(图像识别的API参考网址)以及caffe参考网址
- 【Html】子选择器
- Linux下Python3.4.3安装
- 栈和队列之用java实现栈
- ubuntu编译制作并升级
- Servlet 学习总结(下)
- python scrapy window linux 坑
- 【Html】包含(后代)选择器