java socket编程中怎么获得本机mac-CSDN论坛

java socket编程中怎么获得本机mac-CSDN论坛,第1张

工具/原料

一台配置好java环境的可以上网的电脑

Java获取本地Mac地址

首先,创建工程,包,和一个类。

在此不加详述,我们直接看代码。

这里,我把这个类命名为GetMacAddr

这里,最最关键的就是这里这个方法。

我们通过NetworkInterface这个类来 *** 作。

也就是通过getLocalHost()方法先得到本机IP,

然后调用getHardwareAddress()方法得到一个byte数组的地址。

我们把六位地址传到一个byte数组里面,然后输出来就是。

不多废话,看代码:

private void getMACAddr()

throws SocketException, UnknownHostException {

// 获得IP

NetworkInterface netInterface =

NetworkInterfacegetByInetAddress(InetAddressgetLocalHost());

// 获得Mac地址的byte数组

byte[] macAddr = netInterfacegetHardwareAddress();

Systemoutprint("MAC Addr:\t");

// 循环输出

for (byte b : macAddr) {

// 这里的toHexString()是自己写的格式化输出的方法,见下步。

Systemoutprint(toHexString(b) + " ");

}

}

上一步骤中,为什么会出现一个toHexString()方法呢?

因为可能10进制转16进制时候可能会出现单字符,

所以,如果有出现单字符的情况,我们在其前面添加一个“0”做占位符。

这也是为了视觉的直观,也夹带着个人的习惯。

private static String toHexString(int integer) {

// 将得来的int类型数字转化为十六进制数

String str = IntegertoHexString((int) (integer & 0xff));

// 如果遇到单字符,前置0占位补满两格

if (strlength() == 1) {

str = "0" + str;

}

return str;

}

然后,我们写一个简单的main方法测试一下。

public static void main(String[] args)

 throws SocketException, UnknownHostException {

new GetMacAddr()getMACAddr();

}

结果无误,我们得到了本地的MAC地址。

大家一起来试一试吧!

#include<WinSock2h>

#pragma comment(lib,"WS2_32")

class CInitSock

{

public:

    CInitSock(BYTE minorVer=2,BYTE majorVer=2)

    {

        WSADATA wsaData;

        WORD sockVersion=MAKEWORD(minorVer,majorVer);

        if(WSAStartup(sockVersion,&wsaData)!=0)

        {

            exit(0);

        }

    }

    ~CInitSock()

    {

        WSACleanup();

    }

};

WSADATA 这个结构被用来存储 被WSAStartup函数调用后返回的 Windows Sockets 数据。它包含Winsockdll 执行的数据。

WSAStartup    为了在应用程序当 中调用任何一个Winsock API函数,首先第一件事情就是必须通过WSAStartup函数完成对Winsock服务的初始化,因此需要调用WSAStartup函数。使用 Socket的程序在使用Socket之前必须调用WSAStartup函数。该函数的第一个参数指明程序请求使用的Socket版本,其中高位字节指明 副版本、低位字节指明主版本; *** 作系统利用第二个参数返回请求的Socket的版本信息。当一个应用程序调用WSAStartup函数时, *** 作系统根据请求的Socket版本来搜索相应的 Socket库,然后绑定找到的Socket库到该应用程序中。以后应用程序就可以调用所请求的Socket库中的其它Socket函数了。

WSACleanup   应用程序或DLL在使用Windows Sockets服务之前必须要进行一次成功的WSAStartup()调 用当它完成了Windows Sockets的使用后,应用程序或DLL必须调用WSACleanup()将其从Windows Sockets的实现中注销,并且该实现释放为应用程序或DLL分配的任何资源任何打开的并已建立连接的SOCK_STREAM类型套接口在调用 WSACleanup()时会重置; 而已经由closesocket()关闭却仍有要发送的悬而未决数据的套接口则不会受影响- 该数据仍要发送 对应于一个任务进行的每一次WSAStartup()调用,必须有一个 WSACleanup()调用只有最后的WSACleanup()做实际的清除工作;前面的调用仅仅将Windows Sockets DLL中的内置引用计数递减一个简单的应用程序为确保WSACleanup()调用了足够的次数,可以在一个循环中不断调用WSACleanup()直 至返回WSANOTINITIALISED

#include"initsockh"

#include<iostream>

using std::cout;

using std::endl;

CInitSock initSock;

void IP()

{

    int i;

    char szHost[256];

    gethostname(szHost,256);

    hostent pHost=gethostbyname(szHost);

    in_addr addr;

   

    char p=pHost->h_addr_list[0];

    memcpy(&addrS_unS_addr,p,pHost->h_length);

    char szIp=inet_ntoa(addr);

    cout<<szIp<<endl;

}

int main()

{

    IP();

    system("pause");

    return 0;

}

gethostname()   返回本地主机的标准主机名。

int PASCAL FAR gethostname(char FAR name, int namelen); 

name: 一个指向将要存放主机名的缓冲区指针。 

namelen:缓冲区的长度。

hostent      是host entry的缩写,该结构记录主机的信息,包括主机名、别名、地址类型、地址长度和地址列表。之所以主机的地址是一个列表的形式,原因是当一个主机有多个网络接口时,自然有多个地址。

#define h_addr h_addr_list[0]    h_addr_list中的第一地址。

struct hostent { 

     char h_name;       //地址的正式名称 

     char h_aliases; //空字节-地址的预备名称的指针。

     int h_addrtype; //地址类型; 通常是AF_INET。

     int h_length;     //地址的比特长度。

     char h_addr_list;     //零字节-主机网络地址指针。网络字节顺序。

};

memcpy

extern void memcpy(void destin, void source, unsigned n);

由source指向地址为起始地址的连续n个字节的数据复制到以destin指向地址为起始地址的空间内。

方向有点不对。

获取本机IP地址,一般是不通过socket这个途径,当然这个途径可以获得地址,但一般不会这么做。你可以查下getsockbyname这个函数。

至于这里为什么会显示0000,可能是你在SOCKET理解上有点出入。

my_addrsin_addrs_addr在不同的情况有不同的含义,如果是TCP监听套接口,则它的含义是比较的标准,而不是本机的IP。

比如你的机器,它有多个地址,首先127001是它的回路地址,本机可以通过127001来访问自己。其次他可能有个内部局域网地址,比如说是19216815,局域网上机器都可以通过这个地址访问你的机器。还有可能你的机器有个外网地址,比如202101563,internet上的机器都可以通过这个地址访问你的机器。

接下来说下my_addrsin_addrs_addr的含义:

如果你创建了TCP监听套接口,而且你执行的是 my_addrsin_addrs_addr赋值为127001,意思就是只有目的地址为127001的包才会被监听套接口获取,这就是一种后果,因为127001是回路地址,根本就不会出网卡,如果其它机器输入127001最后会被送回自己本机,包根本就不会到达你的机器,也就是这种接口只能接受自己本地的包。如果内网的机器发送包目的地址是你的局域网地址19216815,而且端口也是你这个套接口监听的端口,可惜的是这个端口只收目的地址是127001的包,19216815的包会被丢弃。这种接口最终结果就是只收本机的包。

如果绑定的是19216815的地址,则任何目的地址是19216815的包都会被接受(当然端口必须是一致)。这种只能局域网上的机器包会被你的端口收到,外网则不行,原因很简单,外网的19216815的包是不可能通过路由到达你的机器。

如果是你的外网地址,则同理任何外网地址到达的包都会被收到。

如果是INADDR_ANY,则意思就是不管目的地址是什么,都会被你接受。可能有点不可思议,但放心,路由器不会让什么地址的包都会到达你的主机的。

总之就是这个是监听的标准,而不是你的IP,你甚至可以把它设置成别人的IP地址,但可惜的是别人的IP地址的包,路由器是不会转发给你的,所以你什么都不会收到。(至少在当今以太网作为局域网的天下你是收不到的,路由器不转发。不知道令牌环网或者其它的局域网会怎样,当然即使是以太网也可以使用ip欺骗的技术,这有点扯远了)。

不知道我说请不清楚。

以上就是关于java socket编程中怎么获得本机mac-CSDN论坛全部的内容,包括:java socket编程中怎么获得本机mac-CSDN论坛、C++获取本机的IP地址。如何实现、如何获取当前IP地址等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/9686181.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-30
下一篇2023-04-30

发表评论

登录后才能评论

评论列表(0条)

    保存