通过socket,recv的方式吧
时间: 2023-07-25 12:33:21 浏览: 73
如果你想通过Socket和recv函数获取这些信息,可以参考以下实现方法:
- 获取IP地址:在创建Socket之后,使用getsockname函数获取Socket的本地地址,即可获取本地IP地址。
```
struct sockaddr_in local_addr;
socklen_t addr_len = sizeof(local_addr);
getsockname(sock, (struct sockaddr *)&local_addr, &addr_len);
char ip_addr[INET_ADDRSTRLEN];
inet_ntop(AF_INET, &(local_addr.sin_addr), ip_addr, INET_ADDRSTRLEN);
```
- 获取MAC地址:可以使用ioctl函数结合SIOCGIFHWADDR标志获取网络接口的MAC地址。
```
struct ifreq ifr;
memset(&ifr, 0, sizeof(ifr));
strncpy(ifr.ifr_name, "eth0", IFNAMSIZ - 1);
int sock = socket(AF_INET, SOCK_DGRAM, 0);
ioctl(sock, SIOCGIFHWADDR, &ifr);
unsigned char* mac_addr = ifr.ifr_hwaddr.sa_data;
```
- 获取网络接口名称:可以使用getifaddrs函数获取网络接口的列表,然后遍历每个网络接口,获取其名称。
```
struct ifaddrs *ifaddr, *ifa;
if (getifaddrs(&ifaddr) == -1) {
perror("getifaddrs");
exit(EXIT_FAILURE);
}
for (ifa = ifaddr; ifa != NULL; ifa = ifa->ifa_next) {
if (ifa->ifa_addr == NULL) {
continue;
}
int family = ifa->ifa_addr->sa_family;
if (family == AF_INET) {
printf("Interface name: %s\n", ifa->ifa_name);
}
}
freeifaddrs(ifaddr);
```
需要注意的是,上述代码仅作为参考,具体实现可能会因操作系统和编程语言的不同而有所变化。同时,如果你是通过recv函数获取这些信息,需要先接收对端发送的数据,然后使用相应的函数或结构体从数据中解析出这些信息。
阅读全文