网口1 - DHCP自动分配IP原理

DHCP自动分配IP原理

1.采用UDP通信方式
2.服务器IP:255.255.255.255; 服务器端口:67, 设备接收端口:68
3.设备向服务器发送DISCOVER信息
4.设备收到服务器回应,且解析正确
5.设备向服务器发送REQUEST请求消息
6.设备接受到服务器应答/非应答, 收到应答,获取正确IP;收到非应答,重新请求;其它错误,重新发送DISCOVER信息.
7.检测IP是否冲突,如果冲突的话,向服务器重新申请 RELEASE_DECLINE,让其重新分配IP;(暂未使用)
8.收到正确IP后,重新设置静态IP,MAC等

PS:如果需要检测IP是否冲突,需要使用MRAM模式,给服务器发送ARP请求,检测是否收到回应来实现此功能

具体参考:https://download.csdn.net/download/pleboyzha/88415029?spm=1001.2014.3001.5503

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
要创建虚拟网口分配虚拟IP,可以使用WinAPI中的以下函数: 1. CreateInterface函数,用于创建虚拟网络接。 2. SetIpInterfaceEntry函数,用于设置虚拟网口IP地址。 以下是一个示例代码,可以帮助你创建虚拟网口分配虚拟IP: ```c++ #include <winsock2.h> #include <iphlpapi.h> #include <ws2tcpip.h> #include <stdio.h> #pragma comment(lib, "iphlpapi.lib") #pragma comment(lib, "ws2_32.lib") int main(int argc, char* argv[]) { WCHAR adapterName[MAX_ADAPTER_NAME_LENGTH]; GUID adapterGuid; PIP_ADAPTER_ADDRESSES adapterAddresses = NULL; PIP_ADAPTER_ADDRESSES adapter = NULL; ULONG adapterAddressesLength = 0; DWORD result = 0; // 获取网络接列表长度 result = GetAdaptersAddresses(AF_UNSPEC, GAA_FLAG_INCLUDE_PREFIX, NULL, adapterAddresses, &adapterAddressesLength); if (result == ERROR_BUFFER_OVERFLOW) { // 分配内存 adapterAddresses = (PIP_ADAPTER_ADDRESSES)malloc(adapterAddressesLength); // 重新获取网络接列表 result = GetAdaptersAddresses(AF_UNSPEC, GAA_FLAG_INCLUDE_PREFIX, NULL, adapterAddresses, &adapterAddressesLength); if (result != NO_ERROR) { printf("GetAdaptersAddresses failed with error: %lu\n", result); return -1; } } else { printf("GetAdaptersAddresses failed with error: %lu\n", result); return -1; } // 遍历网络接列表 for (adapter = adapterAddresses; adapter != NULL; adapter = adapter->Next) { // 找到第一个物理网络接 if (adapter->IfType == IF_TYPE_ETHERNET_CSMACD && adapter->OperStatus == IfOperStatusUp) { wcscpy_s(adapterName, MAX_ADAPTER_NAME_LENGTH, adapter->AdapterName); adapterGuid = adapter->AdapterGuid; break; } } if (adapter == NULL) { printf("No physical network adapter found.\n"); return -1; } // 创建虚拟网络接 NET_LUID adapterLuid = { 0 }; result = ConvertInterfaceGuidToLuid(&adapterGuid, &adapterLuid); if (result != NO_ERROR) { printf("ConvertInterfaceGuidToLuid failed with error: %lu\n", result); return -1; } MIB_IF_ROW2 interfaceRow = { 0 }; interfaceRow.InterfaceLuid = adapterLuid; interfaceRow.InterfaceType = IF_TYPE_SOFTWARE_LOOPBACK; interfaceRow.InterfaceAndOperStatusFlags.HardwareInterface = FALSE; interfaceRow.InterfaceAndOperStatusFlags.OperStatus = IF_OPER_STATUS_UP; wcscpy_s(interfaceRow.Alias, IF_MAX_STRING_SIZE, L"MyVirtualAdapter"); result = CreateIfEntry2(&interfaceRow); if (result != NO_ERROR) { printf("CreateIfEntry2 failed with error: %lu\n", result); return -1; } // 设置虚拟网口IP地址 MIB_IPINTERFACE_ROW ipInterfaceRow = { 0 }; ipInterfaceRow.InterfaceLuid = adapterLuid; ipInterfaceRow.Family = AF_INET; InetPton(AF_INET, "192.168.100.2", &(ipInterfaceRow.InterfaceLuid)); result = SetIpInterfaceEntry(&ipInterfaceRow); if (result != NO_ERROR) { printf("SetIpInterfaceEntry failed with error: %lu\n", result); return -1; } printf("Virtual network adapter created successfully.\n"); return 0; } ``` 这个示例代码中,我们首先使用GetAdaptersAddresses函数获取网络接列表,然后找到第一个物理网络接。接着,我们使用CreateIfEntry2函数创建虚拟网络接,并使用SetIpInterfaceEntry函数设置虚拟网口IP地址。注意,IP地址必须是未被使用的,否则会失败。 希望这个示例代码能够帮助你创建虚拟网口分配虚拟IP

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码农-老七

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值