远程唤醒代码

网络唤醒程序代码
    发布时间:2005-01-06 11:15:20    

I 根据网络唤醒数据包编写的网络唤醒程序,只实现了基本的代码部分,还不能发送密码。
for linux 的,要有LIBNET库的支持哦。

#include <unistd.h>
#include <stdio.h>
#include <libnet.h>
main()
{

u_char *packet;
u_short packet_size=0;
u_char enet_dst[6]={0x00,0x11,0x22,0x33,0x44,0x55};
u_char enet_src[6]={0x00,0x40,0x05,0x47,0x23,0xfb};
u_char *payload;
int payload_size=0;
char *dev="eth0";
char ebuf[LIBNET_ERRBUF_SIZE];
struct libnet_link_int *s;
int i,c;

payload=(u_char *)malloc(102);

packet_size=LIBNET_ETH_H+102;

if((libnet_init_packet(packet_size,&packet))==-1)
{ }
if((s=libnet_open_link_interface(dev,ebuf))==NULL)
{ }

memset(payload,0xff,6);
payload_size+=6;

for(i=0;i<16;i++){
memcpy(payload+payload_size,enet_dst,6);
payload_size+=6;
}

libnet_build_ethernet(enet_dst,
enet_src,
0x842,
payload,
payload_size,
packet);
for(i=0;i<packet_size;i++)
printf("%2.2x ",packet[i]);



c=libnet_write_link_layer(s,dev,packet,packet_size);

printf("/nsend size is: %d",c);
libnet_destroy_packet(&packet);
}








//IPAddress: 除去网络号后的IP段全部补255  ,如 210.45.234.255
 // MacAddress :  6个字节的字符型数组,每块网卡都有一个物理地址,在Window98中可以用
 //               winipcfg.exe 查询出来。

void TWakeUpOnLanForm:: WakeRemoteComputer(AnsiString IPAddress,unsigned char * MacAddress)
{
        unsigned char SendBuf[102];
        for( int i = 0; i < 102; i ++)
        {
                SendBuf[i] = (i < 6) ? 0xFF : MacAddress[i%6];
        }
        TMemoryStream * MemoryStream = new TMemoryStream();

        MemoryStream -> Clear();
        MemoryStream -> Write(SendBuf,102);
        NMUDP1 -> RemoteHost = IPAddress;   //除去网络号后的IP段全部补255
                                            //如 210.45.234.255
        NMUDP1 -> SendStream(MemoryStream);
        delete MemoryStream;

}















unit WakeUp;
    
    interface
    uses
     Windows, Messages, SysUtils, Dialogs, WinSock;
    
    function CheckWinSockResult(ResultCode: Integer; const FuncName: string): Integer;
    procedure OpenComputer(SAddr: string);
    
    const
     LEN_PHYSADDR = 6;
    
    implementation
    
    {$R *.DFM}
    function CheckWinSockResult(ResultCode: Integer; const FuncName: string): Integer;
    begin
     if ResultCode <> 0 then
     begin
     Result := WSAGetLastError;
     ShowMessage(Format(#13#10'Windows socket函数''%s''错误: %s (%d)',[FuncName,SysErrorMessage(Result), Result]));
     Abort;
     end else Result := 0;
    end;
    
    procedure OpenComputer(SAddr: string); //00-B0-D0-15-86-B4
    var
     WSAData: TWSAData;
     MSocket: TSocket;
     SockAddrIn: TSockAddrIn;
     RetVal, OptVal, i: Integer;
     MacAddr: array[0..5] of Byte;
     MagicData: array[0..101] of Byte;
     Position: Longint;
    begin
     try
     if Length(SAddr) <> 17 then Abort;
     for i := 1 to Length(SAddr) do
     if i in [3, 6, 9, 12, 15] then
     if SAddr[i] <> '-' then Abort;
     for i := 0 to High(MacAddr) do
     begin
     if Pos('-', SAddr) > 0 then
     MacAddr[i] := StrToInt(HexDisplayPrefix + Copy(SAddr, 1, Pos('-', SAddr) - 1))
     else
     MacAddr[i] := StrToInt(HexDisplayPrefix + SAddr);
     Delete(SAddr, 1, Pos('-', SAddr));
     end;
     except
     ShowMessage(#13#10'网卡地址错误.');
     exit;
     end;
     try
     CheckWinSockResult(WSAStartup($0101, WSAData), 'WSAStartup');
     MSocket := socket(AF_INET, SOCK_DGRAM, IPPROTO_IP);
     if MSocket = INVALID_SOCKET then CheckWinSockResult(MSocket, 'socket');
     OptVal := 1;
     CheckWinSockResult(setsockopt(MSocket, SOL_SOCKET, SO_BROADCAST,
     PChar(@OptVal), SizeOf(OptVal)), 'setsockopt');
     FillChar(MagicData, SizeOf(MagicData), $FF);
     Position := LEN_PHYSADDR;
     while Position < SizeOf(MagicData) do
     begin
     Move(MacAddr, Pointer(Longint(@MagicData) + Position)^, LEN_PHYSADDR);
     Inc(Position, LEN_PHYSADDR);
     end;
     SockAddrIn.sin_family := AF_INET;
     SockAddrIn.sin_addr.S_addr := Longint(INADDR_BROADCAST);
     RetVal := sendto(MSocket, MagicData, SizeOf(MagicData), 0, SockAddrIn, SizeOf(SockAddrIn));
     if RetVal = SOCKET_ERROR then CheckWinSockResult(RetVal, 'sendto');
     CheckWinSockResult(closesocket(MSocket), 'closesocket');
     CheckWinSockResult(WSACleanup, 'WSACleanup');
     except
     exit;
     end;
    end;
    
    end.
    

基于Delphi的网络远程唤醒代码网络上的代码错误很多,这是修改好的可执行源代码,经过测试,能正常唤醒支持网络唤醒的计算机。该代码非常实用。 procedure WakeUp(SAddr: string); var WSAData: TWSAData; MSocket: TSocket; SockAddrIn: TSockAddrIn; RetVal, OptVal, i: Integer; MacAddr: array[0..5] of Byte; MagicData: array[0..101] of Byte; Position: Longint; begin try if Length(SAddr) 17 then Abort; for i := 1 to Length(SAddr) do if i in [3, 6, 9, 12, 15] then if SAddr[i] '-' then Abort; for i := 0 to High(MacAddr) do begin if Pos('-', SAddr) > 0 then MacAddr[i] := StrToInt(HexDisplayPrefix + Copy(SAddr, 1, Pos('-', SAddr) - 1)) else MacAddr[i] := StrToInt(HexDisplayPrefix + SAddr); //Delete 是删除一个 字符串中的 某部分字符 //Delete(str, index, count) // str, //被删除的字符串 // index, //从第几个字符开始删除 // count //删除几个 //Delete(S, 2, 2); 就是从S中的第二个开始删除,删除2个字符即2、3. //Pos(a,b); 取出子串a,在父串b中第一次出现的位置; //Pos'b','abcd'); 返回结果是:2 Delete(SAddr, 1, Pos('-', SAddr)); end; except //application.MessageBox('网卡地址错误','警告',MB_ICONWARING); 错误:MB_ICONWARING application.MessageBox('网卡地址错误', '警告', MB_ICONWARNING); exit; end; try CheckWinSockResult(WSAStartup($0101, WSAData), 'WSAStartup'); MSocket := socket(AF_INET, SOCK_DGRAM, IPPROTO_IP); if MSocket = INVALID_SOCKET then CheckWinSockResult(MSocket, 'socket'); OptVal := 1; CheckWinSockResult(setsockopt(MSocket, SOL_SOCKET, SO_BROADCAST, PChar(@OptVal), SizeOf(OptVal)), 'setsockopt'); FillChar(MagicData, SizeOf(MagicData), $FF); Position := LEN_PHYSADDR; while Position < SizeOf(MagicData) do begin Move(MacAddr, Pointer(Longint(@MagicData) + Position)^, LEN_PHYSADDR); Inc(Position, LEN_PHYSADDR); end; SockAddrIn.sin_family := AF_INET; SockAddrIn.sin_addr.S_addr := Longint(INADDR_BROADCAST); RetVal := sendto(MSocket, MagicData, SizeOf(MagicData), 0, SockAddrIn, SizeOf(SockAddrIn)); if RetVal = SOCKET_ERROR then CheckWinSockResult(RetVal, 'sendto'); CheckWinSockResult(closesocket(MSocket), 'closesocket'); CheckWinSockResult(WSACleanup, 'WSACleanup'); except exit; end; end;
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值