usage: url_tools.exe [URL] [count] [interval(seconds)]
来源:互联网 发布:阿里云 进销存 编辑:程序博客网 时间:2024/05/02 04:48
#include <stdio.h>#include <winsock2.h>#ifndef WINSOCK_VERSION#define WINSOCK_VERSION MAKEWORD(2, 2)#endif#ifndef STACK_SIZE_PARAM_IS_A_RESERVATION#define STACK_SIZE_PARAM_IS_A_RESERVATION 0x00010000#endifstatic CRITICAL_SECTION csWriteLog;static CRITICAL_SECTION csNetApp;static int net_app(const char* szHostName, int iPort, const char* szData, char* szHTTPStatusCode){ SOCKET skt = INVALID_SOCKET; skt = socket(AF_INET, SOCK_STREAM, IPPROTO_IP); if ( skt != INVALID_SOCKET ) { //------------------ u_long iMode = 0; // Disabled if ( 0 != ioctlsocket(skt, FIONBIO, &iMode) ) { printf("error:[ioctlsocket FIONBIO][%d]\n", WSAGetLastError()); } DWORD dwOptVal = 3000; // milliseconds if ( 0 != setsockopt(skt, SOL_SOCKET, SO_RCVTIMEO, (const char*)&dwOptVal, sizeof(DWORD)) ) { printf("error:[setsockopt SO_RCVTIMEO][%d]\n", WSAGetLastError()); } if ( 0 != setsockopt(skt, SOL_SOCKET, SO_SNDTIMEO, (const char*)&dwOptVal, sizeof(DWORD)) ) { printf("error:[setsockopt SO_SNDTIMEO][%d]\n", WSAGetLastError()); } //------------------ EnterCriticalSection(&csNetApp); struct hostent* psHostentTarget = gethostbyname(szHostName); struct in_addr sInAddrTarget; memset(&sInAddrTarget, 0, sizeof(struct in_addr)); if ( psHostentTarget != NULL ) { sInAddrTarget = *((struct in_addr*)(psHostentTarget->h_addr)); //printf("info:[%s]\n", inet_ntoa(sInAddrTarget));//fordebug } else { printf("error:[gethostbyname][%d]\n", WSAGetLastError()); } LeaveCriticalSection(&csNetApp); struct sockaddr_in sTargetAddr; memset(&sTargetAddr, 0, sizeof(struct sockaddr_in)); sTargetAddr.sin_family = AF_INET; sTargetAddr.sin_addr.s_addr = inet_addr(inet_ntoa(sInAddrTarget)); sTargetAddr.sin_port = htons(iPort); if ( 0 == connect(skt, (const struct sockaddr*)&sTargetAddr, sizeof(struct sockaddr_in)) ) { const char* bufDataSend = szData; int iBytesTotal = strlen(bufDataSend); int iBytesSent = 0; while ( iBytesTotal > 0 ) { iBytesSent = send(skt, bufDataSend, iBytesTotal, 0); if ( SOCKET_ERROR == iBytesSent ) { printf("error:[send][%d]\n", WSAGetLastError()); } else { bufDataSend += iBytesSent; iBytesTotal -= iBytesSent; } } char bufDataRecv[32]; int iBytesRecvd = 0; memset(bufDataRecv, 0, sizeof(bufDataRecv)); iBytesRecvd = recv(skt, bufDataRecv, sizeof(bufDataRecv)-1, 0); /* while ( iBytesRecvd > 0 ) // recv all { printf("recv:[%d] [%s]\n", iBytesRecvd,bufDataRecv);//fordebug memset(bufDataRecv, 0, sizeof(bufDataRecv)); iBytesRecvd = recv(skt, bufDataRecv, sizeof(bufDataRecv)-1, 0); } */ if ( iBytesRecvd > 0 ) { if ( sizeof(bufDataRecv)-1 == iBytesRecvd ) { char* pcCRLF = strstr(bufDataRecv, "\r\n"); if ( pcCRLF != NULL ) { memcpy(szHTTPStatusCode, bufDataRecv, pcCRLF-bufDataRecv); szHTTPStatusCode[pcCRLF-bufDataRecv] = '\0'; } } } if ( 0 == iBytesRecvd ) { printf("info:[recv][the connection has been gracefully closed]\n"); } else if ( SOCKET_ERROR == iBytesRecvd ) { if ( WSAETIMEDOUT == WSAGetLastError() ) { printf("info:[recv][WSAETIMEDOUT]\n"); } else { printf("error:[recv][%d]\n", WSAGetLastError()); } } if ( 0 != shutdown(skt, SD_BOTH) ) { printf("error:[shutdown SD_BOTH][%d]\n", WSAGetLastError()); } } else { printf("error:[connect][%d]\n", WSAGetLastError()); //10060 WSAETIMEDOUT } //------------------ if ( 0 != closesocket(skt) ) { printf("error:[closesocket][%d]\n", WSAGetLastError()); } return 0; } return -1;}static int SendHttpRequest(const char* szHostName, const char* szRequestFile, int iPort, char* szHTTPStatusCode){ const char* szRequestMethod = "GET"; //const char* szRequestMethod = "HEAD"; char szHTTPRequestHeader[256]; if ( 80 == iPort ) { sprintf(szHTTPRequestHeader, "%s %s HTTP/1.1\r\nHost:%s\r\n\r\n", szRequestMethod,szRequestFile,szHostName); } else { sprintf(szHTTPRequestHeader, "%s %s HTTP/1.1\r\nHost:%s:%d\r\n\r\n", szRequestMethod,szRequestFile,szHostName,iPort); } //printf("info:[%s]\n", szHTTPRequestHeader);//fordebug return net_app(szHostName, iPort, szHTTPRequestHeader, szHTTPStatusCode);}//todostatic int ParseURL(const char* szURL, char* szHostName, char* szRequestFile, int& iPort){ char* pcPos1 = strstr(szURL, "://"); if ( pcPos1 != NULL ) { char* pcPos2 = strstr(pcPos1+3, "/"); if ( pcPos2 != NULL ) { if ( (pcPos2 - szURL +1) == (int)strlen(szURL) ) { //example: http://news.sohu.com/ memcpy(szHostName, pcPos1+3, pcPos2-pcPos1+1-4); szHostName[pcPos2-pcPos1+1-4] = '\0'; strcpy(szRequestFile, "/"); iPort = 80; return 0; } else { //example: http://news.sohu.com/20150106/n407559320.shtml memcpy(szHostName, pcPos1+3, pcPos2-pcPos1+1-4); szHostName[pcPos2-pcPos1+1-4] = '\0'; memcpy(szRequestFile, pcPos2, strlen(szURL)-(pcPos2-szURL)); szRequestFile[strlen(szURL)-(pcPos2-szURL)] = '\0'; iPort = 80; return 0; } } } return -1;}static void WriteLog(const char* szURL, const char* szLog, const char* szHTTPStatusCode){ EnterCriticalSection(&csWriteLog); char szCode[8]; memset(szCode, 0, sizeof(szCode)); char* pcPos1 = strstr(szHTTPStatusCode, " "); if ( pcPos1 != NULL ) { char* pcPos2 = strstr(pcPos1+1, " "); if ( pcPos2 != NULL ) { memcpy(szCode, pcPos1+1, pcPos2-pcPos1+1-2); szCode[pcPos2-pcPos1+1-2] = '\0'; } } SYSTEMTIME sTime; GetLocalTime(&sTime); char szData[256]; sprintf(szData, "%02d%02d%02d-%s-%s\r\n", sTime.wHour,sTime.wMinute,sTime.wSecond,szURL,szCode); //printf("info:[%s]\n", szData);//fordebug char szFileName[32]; sprintf(szFileName, "%04d%02d%02d.txt", sTime.wYear,sTime.wMonth,sTime.wDay); FILE* fp = fopen(szFileName, "awb"); if (fp) { if ( strlen(szData) != fwrite(szData, 1, strlen(szData), fp) ) { printf("error:[fwrite]\n"); } fclose(fp); } LeaveCriticalSection(&csWriteLog);}struct ThreadParam{ const char* szURL; const char* szLog;};static DWORD WINAPI threadFunc(LPVOID lpThreadParameter){ struct ThreadParam* psThreadParam = (struct ThreadParam*)lpThreadParameter; const char* szURL = psThreadParam->szURL; const char* szLog = psThreadParam->szLog; char szHostName[64]; char szRequestFile[128]; int iPort; if ( 0 == ParseURL(szURL, szHostName, szRequestFile, iPort) ) { int ret = 0; char szHTTPStatusCode[128]; memset(szHTTPStatusCode, 0, sizeof(szHTTPStatusCode)); ret = SendHttpRequest(szHostName, szRequestFile, iPort, szHTTPStatusCode); WriteLog(szURL, szLog, szHTTPStatusCode); return ret; } else { printf("error:[ParseURL]\n"); } return -1;}static int socket_app(const char* szURL, int iThreadNum, const char* szLog){ WSADATA wsadata; memset(&wsadata, 0, sizeof(WSADATA)); if ( 0 == WSAStartup(WINSOCK_VERSION, &wsadata) ) { InitializeCriticalSection(&csWriteLog); InitializeCriticalSection(&csNetApp); HANDLE* rghThread = new HANDLE[iThreadNum]; int iThreadIndex = 0; struct ThreadParam sThreadParam; sThreadParam.szURL = szURL; sThreadParam.szLog = szLog; for ( int i = 0; i < iThreadNum; ++i ) { HANDLE hThreadTemp = CreateThread(NULL, 16*1024, threadFunc, (PVOID)&sThreadParam, STACK_SIZE_PARAM_IS_A_RESERVATION, NULL); if ( hThreadTemp != NULL ) { rghThread[iThreadIndex] = hThreadTemp; iThreadIndex++; } else { printf("error:[CreateThread][%d]\n", (int)GetLastError()); //8 ERROR_NOT_ENOUGH_MEMORY } } /*if ( WAIT_FAILED == WaitForMultipleObjects(iThreadIndex, rghThread, TRUE, INFINITE) ) { printf("error:[WaitForMultipleObjects][%d]\n", (int)GetLastError()); //87 ERROR_INVALID_PARAMETER MAXIMUM_WAIT_OBJECTS=64 }*/ for ( int i = 0; i < iThreadIndex; ++i ) //for ( int i = iThreadIndex-1; i >= 0; --i ) { if ( WAIT_FAILED == WaitForSingleObject(rghThread[i], INFINITE) ) { printf("error:[WaitForSingleObject][%d]\n", (int)GetLastError()); } if ( TRUE != CloseHandle(rghThread[i]) ) { printf("error:[CloseHandle][%d]\n", (int)GetLastError()); } } delete[] rghThread; DeleteCriticalSection(&csWriteLog); DeleteCriticalSection(&csNetApp); if ( 0 != WSACleanup() ) { printf("error:[WSACleanup][%d]\n", WSAGetLastError()); } return 0; } else { printf("error:[WSAStartup][%d]\n", WSAGetLastError()); } return -1;}static void usage(){ printf("------------------------------------------------------\r\n"); printf("-------------- v0.3 2015-01-06 15:35:39 --------------\r\n"); printf("usage: url_tools.exe [URL] [count] [interval(seconds)]\r\n"); printf("------------------------------------------------------\r\n");}int main(int argc, char* argv[]){ if ( argc != 4 ) { usage(); return -1; } else { while (true) { socket_app(argv[1], atoi(argv[2]), ""); printf("."); Sleep(atoi(argv[3])*1000); } return 0; }}
0 0
- usage: url_tools.exe [URL] [count] [interval(seconds)]
- pdocread.exe usage
- svcutil.exe usage
- $SECONDS
- interval
- INTERVAL
- interval
- usage
- w3wp.exe memory usage with simple hello world
- readlink("/proc/self/exe", buf, count - 1);
- Binary search (4) -- Find Right Interval,Count Complete Tree Nodes,Divide Two Integers
- Count
- COUNT
- count
- Count
- count
- count
- count
- Java基础--IO流(一)
- 知乎上一篇关于像素,点,打印尺寸和图像尺寸的妙文
- 项目中listView常用属性设置
- 关于AFNetworking
- 让Tiled成为一个强有力的45度菱形Staggered打点器(地图编辑器)
- usage: url_tools.exe [URL] [count] [interval(seconds)]
- sdjzu百题训练--人见人爱A-B
- WAV格式详解
- 模式识别-经典聚类方法
- [BZOJ 1176]Balkan2007 Mokia cdq分治一血!
- 注昨最淄纂转鬃鬃足纂赘准尊注装灼坠尊
- 专遵姿子祝昨装自做渍拽茁拙谆踪罪子邹
- sqoop安装与使用
- iframe里面的页面调用父窗口,左右窗口js函数的方法