网卡状态检查

本文介绍了一种通过定时查询网络接口来检测指定IP地址网络连接状态的方法,并提供了具体的源代码实现。这种方法可以在网络断开时停止服务,在网络恢复时重新启动服务。

检查网线的通断情况

在编写tcp/ip服务程序时,需要 bind 到本地端口,再开始 listen 接收外部请求。如果是只bind

到指定的一个ip地址,而这个ip对应的网卡上网线被拨掉时,如果经过一段时间后再插上,也不能再

接受新的连接请求了。
一般在这种情况下,需要在网线恢复后,重新 bind 端口,开始listen。这样就需要在网线拨掉后,

能停止服务,而网线恢复后,再开始服务。

在Windows中,可以用NotifyAddrChange向系统注册一个事件,当网络发生变化时得到事件通知。但

是使用这种方法会比较大的影响系统性能,有时还会系统死锁,插拨好几次网线才能恢复。

为了方便使用,我采用的是每隔一秒查询一次网络接口,查找指定的IP还在不在,如果不在就认为网

络断开,如果有则认为正常。方法有些笨,管用就行。基本上与QQ同时检测到断开,网络插上时也基

本上与QQ同时恢复。

程序做成 dll的方式,方便其他程序直接使用,调用的接口是

function CheckNICStatus(pAddr:pchar):Integer;stdcall;

导入这个函数就可以用了,pAddr指向要监控的IP地址。返回0表示正常,-1表示断线。

两种方法都有实现,但是感觉用定期去查的方法更方便。 

以下是检查网络接口的源码。

 

function CheckNICStatus(pAddr:pchar):Integer;stdcall;
var
  dwAddr,dwSize:DWORD;
  mit: PMIB_IPADDRTABLE;
  ret,i:DWORD;
begin
  result:
=-1;
  dwAddr :
=inet_addr(pAddr);
  
if dwAddr=INADDR_NONE then Exit;
  GetIpAddrTable(nil, dwSize, TRUE);
  mit :
= GetMemory(dwSize);
  ret:
=GetIpAddrTable(mit,dwSize,True);
  
if ret=NO_ERROR then
  
begin
    
for i := 0 to Pred(mit^.dwNumEntries) do
    
begin
      
if dwAddr=mit^.table[i].dwAddr then
      
begin
        result:
=0;
        
Break;
      
end;
    
end;
  
end;  
  FreeMemory(mit);
end;

在欧拉系统(openEuler)中查看网卡状态,可以通过多种方式实现。以下是一些常用的方法: ### 使用 `ip` 命令 `ip` 命令是一个功能强大的网络配置工具,可以用来查看和管理网络接口的状态。 ```bash ip link show ``` 该命令会列出所有网络接口的详细信息,包括接口名称、状态(UP/DOWN)、MAC地址等。如果某个网卡处于关闭状态,可以使用以下命令启用它: ```bash ip link set <interface_name> up ``` 其中 `<interface_name>` 是你要启用的网卡名称,例如 `eth0` 或 `ens33`。 ### 使用 `ifconfig` 命令 虽然 `ifconfig` 在现代 Linux 系统中逐渐被 `ip` 命令取代,但它仍然广泛使用,并且可以方便地查看网卡状态。 ```bash ifconfig ``` 该命令会显示所有已启用的网络接口的信息,包括 IP 地址、子网掩码、广播地址等。如果某个网卡没有显示,则可能是因为它处于关闭状态或者没有正确配置。 ### 使用 `nmcli` 命令 如果你正在使用 NetworkManager 服务来管理网络连接,可以使用 `nmcli` 命令来查看和管理网络接口的状态。 ```bash nmcli device status ``` 该命令会列出所有网络设备的状态,包括 Wi-Fi、以太网等。你可以看到每个设备的类型、状态以及关联的连接名称。 ### 检查网络接口文件 在 openEuler 中,网络接口的配置通常保存在 `/etc/sysconfig/network-scripts/` 目录下的 `ifcfg-<interface_name>` 文件中。你可以检查这些文件以确保网卡配置正确。 例如,检查 `ens33` 接口的配置文件: ```bash cat /etc/sysconfig/network-scripts/ifcfg-ens33 ``` 确保文件中有正确的配置项,如 `BOOTPROTO=dhcp` 或 `BOOTPROTO=static`,并且 `ONBOOT=yes` 以便在系统启动时自动启用该网卡。 ### 启动和重启网络服务 如果发现网卡没有正常工作,可以尝试重启网络服务或 NetworkManager 服务: ```bash systemctl restart network ``` 或者,如果你使用的是 NetworkManager: ```bash systemctl start NetworkManager systemctl enable NetworkManager ``` 这将启动并设置 NetworkManager 服务为开机自启,确保网络连接能够正常恢复[^2]。 ### 查看网卡物理连接状态 如果你想确认网卡是否已经正确连接到网络(例如是否有网线插入),可以使用 `ethtool` 工具来检查网卡的物理连接状态。 ```bash ethtool <interface_name> ``` 例如: ```bash ethtool eth1 ``` 输出中会包含 `Link detected: yes` 或 `Link detected: no`,表示网卡是否检测到了物理连接[^3]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值