10.30

// snmp_test.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <stdlib.h>
//#include <windows.h>
#include <winsock2.h>
#pragma comment(lib, "Ws2_32.lib")

#define  MAXLENT 1000

TCHAR* g_strfilePath;
TCHAR* g_strfilePath1;  
TCHAR* g_strIpAddress;
int    g_nIndex1   = 0;
int    g_nIndex2   = 0;
int    g_nIndex3   = 0;
int    g_nTimes    = 0;  
int    g_nInterval = 0;

void usage()  
{  
    printf("usage: [-f:str] [-F:str][-i:IP address] [-n: ] [-N:] {-l:number} {-t:number}\n\n");
    printf("     -f   The first(informquest) file you want to send\n");
    printf("     -F   The second(informquest) file you want to send\n");
    printf("     -n   The index of boot time in  report buff\n");
    printf("     -N   The index of bott time int get request buf\n");
    printf("     -m   The index of bott time int get request buf\n");
    printf("     -i   Witch ip you want to send to\n");
    printf("     -l   The time between two transmission\n");
    printf("     -t   how much times you want to transmit file\n");
    ExitProcess(1);
}  

void ValidateArgs(int argc,TCHAR ** argv)
{
    int i;

    if (argc < 13) {
        usage();
    }
    for (i=1;i<argc;i++)
    {
        if((argv[i][0]=='-') && (argv[i][2]== NULL))
        {
            switch(tolower(argv[i++][1]))
            {
            case 'f':
                if (argv[i]) {
                    g_strfilePath = argv[i];
                } else {
                    usage();
                }
                break;
            case 'F':
                if (argv[i]) {
                    g_strfilePath1 = argv[i];
                } else {
                    usage();
                }
                break;
            case 'i':
                if (argv[i]) {
                    g_strIpAddress = argv[i];
                } else {
                    usage();
                }
                break;
            case 'l':
                if (argv[i]) {
                    g_nInterval  = _ttoi(argv[i]);
                } else {
                    usage();
                }
                break;
            case 'n':
                if (argv[i]) {
                    g_nIndex1  = _ttoi(argv[i]);
                } else {
                    usage();
                }
                break;
            case 'N':
                if (argv[i]) {
                    g_nIndex2  = _ttoi(argv[i]);
                } else {
                    usage();
                }
                break;
            case 'm':
                if (argv[i]) {
                    g_nIndex3 = _ttoi(argv[i]);
                } else {
                    usage();
                }
                break;
            case 't':
                if (argv[i]) {
                    g_nTimes = _ttoi(argv[i]);
                } else {
                    usage();
                }
                break;
            default:
                usage();
                break;
            }
        } else {
            usage();
            break;
        }
    }
}

int _tmain(int argc, _TCHAR* argv[])  
{  


    SOCKET sock = 0;  
    WORD wVersionRequested = 0;  
    WSADATA wsaData;  
    int nErr = 0;  
    sockaddr_in addrto = { 0 }, addrfr = { 0 };
    //sockaddr_in addrfrom = { 0 };
    int addrlen = 0;
    HANDLE hFile, hFile1= NULL;  
    LPOFSTRUCT lpOpstruct = NULL;  	
    DWORD dwMaxLen;  
    DWORD dwLen ,dwLen1;    
    char *buf = new char[1000];
    char *buf1 = new char[1000];
    char *tmpbuf = new char[1000];
    char *ipbuf;
    struct sockaddr_in addrfrom = { 0 };
    BOOL bRep = TRUE;
    char a = 0, b = 0;

    ValidateArgs(argc, argv);
    if (0 == g_nInterval ) {
        g_nInterval = 1000;
    }
    if (0 == g_nTimes) {
        g_nTimes = 1;
    }
    
    dwMaxLen = MAXLENT;

    hFile = CreateFile(g_strfilePath, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL,0);
    hFile1 = CreateFile(g_strfilePath1, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL,0);

    if(!hFile || !hFile1) {  
        wprintf(L"file not exist!");  
    }  

    if((!ReadFile(hFile, (LPVOID)buf,dwMaxLen, &dwLen, NULL)) || dwLen == 0 || (!ReadFile(hFile, (LPVOID)buf1,dwMaxLen, &dwLen1, NULL) || dwLen == 0) || dwLen1 == 0) {  
        wprintf(L" file read failed!");  
    }

    wVersionRequested = MAKEWORD(2,2);  
    nErr = WSAStartup(wVersionRequested, & wsaData);  
    if (0 != nErr) {  
        wprintf(L"Socket 2.2 init failed!");  
        return nErr;  
    }

    if (LOBYTE( wsaData.wVersion ) != 2 || HIBYTE( wsaData.wVersion ) != 2 )  
    {  
        WSACleanup();
        CloseHandle(hFile);
        return 0;  
    }  

    sock = socket(  
        AF_INET,           //UDP,TCP, etc   
        SOCK_DGRAM,        //UDP type   
        IPPROTO_UDP        //protocol   
        );  

    if (INVALID_SOCKET == sock ) {  
        wprintf(L"Socket create failed!");
        WSACleanup();
        return 0;  
    }             
//prepare for the data
    int cCharacters = int(wcslen((const wchar_t*)g_strIpAddress)+1);
    int cbAnsi = cCharacters*2;
    ipbuf = new char[cbAnsi];

    memset(&addrto,0,sizeof(addrto));  
    WideCharToMultiByte(CP_ACP,0, (LPCWSTR)g_strIpAddress,cCharacters,ipbuf,cbAnsi, NULL, NULL);
    addrto.sin_family = AF_INET;  
    addrto.sin_port = htons(162);
    addrto.sin_addr.s_addr = inet_addr(ipbuf);
    addrlen = sizeof(struct sockaddr_in);
   

//send first inform request
    if (sendto(sock, buf, dwLen, 0, (sockaddr*)&addrto, sizeof(addrto)) == SOCKET_ERROR) {
        nErr = WSAGetLastError();
        wprintf(L"WSAGetLastError = %d ", nErr);
        return 0;
    }

RETRY:
//recv report or get request
    if(!recvfrom(sock, tmpbuf, MAXLENT, 0, (sockaddr*)&addrfr, &addrlen))  {
        nErr = WSAGetLastError();
        wprintf(L"WSAGetLastError = %d ", nErr);
        return 0;
    }
//prepare for data(assemble the second file and the time just received)
    if (bRep) {
        a = tmpbuf[g_nIndex1];
        b = tmpbuf[g_nIndex1+1];
    } else {
        a = tmpbuf[g_nIndex3];
        b = tmpbuf[g_nIndex3+1];
    }

    buf1[g_nIndex2] = a;
    buf1[g_nIndex2+1] = b;



//send second inform_request
    if (sendto(sock, buf1, dwLen, 0, (sockaddr*)&addrto, sizeof(addrto)) == SOCKET_ERROR) {
        nErr = WSAGetLastError();
        wprintf(L"WSAGetLastError = %d ", nErr);
        return 0;
    }

    if (g_nTimes--)
    {
        Sleep(g_nInterval);
        goto RETRY;
    }



    closesocket(sock);
    WSACleanup();
    CloseHandle(hFile);
    return 0;  
}  

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章