linux中网络怎么检查,如何在Linux中检查以太网?
要檢查鏈接是否已啟動,請嘗試以下操作.它沒有root權限.
#include // printf
#include // strncpy
//#include // AF_INET
#include // SIOCGIFFLAGS
#include // errno
#include // IPPROTO_IP
#include // IFF_*, ifreq
#define ERROR(fmt, ...) do { printf(fmt, __VA_ARGS__); return -1; } while(0)
int CheckLink(char *ifname) {
int state = -1;
int socId = socket(AF_INET, SOCK_DGRAM, IPPROTO_IP);
if (socId < 0) ERROR("Socket failed. Errno = %d\n", errno);
struct ifreq if_req;
(void) strncpy(if_req.ifr_name, ifname, sizeof(if_req.ifr_name));
int rv = ioctl(socId, SIOCGIFFLAGS, &if_req);
close(socId);
if ( rv == -1) ERROR("Ioctl failed. Errno = %d\n", errno);
return (if_req.ifr_flags & IFF_UP) && (if_req.ifr_flags & IFF_RUNNING);
}
int main() {
printf("%d\n", CheckLink("eth0"));
}
如果設置了IFF_UP,則表示接口已啟動(請參閱ifup).如果設置了IFF_RUNNING,則接口已插入.
我也嘗試使用ethtool ioctl調用,但是當gid不是root時它失敗了.但只是為了日志:
...
#include // __u32
#include // ETHTOOL_GLINK
#include // SIOCETHTOOL
...
int CheckLink(char *ifname) {
...
struct ifreq if_req;
(void) strncpy( if_req.ifr_name, ifname, sizeof(if_req.ifr_name) );
struct ethtool_value edata;
edata.cmd = ETHTOOL_GLINK;
if_req.ifr_data = (char*) &edata;
int rv = ioctl(socId, SIOCETHTOOL, &if_req);
...
return !!edata.data;
}
總結
以上是生活随笔為你收集整理的linux中网络怎么检查,如何在Linux中检查以太网?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 使用 Linux 系统调用的内核命令
- 下一篇: Linux 调度器内幕