Visual C++打造Windows信使服務程序
發(fā)表時間:2024-02-19 來源:明輝站整理相關軟件相關文章人氣:
[摘要]信使服務是Windows 2000/XP下面的一種通信服務,通過它我們可以在網(wǎng)上象QQ一樣進行實時的交流,但和QQ不同的是信使服務不需要擁有一個號碼,它只要知道對方的IP地址--如果在局域網(wǎng)中,只要知道對方的計算機名就可以了。我們可以利用"net send"在命令行下面發(fā)送消息...
信使服務是Windows 2000/XP下面的一種通信服務,通過它我們可以在網(wǎng)上象QQ一樣進行實時的交流,但和QQ不同的是信使服務不需要擁有一個號碼,它只要知道對方的IP地址--如果在局域網(wǎng)中,只要知道對方的計算機名就可以了。我們可以利用"net send"在命令行下面發(fā)送消息,也可以通過"控制面板-管理工具-計算機管理"中的"操作"菜單里面的"所有任務-發(fā)送控制臺消息…"來發(fā)送。接收方的計算機要求必須是Win2000/XP,因為 Win9x本身是不提供信服服務的,除非你手動啟動了WinPopup.。程序編譯運行后,在Windows2000下啟動控制臺,輸入:netsend 192.168.0.10 127.0.0.1 "我的信使程序!"運行以上命令后,在Windows桌面上將彈出一個對話框,其上標有"我的信使程序!"字符和相關IP信息。
一、實現(xiàn)方法
信使服務為大家在網(wǎng)絡上提供了簡便、快捷的聊天方式,所以網(wǎng)上也有一些改進了的信使服務發(fā)送程序,使信息的發(fā)送可以按照自己的意愿來進行而不受微軟提供的"net send"所限制。如果你經(jīng)常上網(wǎng),也許會收到通過信使服務發(fā)來的廣告或者其他莫名其妙的信息,而在"信使服務"窗口中所顯示出來的發(fā)送方的計算機名或者IP地址和你自己的竟然一樣。如果你遇到過這種情況,那么你想不想知道這種改進了的信使服務發(fā)送程序是怎么實現(xiàn)的呢?
本實例將要帶你去剖析一下Windows的信使服務,我們將從一個程序員的角度來看看這個信使服務發(fā)送程序是如何實現(xiàn)的。其實實現(xiàn)信使服務的整個過程很簡單,我們只需要調(diào)用一個API函數(shù):
NET_API_STATUS NetMessageBufferSend(
LPWSTR servername,
LPWSTR msgname,
LPWSTR fromname,
LPBYTE buf,
DWORD buflen
);
其中該函數(shù)的參數(shù)說明如下:
servername:計算機名,該函數(shù)將在指定的這個計算機上面執(zhí)行。如果為NULL,則表示為本地計算機,通常我們都將其設置為NULL。
msgname:目標計算機的名字或者IP地址。
fromname:源計算機的名字或者IP地址。
buf:指向一個信息緩沖區(qū)的指針,在這里你可以填上你想發(fā)送的信息。要注意的是,這個參數(shù)用的是Unicode編碼。
buflen:上述信息緩沖區(qū)中的字節(jié)數(shù)。
現(xiàn)在函數(shù)已經(jīng)介紹完了,通過這個函數(shù)我們可以發(fā)現(xiàn)如果想實現(xiàn)匿名的信使服務實在是太簡單--只需要在fromname中填上一個假冒的計算機名或者IP地址就行了。下面給出一個實際例子,在這個程序中,我們從命令行參數(shù)接受目標計算機和源計算機名字(IP地址),同時我們還可以設定信息發(fā)送的次數(shù)。
二、編程步驟
1、啟動Visual C++6.0,新建項目netsend,選擇控制臺模式;
2、在項目中添加新文件netsend.c;
3、添加代碼,編譯運行程序。
三、程序代碼
/////////////////////////////////////////////////////////////////////////
#define _UNICODE
#define UNICODE
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <wchar.h>
#include <windows.h>
#include <locale.h>
#include <lm.h>
#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 <DestIP> <SourIP> <Message> [Count]\n",argv[0]);
printf("Count: Count means number of times to send message,default is 1.\n");
return 0;
}
wdest = argv[1]; //目標計算機
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信使服務程序,以幫助讀者深入了解Windows信使服務實現(xiàn)的內(nèi)幕。