以下是我写的C++代码,原理是一样的
//getmac.cpp
//取得连接方MAC地址//需要链接netapi32.lib #include "stdafx.h"
#include "mystd.h"#include "nb30.h"//取得MAC地址
STATE getmac(char * ip,UCHAR * mac,int maclen,char * machname,int machnamelen)
{
char ncb_buffer[sizeof(ADAPTER_STATUS)+256*sizeof(NAME_BUFFER)];
UCHAR ret;
NCB ncb;
ADAPTER_STATUS * adapter_status;
NAME_BUFFER * name_buffer; if(maclen<6||machnamelen<16)
{
return -1;
} memset(&ncb,0,sizeof(NCB)); adapter_status=(ADAPTER_STATUS *)ncb_buffer;
name_buffer=(NAME_BUFFER *)(ncb_buffer+sizeof(ADAPTER_STATUS));

ncb.ncb_lana_num=0;
ncb.ncb_lsn=0;
ncb.ncb_num=0;
ncb.ncb_command=NCBRESET;
// if(NRC_GOODRET!=(ret=Netbios(&ncb)))
{
// return -2;
} memset((char *)ncb.ncb_callname,' ',15);
ncb.ncb_callname[15]='\0';
memcpy((char *)ncb.ncb_callname,ip,strlen(ip));
ncb.ncb_buffer=(unsigned char *)ncb_buffer;
ncb.ncb_length=sizeof(ADAPTER_STATUS)+256*sizeof(NAME_BUFFER);
ncb.ncb_lana_num=0; name_buffer->name[0]='\0'; ncb.ncb_command=NCBASTAT;
if(NRC_GOODRET!=(ret=Netbios(&ncb)))
{
return -3;
}

memcpy(mac,adapter_status->adapter_address,6);
memcpy(machname,name_buffer[0].name,16);
return 1;
}//显示返回值
STATE showret(int ret)
{
switch(ret)
{
case NRC_GOODRET:
MessageBox(NULL,"NRC_GOODRET","",MB_OK);
break;
case NRC_BUFLEN:
MessageBox(NULL,"NRC_BUFLEN","",MB_OK);
break;
case NRC_ILLCMD:
MessageBox(NULL,"NRC_ILLCMD","",MB_OK);
break;
case NRC_CMDTMO:
MessageBox(NULL,"NRC_CMDTMO","",MB_OK);
break;
case NRC_INCOMP:
MessageBox(NULL,"NRC_INCOMP","",MB_OK);
break;
case NRC_BADDR:
MessageBox(NULL,"NRC_BADDR","",MB_OK);
break;
case NRC_SNUMOUT:
MessageBox(NULL,"NRC_SNUMOUT","",MB_OK);
break;
default :
MessageBox(NULL,"default","",MB_OK);
} return 1;
}//生成MAC地址字符串
STATE mactostr(UCHAR * mac,char * str,int len)
{
char str2[5];
int i; if(len<19)
{
return -1;
} str[0]='\0'; for(i=0;i<=5;i++)
{
itoa(mac[i],str2,16);
if(strlen(str2)<2)
{
strcat(str,"0");
}
strcat(str,str2);
strcat(str," ");
} return 1;
}//从字符串生成MAC地址
STATE strtomac(char * macstr,UCHAR * mac)
{
char str[32];
char c;
int i,j,k; j=strlen(macstr);
for(i=0,k=0;i<j;i++)
{
c=macstr[i];
if(c>='0' && c<='9')
{
str[k]=(char)(c-'0');
k++;
}
else if(c>='a' && c<='f')
{
str[k]=(char)(c-'a'+10);
k++;
}
else if(c>='A' && c<='F')
{
str[k]=(char)(c-'A'+10);
k++;
}
else if(' '==c || ','==c)
{
if(0!=k%2)
{
return -1;
}
}
else
{
return -1;
} if(12+1<k)
{
return -2;
}
}
if(12!=k)
{
return -2;
} for(i=0;i<6;i++)
{
mac[i]=(char)(str[2*i]*16+str[2*i+1]);
} return 1;
}

解决方案 »

  1.   

    以下是用Delphi实现的,在delphi5通过测试
    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      StdCtrls,nb30;type
      TForm1 = class(TForm)
        Edit1: TEdit;
        Button1: TButton;
        Label1: TLabel;
        Memo1: TMemo;
        procedure Button1Click(Sender: TObject);
        Function NBGetAdapterAddress(a:integer):String;
        procedure FormCreate(Sender: TObject);
      private
        { Private declarations }  public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.DFM}procedure TForm1.Button1Click(Sender: TObject);
    begin
    memo1.lines.add('您的第'+edit1.text+'个适配器的MAC地址为'+NBGetAdapterAddress(StrtoInt(Edit1.Text)));
    end;
    function TForm1.NBGetAdapterAddress(a: integer): String;
    //a指定多个网卡适配器中的哪一个0,1,2...
    Var
      NCB:TNCB; // Netbios control block file://NetBios控制块
      ADAPTER : TADAPTERSTATUS; // Netbios adapter status//取网卡状态
      LANAENUM : TLANAENUM; // Netbios lana
      intIdx : Integer; // Temporary work value//临时变量
      cRC : Char; // Netbios return code//NetBios返回值
      strTemp : String; // Temporary string//临时变量Begin
      // Initialize
      Result := '';  Try
        // Zero control blocl
        ZeroMemory(@NCB, SizeOf(NCB));    // Issue enum command
        NCB.ncb_command:=Chr(NCBENUM);
        cRC := NetBios(@NCB);    // Reissue enum command
        NCB.ncb_buffer := @LANAENUM;
        NCB.ncb_length := SizeOf(LANAENUM);
        cRC := NetBios(@NCB);
        If Ord(cRC)<>0 Then
          exit;    // Reset adapter
        ZeroMemory(@NCB, SizeOf(NCB));
        NCB.ncb_command := Chr(NCBRESET);
        NCB.ncb_lana_num := LANAENUM.lana[a];
        cRC := NetBios(@NCB);
        If Ord(cRC)<>0 Then
          exit;    // Get adapter address
        ZeroMemory(@NCB, SizeOf(NCB));
        NCB.ncb_command := Chr(NCBASTAT);
        NCB.ncb_lana_num := LANAENUM.lana[a];
        StrPCopy(NCB.ncb_callname, '*');
        NCB.ncb_buffer := @ADAPTER;
        NCB.ncb_length := SizeOf(ADAPTER);
        cRC := NetBios(@NCB);    // Convert it to string
        strTemp := '';
        For intIdx := 0 To 5 Do
          strTemp := strTemp + InttoHex(Integer(ADAPTER.adapter_address[intIdx]),2);
        Result := strTemp;
      Finally
      End;end;procedure TForm1.FormCreate(Sender: TObject);
    begin
    memo1.lines.Clear;
    end;end.
      

  2.   

    谢谢zb_china(zb),只是我需要的是Delphi代码。
    谢谢computerallen(),我测试成功后会再加分的。
     
      

  3.   

    哎,答案和问题不是相关的啊?访问你的机器的IP和自己机器的IP是两个不同的问题。