c语言getipaddrtable获得ip地址与sendArp获得mac地址以及一些字节序问题记录
https://docs.microsoft.com/zh-cn/windows/win32/api/iphlpapi/nf-iphlpapi-getipaddrtable
msdn,有很多c的源码还有解释。
抓包软件使用wireshark
https://wenku.baidu.com/view/15f82868011ca300a6c390cf.html
listen函数使用主动连接套接口变为被连接套接口,使得一个进程可以接受其它进程的请求,从而成为一个服务器进程。在TCP服务器编程中listen函数把进程变为一个服务器,并指定相应的套接字变为被动连接。
|
主机一般是小端,小的放在地址第一位。网络字节序一般是hi大端,大的放在地址第一位。 Part 1: htons函数具体解释 在Intel机器下,执行以下程序 int main() 解释如下,数字16的16进制表示为0x0010,数字4096的16进制表示为0x1000。 由于Intel机器是小尾端,存储数字16时实际顺序为1000,存储4096时实际顺序为0010。因此在发送网络包时为了报文中数据为0010,需要经过htons进行字节转换。如果用IBM等大尾端机器,则没有这种字节顺序转换,但为了程序的可移植性,也最好用这个函数。 另外用注意,数字所占位数小于或等于一个字节(8 bits)时,不要用htons转换。这是因为对于主机来说,大小尾端的最小单位为字节(byte)。 Part 2: 大小端模式 不同的CPU有不同的字节序类型 这些字节序是指整数在内存中保存的顺序 这个叫做主机序 LE little-endian BE big-endian 例子:在内存中双字0x01020304(DWORD)的存储方式 内存地址 例子:如果我们将0x1234abcd写入到以0x0000开始的内存中,则结果为 网络字节顺序是TCP/IP中规定好的一种数据表示格式,它与具体的CPU类型、操作系统等无关,从而可以保证数据在不同主机之间传输时能够被正确解释。网络字节顺序采用big endian排序方式。 为了进行转换 bsd socket提供了转换的函数 有下面四个 在使用little endian的系统中 这些函数会把字节序进行转换 同样 在网络程序开发时 或是跨平台开发时 也应该注意保证只用一种字节序 不然两方的解释不一样就会产生bug. 注: 本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/zouxinfox/archive/2007/10/07/1814088.aspx Part 3: 模拟htonl、ntohl、htons、ntohs函数实现 -------------------------------------------------------------------------------- typedef unsigned short int uint16; typedef unsigned long int uint32; // 短整型大小端互换 #define BigLittleSwap16(A) ((((uint16)(A) & 0xff00) >> 8) | / (((uint16)(A) & 0x00ff) << 8)) // 长整型大小端互换 #define BigLittleSwap32(A) ((((uint32)(A) & 0xff000000) >> 24) | / (((uint32)(A) & 0x00ff0000) >> 8) | / (((uint32)(A) & 0x0000ff00) << 8) | / (((uint32)(A) & 0x000000ff) << 24)) // 本机大端返回1,小端返回0 int checkCPUendian() { union{ unsigned long int i; unsigned char s[4]; }c; c.i = 0x12345678; return (0x12 == c.s[0]); } // 模拟htonl函数,本机字节序转网络字节序 unsigned long int HtoNl(unsigned long int h) { // 若本机为大端,与网络字节序同,直接返回 // 若本机为小端,转换成大端再返回 return checkCPUendian() ? h : BigLittleSwap32(h); } // 模拟ntohl函数,网络字节序转本机字节序 unsigned long int NtoHl(unsigned long int n) { // 若本机为大端,与网络字节序同,直接返回 // 若本机为小端,网络数据转换成小端再返回 return checkCPUendian() ? n : BigLittleSwap32(n); } // 模拟htons函数,本机字节序转网络字节序 unsigned short int HtoNs(unsigned short int h) { // 若本机为大端,与网络字节序同,直接返回 // 若本机为小端,转换成大端再返回 return checkCPUendian() ? h : BigLittleSwap16(h); } // 模拟ntohs函数,网络字节序转本机字节序 unsigned short int NtoHs(unsigned short int n) { // 若本机为大端,与网络字节序同,直接返回 // 若本机为小端,网络数据转换成小端再返回 return checkCPUendian() ? n : BigLittleSwap16(n); } 计算机网络网络高级软件编程技术(第二版)吴功宜
59页
#include<winsock2.h> |
c语言getipaddrtable获得ip地址与sendArp获得mac地址以及一些字节序问题记录的更多相关文章
- 获取客户机MAC地址 根据IP地址 获取机器的MAC地址 / 获取真实Ip地址
[DllImport("Iphlpapi.dll")] private static extern int SendARP(Int32 dest, Int32 host, ref ...
- C#中通过SendARP读取MAC地址
C#中通过SendARP读取MAC地址: using System.Runtime.InteropServices; publicstaticstring GetMacBySendARP(string ...
- Java根据ip地址获取Mac地址,Java获取Mac地址
Java根据ip地址获取Mac地址,Java获取Mac地址 >>>>>>>>>>>>>>>>>&g ...
- tcp/ip 卷一 读书笔记(3)为什么既要有IP地址又要有MAC地址
网络层 首先明确一点,并不是所有的网络之间传输数据都需要mac地址和ip地址,比如说点对点线路之间的通信就没有MAC地址,网络层使用ipx协议时就没有ip地址,但是在当前的主流网络中,我们都使用ip地 ...
- python 实现获取电脑IP、主机名、Mac地址
import socket import uuid # 获取主机名 hostname = socket.gethostname() #获取IP ip = socket.gethostbyname(ho ...
- python实现获取电脑IP、主机名、Mac地址
import socket import uuid # 获取主机名 hostname = socket.gethostname() #获取IP ip = socket.gethostbyname(ho ...
- 修改MAC地址的方法 破解MAC地址绑定(抄)
修改MAC地址的方法 破解MAC地址绑定 网卡的MAC地址是固化在网上EPROM中的物理地址,是一块网卡的“身份证”,通常为48位.在平常的应用中,有很多方面与MAC地址相关,如有些软件是和MAC ...
- 使用 SendARP 获取 MAC 地址(使用SendARP API函数,很多相关文章)
ARP 协议地址解析协议(ARP)是通过解析网路层地址来找寻数据链路层地址的一个在网络协议包中极其重要的网络传输协议.ARP 最初在 1982 年的 RFC 826 中提出并纳入互联网标准 STD 3 ...
- 获取远程请求的IP地址、本机Mac地址和客户端Mac地址
我在近期项目里面去记录异常日志时,用到了这两个地址,也是从网上和前辈那里学习到的,本人项目是MVC框架的,自己整理了一个公共方法类,包括获取远程客户端IP和Mac地址,以及获取本机Mac地址的方法,代 ...
随机推荐
- Python入门11 —— 基本数据类型的操作
一:数字类型:int.float字类型 1.操作: 比较运算:int与float之间是可以比较大小 数学运算:+-*/,int与float之间也可以进行数学运算 print(10 > 3.1) ...
- Win7最后一天,微软开始慌了!
就在昨天(2020年1月14日),服役十年的Win 7正式退出了微软舞台,从2009推出到2019,这十年也是很多90后的青春. 当然微软官方也做了送别,当然其目的也是为了推广Win10! 甚至面对痛 ...
- HDU 4544 湫湫系列故事——消灭兔子 (优先队列)
湫湫减肥 越减越肥! 最近,减肥失败的湫湫为发泄心中郁闷,在玩一个消灭免子的游戏. 游戏规则很简单,用箭杀死免子即可. 箭是一种消耗品,已知有M种不同类型的箭可以选择,并且每种箭都会对兔子 ...
- [Code+#4] 最短路 - 建图优化,最短路
最短路问题,然而对于任意\(i,j\),从\(i\)到\(j\)可以只花费\((i xor j) \cdot C\) 对每个点\(i\),只考虑到\(j\)满足\(j=i xor 2^k, j \le ...
- macOS 下安装tomcat
The Servlet 4.0 specification is out and Tomcat 9.0.x does support it. Time to dive into Tomcat 9. [ ...
- 一步步教你如何在Ubuntu虚拟机中安装QEMU并模拟模拟arm 开发环境(一)uImage u-boot(转)
初次接触qemu是因为工作的需要,有时候下了班,可能需要在家研究一些东西,因为博主用到arm环境,这时候博主比较小气,不愿花钱买开发板,当然博主在这里给大家的建议是,如果要真正学懂arm构架的相关知识 ...
- C++——指针2-指向数组的指针和指针数组
7.4 指向数组元素的指针 声明与赋值 例:int a[10], *pa; pa=&a[0]; 或 pa=a[p1] ; 通过指针引用数组元素,经过上述声明及赋值后: *pa就是a[0],*( ...
- 用Navicat连接mysql报错:2003-Can't connect to MySql server on '10.100.0.109'(10039)
问题描述 在 window 系统上,用 Navicat 连接 Mysql 数据库,弹出以下提示 问题原因 Mysql 数据库未启动 解决方案:启动 Mysql 数据库 1.点击桌面左下角运行 cmd ...
- 解决pjax加载页面不执行js插件的问题
个人博客 地址:http://www.wenhaofan.com/article/20180913220425 介绍 在使用jquery.pjax的时候发现加载页面时不会执行其中的layui以及jqu ...
- Spring框架详解介绍-基本使用方法
1.Spring框架-控制反转(IOC) 2.Spring框架-面向切面编程(AOP) 3.Spring 内置的JdbcTemplate(Spring-JDBC) Spring框架-控制反转(IOC) ...