今在 電腦編程技巧與維護上看到了那個自己編程寫區域網路發資訊的文章,,就是實現net send 的功能,,主要的部分就是用了 netApi32.dll 中的 NetMessAgeBufferSend()函數,,想到自己上學期一直想編個net send的程式,,現在終於有盼頭了 呵呵,,
採用倒敘的方式,,先把寫好的程式貼著,,然後慢慢分析
#include <stdio.h>
#include <windows.h>
#include <lm.h>
#pragma comment (lib,"netapi32.lib")
//#define UNICODE
#define MAXLEN 256
int main(int Argc,char *Argv[])
{
//WSADATA WSADAtA;
//WSAStartup(MAKEWORD(2,2),&WSADAtA);
DWORD rc;
int i=1;
wchar_t server[MAXLEN],ToNAme[MAXLEN],msg[MAXLEN];
if(Argc!=4&&Argc!=5){
printf("/nusAge:netsend ////servernAme ToUserNAme /"messAge/"/n");
return 1;
}
mbstowcs(server,Argv[1],MAXLEN);
server[MAXLEN-1]=L'/0';
mbstowcs(ToNAme,Argv[2],MAXLEN);
ToNAme[MAXLEN-1]=L'/0';
mbstowcs(msg,Argv[3],MAXLEN);
msg[MAXLEN-1]=L'/0';
if(Argc==5) i=atoi(Argv[4]);
printf("/n Here we go...../n");
while(i--){
rc = NetMessageBufferSend(server,ToNAme,NULL,msg,MAXLEN);
}
if(rc!=NERR_Success)
{
printf("NMBS() returned %lu/n",rc);
return 1;
}
printf("/n Done./n");
return 0;
}
好,,來談談最鬱悶的,,看NetMessAgeBufferSend()的msdn裡資料,說是要用標頭檔lmmsg.h 加了這個後,,就是3個錯誤,,都出在lmmsg.h裡,,調了很久,後來把所有的代碼都注釋掉了 還是那3個錯誤,,看來不是我的問題了,,後來在網上翻到一篇用那個函數的程式,,看到他用的標頭檔是lm.h。我學,,那3個錯誤沒有了,,可msdn裡介紹的用法
#define UNICODE
#define MESGLEN 50
WCHAR awcToName[] = TEXT("DomainName*");
WCHAR awcFromName[] = Text("MyComputer");
WCHAR awcMesgBuffer[MESGLEN] = Text("This ia Test Message");
NET_API_STATUS nasStatus;
nasStatus = NetMessageBufferSend(NULL,
awcToName,
awcFromName,
awcMesgBuffer,
MESGLEN);
卻出錯,,類型不符,, 難道不能用WCHAR嗎?
WINNT.H
#ifndef _MAC
typedef wchar_t WCHAR; // wc, 16-bit UNICODE character
#else
// some Macintosh compilers don't define wchar_t in a convenient location, or define it as a char
typedef unsigned short WCHAR; // wc, 16-bit UNICODE character
#endif
//---------------------------------------------------------
STDIO.H
#ifndef _MAC
#ifndef _WCHAR_T_DEFINED
typedef unsigned short wchar_t;
#define _WCHAR_T_DEFINED
#endif
看樣子 wchar_t 應該和 WCHAR 是一樣的
後來我試了,,兩種都沒沒問題,,那我以前?? 奇怪了
mbstowcs() 是將ASCII字元轉化成UNICODE字元的函數,,
mbstowcs(server,Argv[1],MAXLEN);
server[MAXLEN-1]=L'/0'; -->這句一直不明白為什麼要這樣,,'/0'不能用mbstowcs()轉化嗎?
net send 命令只需要給出要發送的主機名稱或ip,不需要指出要發送到的主機上的使用者名稱,,而netmessAgebuffersend則必須指出,,而且自己的使用者名稱也必須指定,,而且要是個確實存在的使用者,為NULL時,發送當前的使用者名稱..
其實這個程式完全是我照抄的了,,而且還有一部分沒懂,網上那份程式我也付在附件裡,,下一步要做的是用NetMessAeNameEnum() 列舉機器上的使用者,,然後向那台機子上的所有使用者都發,,,再下一步 我想用封包技術直接類比net send 這在豬海時我已經試過,,可惜半途卡住了