信使服務是Windows 2000/XP下面的一種通信服務,通過它我們可以在網上象QQ一樣進行實時的交流,但和QQ不同的是信使服務不需要擁有一個號碼,它只要知道對方的IP地址--如果在局域網中,只要知道對方的計算機名就可以了。我們可以利用"net send"在命令行下面發送消息,也可以通過"控制面板-管理工具-計算機管理"中的"操作"菜單裡面的"所有任務-發送控制台消息…"來發送。接收方的計算機要求必須是Win2000/XP,因為 Win9x本身是不提供信服服務的,除非你手動啟動了WinPopup.。程序編譯運行後,在Windows2000下啟動控制台,輸入:netsend 192.168.0.10 127.0.0.1 "我的信使程序!"運行以上命令後,在Windows桌面上將彈出一個對話框,其上標有"我的信使程序!"字符和相關IP信息。
一、實現方法
信使服務為大家在網絡上提供了簡便、快捷的聊天方式,所以網上也有一些改進了的信使服務發送程序,使信息的發送可以按照自己的意願來進行而不受微軟提供的"net send"所限制。如果你經常上網,也許會收到通過信使服務發來的廣告或者其他莫名其妙的信息,而在"信使服務"窗口中所顯示出來的發送方的計算機名或者IP地址和你自己的竟然一樣。如果你遇到過這種情況,那麼你想不想知道這種改進了的信使服務發送程序是怎麼實現的呢?
本實例將要帶你去剖析一下Windows的信使服務,我們將從一個程序員的角度來看看這個信使服務發送程序是如何實現的。其實實現信使服務的整個過程很簡單,我們只需要調用一個API函數:
NET_API_STATUS NetMessageBufferSend(
LPWSTR servername,
LPWSTR msgname,
LPWSTR fromname,
LPBYTE buf,
DWord buflen
);
其中該函數的參數說明如下:
servername:計算機名,該函數將在指定的這個計算機上面執行。如果為NULL,則表示為本地計算機,通常我們都將其設置為NULL。
msgname:目標計算機的名字或者IP地址。
fromname:源計算機的名字或者IP地址。
buf:指向一個信息緩沖區的指針,在這裡你可以填上你想發送的信息。要注意的是,這個參數用的是Unicode編碼。
buflen:上述信息緩沖區中的字節數。
現在函數已經介紹完了,通過這個函數我們可以發現如果想實現匿名的信使服務實在是太簡單--只需要在fromname中填上一個假冒的計算機名或者IP地址就行了。下面給出一個實際例子,在這個程序中,我們從命令行參數接受目標計算機和源計算機名字(IP地址),同時我們還可以設定信息發送的次數。
二、編程步驟
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] ",argv[0]);
printf("Count: Count means number of times to send message,default is 1. ");
return 0;
}
wdest = argv[1]; //目標計算機
wfrom = argv[2]; //源計算機
buffer = argv[3]; //發送的信息
count = _wtoi(argv[4]); //發送次數,缺省為1次
if(count ==0)
count = 1;
printf("count = %d ",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. ");
return 0;
}
if(dwReturn == NERR_NetworkError)
{
printf("A general failure occurred in the network hardware. ");
return 0;
}
if(dwReturn == ERROR_NOT_SUPPORTED)
{
printf("This network request is not supported. ");
return 0;
}
if(dwReturn == ERROR_INVALID_PARAMETER)
{
printf("The specifIEd parameter is invalid. ");
return 0;
}
if(dwReturn == ERROR_Access_DENIED)
{
printf("The user does not have Access to the requested information. ");
return 0;
}
else
printf("Unknown error! ");
return 0;
}
四、小結
本實例開發一個Windows信使服務程序,以幫助讀者深入了解Windows信使服務實現的內幕。