2017年計算機二級C++實例編程:打造Windows信使服務(wù)程序

字號:


    打造Windows信使服務(wù)程序
    信使服務(wù)是Windows 2000/XP下面的一種通信服務(wù),通過它我們可以在網(wǎng)上象QQ一樣進行實時的交流,但和QQ不同的是信使服務(wù)不需要擁有一個號碼,它只要知道對方的IP地址--如果在局域網(wǎng)中,只要知道對方的計算機名就可以了。我們可以利用"net send"在命令行下面發(fā)送消息,也可以通過"控制面板-管理工具-計算機管理"中的"操作"菜單里面的"所有任務(wù)-發(fā)送控制臺消息…"來發(fā)送。接收方的計算機要求必須是Win2000/XP,因為 Win9x本身是不提供信服服務(wù)的,除非你手動啟動了WinPopup.。程序編譯運行后,在Windows2000下啟動控制臺,輸入:netsend 192.168.0.10 127.0.0.1 "我的信使程序!"運行以上命令后,在Windows桌面上將彈出一個對話框,其上標(biāo)有"我的信使程序!"字符和相關(guān)IP信息。
    一、實現(xiàn)方法
    信使服務(wù)為大家在網(wǎng)絡(luò)上提供了簡便、快捷的聊天方式,所以網(wǎng)上也有一些改進了的信使服務(wù)發(fā)送程序,使信息的發(fā)送可以按照自己的意愿來進行而不受微軟提供的"net send"所限制。如果你經(jīng)常上網(wǎng),也許會收到通過信使服務(wù)發(fā)來的廣告或者其他莫名其妙的信息,而在"信使服務(wù)"窗口中所顯示出來的發(fā)送方的計算機名或者IP地址和你自己的竟然一樣。如果你遇到過這種情況,那么你想不想知道這種改進了的信使服務(wù)發(fā)送程序是怎么實現(xiàn)的呢?
    本實例將要帶你去剖析一下Windows的信使服務(wù),我們將從一個程序員的角度來看看這個信使服務(wù)發(fā)送程序是如何實現(xiàn)的。其實實現(xiàn)信使服務(wù)的整個過程很簡單,我們只需要調(diào)用一個API函數(shù):
    NET_API_STATUS NetMessageBufferSend(
    LPWSTR servername,
    LPWSTR msgname,
    LPWSTR fromname,
    LPBYTE buf,
    DWORD buflen
    );
    其中該函數(shù)的參數(shù)說明如下:
    servername:計算機名,該函數(shù)將在指定的這個計算機上面執(zhí)行。如果為NULL,則表示為本地計算機,通常我們都將其設(shè)置為NULL。
    msgname:目標(biāo)計算機的名字或者IP地址。
    fromname:源計算機的名字或者IP地址。
    buf:指向一個信息緩沖區(qū)的指針,在這里你可以填上你想發(fā)送的信息。要注意的是,這個參數(shù)用的是Unicode編碼。
    buflen:上述信息緩沖區(qū)中的字節(jié)數(shù)。
    現(xiàn)在函數(shù)已經(jīng)介紹完了,通過這個函數(shù)我們可以發(fā)現(xiàn)如果想實現(xiàn)匿名的信使服務(wù)實在是太簡單--只需要在fromname中填上一個假冒的計算機名或者IP地址就行了。下面給出一個實際例子,在這個程序中,我們從命令行參數(shù)接受目標(biāo)計算機和源計算機名字(IP地址),同時我們還可以設(shè)定信息發(fā)送的次數(shù)。
    二、編程步驟
    1、啟動Visual C++6.0,新建項目netsend,選擇控制臺模式;
    2、在項目中添加新文件netsend.c;
    3、添加代碼,編譯運行程序。
    三、程序代碼
    #define _UNICODE
    #define UNICODE
    #include
    #include
    #include
    #include
    #include
    #include
    #include
    #pragma comment(lib,"netapi32.lib")
    int wmain(int argc, wchar_t *argv[])
    {
    int count;
    wchar_t *wdest, *wfrom, *buffer,*wtarget;
    DWORD dwReturn;
    if((argc <4) || (argc >5))
    {
    printf("Usge: %S [Count]\n",argv[0]);
    printf("Count: Count means number of times to send message,default is 1.\n");
    return 0;
    }
    wdest = argv[1]; //目標(biāo)計算機
    wfrom = argv[2]; //源計算機
    buffer = argv[3]; //發(fā)送的信息
    count = _wtoi(argv[4]); //發(fā)送次數(shù),缺省為1次
    if(count ==0)
    count = 1;
    printf("count = %d\n",count);
    dwReturn = NetMessageBufferSend(NULL, wdest, wfrom,
    (LPBYTE)buffer, 2*lstrlen(buffer)); //因為buffer是Unicode編碼,所以需要乘以2
    if(dwReturn == NERR_Success)
    {
    printf("Send OK!");
    while(count-->1)
    {
    NetMessageBufferSend(NULL, wtarget, wfrom, (LPBYTE)buffe,2*lstrlen(buffer));
    }
    return 0;
    }
    if(dwReturn == NERR_NameNotFound)
    {
    printf("The user name could not be found.\n");
    return 0;
    }
    if(dwReturn == NERR_NetworkError)
    {
    printf("A general failure occurred in the network hardware.\n");
    return 0;
    }
    if(dwReturn == ERROR_NOT_SUPPORTED)
    {
    printf("This network request is not supported.\n");
    return 0;
    }
    if(dwReturn == ERROR_INVALID_PARAMETER)
    {
    printf("The specified parameter is invalid.\n");
    return 0;
    }
    if(dwReturn == ERROR_ACCESS_DENIED)
    {
    printf("The user does not have access to the requested information.\n");
    return 0;
    }
    else
    printf("Unknown error!\n");
    return 0;
    }
    四、小結(jié)
    本實例開發(fā)一個Windows信使服務(wù)程序,以幫助讀者深入了解Windows信使服務(wù)實現(xiàn)的內(nèi)幕。