今在 电脑编程技巧与维护上看到了那个自己编程写局域网发信息的文章,,就是实现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 这在猪海时我已经试过,,可惜半途卡住了 :(