【Linux 应用】网络相关开发---ip、网关、掩码、dns、mac的获取和设置,以及dhcp动态获取

2023-11-20

最近开始调试Linux 的测试版,需要开发网络设置相关功能。其实这一块以前也做过,但是都忘记了,可见沉淀的重要性。


1、ip、掩码设置和获取

通过int ioctl(int d, int request, ...);这个函数可以获取到。

其中:

IP设置:SIOCGIFADDR

掩码设置:SIOCGIFNETMASK

mac设置:SIOCGIFHWADDR

其他具体如下:

2、DNS获取和设置

dns设置和获取时通过读写/etc/resolv.conf文件来实现的

# cat /etc/resolv.conf 
nameserver 202.96.134.133
nameserver 202.96.128.166
nameserver 202.96.134.133 # eth0
nameserver 202.96.128.166 # eth0

/tmp/resolv.conf文件也是可以的

# ls -l /etc/resolv.conf 
lrwxrwxrwx    1 root     root            18 Apr 22  2020 /etc/resolv.conf -> ../tmp/resolv.conf

3、网关获取

通过ip route 命令来获取route,以及字符串处理来获取默认网关(default)

4、dhcp动态获取

通过udhcpc 命令来实现dhcp动态获取的

5、代码实现

1、头文件

#ifndef __NET_MANAGER_H__
#define __NET_MANAGER_H__

#define DEFAULT_ETH "eth0"
#define IP_ADDE_COUNT 16

#define IP_SET_STATIC   1
#define IP_SET_AUTO     0


int start_dhcp(char* net_name);
int end_dhcp();

int is_valid_netmask(char* netmask);

int get_ip(char* ip,int length);
int get_ip_netmask(char* ip,int length);

int get_mac(char* addr,int length);

int set_ip_netmask(char* ip,int length);
int set_ip(char* ip,int length);

int set_gateway(char* gateway,int length);
int get_gateway(char* gateway, int length);
int get_dns(char* dns1, int length_dns1, char* dns2, int length_dns2);
int set_dns(const char *dns1,int length_dns1, const char *dns2, int length_dns2);
void set_net(char *ip_addr,int length_ip_addr,char *netmask,int length_netmask,char *gateway,int length_gateway,char *dns1,int length_dns1,char *dns2,int length_dns2);
int connect_check_real ();
int device_check_if_conn(char* ifname);
void net_init();
#endif

2、实现文件

#include <sys/socket.h>
#include <arpa/inet.h>
#include <net/if.h>
#include <net/if_arp.h>
#include <unistd.h>
#include <errno.h>
#include <sys/time.h>
#include <sys/stat.h>
#include <stdio.h>
#include <netdb.h>
#include <netinet/in.h>
#include <sys/ioctl.h>
#include <ctype.h>
#include <net/route.h>
#include <fcntl.h>
#include <string.h>
#include <pthread.h>
#include <sys/wait.h>
#if defined(__GLIBC__) && __GLIBC__ >=2 && __GLIBC_MINOR__ >= 1
#include <netpacket/packet.h>
#include <net/ethernet.h>
#else
#include <sys/types.h>
#include <netinet/if_ether.h>
#endif
 
#include "netManager.h"
#include "userInfo.h"
#include "debugUtils.h"

#define NET_MANAGER_FALSE -1
#define NET_MANAGER_TRUE 0

static int set_addr(char* ip, int flag);
static int get_addr(char *addr, int length, int flag);

/*
*检测ips是否合法
*/
static int is_valid_ip(const char* ipaddr)
{
    int ret = 0;
    struct in_addr inp;
    char buf[64] = {0};
    int ip1,ip2,ip3,ip4;
    
    if(ipaddr == NULL){
        printf("is_valid_ip error: ipaddr is NULL \n");
        return NET_MANAGER_FALSE;
    }
    
    sscanf(ipaddr, "%03d.%03d.%03d.%03d", &ip1,&ip2,&ip3,&ip4);
    snprintf((char *)buf, sizeof(buf), "%d.%d.%d.%d", ip1, ip2, ip3, ip4);
    ret = inet_aton(buf, &inp);
    if (0 == ret)
    {
        return NET_MANAGER_FALSE;
    }
 
    return NET_MANAGER_TRUE;
}
 
/*
 * 先验证是否为合法IP,然后将掩码转化�?2无符号整型,取反�?00...00111...1�?
 * 然后再加1�?0...01000...0,此时为2^n,如果满足就为合法掩�?
 *
 * */
int is_valid_netmask(char* netmask)
{
    if(netmask == NULL){
        printf("is_valid_ip error: ipaddr is NULL \n");
        return NET_MANAGER_FALSE;
    }
    
    if(is_valid_ip(netmask) == 0)
    {
        unsigned long b = 0, i, n[4];
        sscanf(netmask, "%u.%u.%u.%u", &n[3], &n[2], &n[1], &n[0]);
        for(i = 0; i < 4; ++i) //将子网掩码存�?2位无符号整型
        {
            b += n[i] << (i * 8);
        }
        b = ~b + 1;
        if((b & (b - 1)) == 0) //判断是否�?^n
            return NET_MANAGER_TRUE;
    }
 
    GUI_DEBUG("============is_valid_netmask=======%s=============\n",netmask);
    return NET_MANAGER_FALSE;
}

int end_dhcp()
{
    int ret = NET_MANAGER_FALSE;

    if(access("/var/run/udhcpc.pid",R_OK) == -1){
        return NET_MANAGER_TRUE;
    }
    
    ret = system("cat /var/run/udhcpc.pid|xargs kill -9");
    if(ret < 0)
    {
        perror("end_dhcp error");
        return NET_MANAGER_FALSE;
    }
    
    return NET_MANAGER_TRUE;
}

/*
*dhcp动态获取网络
*/
int start_dhcp(char* net_name)
{
    int ret = NET_MANAGER_FALSE;
    char cmd[IP_ADDE_COUNT+128] = {0};
    
    end_dhcp();
    if(NULL == net_name ||strlen(net_name) == 0){
        snprintf(cmd, sizeof(cmd),"busybox udhcpc -b -q -i %s -s /etc/simple.script -p /var/run/udhcpc.pid",DEFAULT_ETH);
        cmd[sizeof(cmd) -1] ='\0';
    }else{
        snprintf(cmd, sizeof(cmd),"busybox udhcpc -b -q -i %s -s /etc/simple.script -p /var/run/udhcpc.pid",net_name);
        cmd[sizeof(cmd) -1] ='\0';
    }
    ret = system(cmd);
    if(ret==-1){
        GUI_DEBUG("run system command error");
    }else{
        if(WIFEXITED(ret)){
            if(0==WEXITSTATUS(ret)){
                GUI_DEBUG("cmd: %s", cmd);
                ret=NET_MANAGER_TRUE;
            }else{
                //GLOG_DEBUG("%s connect to internet fail", ifname);
            }
        }else{
            GUI_DEBUG("exit Code status %d", WEXITSTATUS(ret));
        }
    }

    return ret;
}

/*
*获取ip
*/
int get_ip(char* ip,int length)
{
    return get_addr(ip, length, SIOCGIFADDR);
}

/*
*获取子网掩码
*/
int get_ip_netmask(char* ip,int length)
{
    return get_addr(ip, length, SIOCGIFNETMASK);
}

/*
*获取mac
*/
int get_mac(char* addr,int length)
{
    return get_addr(addr, length, SIOCGIFHWADDR);
}

/*
*根据参数获取�?
*/
static int get_addr(char *addr, int length, int flag)
{
    int sockfd = 0;
    struct sockaddr_in *sin;
    struct ifreq ifr;

    if(addr == NULL){
        printf("get_addr error:addr is NULL\n");
        return NET_MANAGER_FALSE;
    }
    
    if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
    {
        perror("socket error!\n");
        return NET_MANAGER_FALSE;
    }
 
    memset(&ifr, 0, sizeof(ifr));
    snprintf(ifr.ifr_name, (sizeof(ifr.ifr_name) - 1), "%s", DEFAULT_ETH);
 
    if(ioctl(sockfd, flag, &ifr) < 0 )
    {
        perror("ioctl error!\n");
        close(sockfd);
        return NET_MANAGER_FALSE;
    }
    close(sockfd);
 
    if (SIOCGIFHWADDR == flag){
        memcpy((void *)addr, (const void *)&ifr.ifr_ifru.ifru_hwaddr.sa_data, 6);
        GUI_DEBUG("mac address: %2.2x:%2.2x:%2.2x:%2.2x:%2.2x:%2.2x\n", addr[0],addr[1],addr[2],addr[3],addr[4],addr[5]);
    }else{
        sin = (struct sockaddr_in *)&ifr.ifr_addr;
        //snprintf((char *)addr, IP_ADDE_COUNT, "%s", inet_ntoa(sin->sin_addr));
        long ipaddr = inet_addr(inet_ntoa(sin->sin_addr));
        snprintf((char *)addr, length, "%03d.%03d.%03d.%03d", (ipaddr >> 0) & 0xFF, (ipaddr >> 8) & 0xFF, (ipaddr >> 16) & 0xFF, (ipaddr >> 24) & 0xFF);
        GUI_DEBUG("============get_addr======= %s =============\n", addr);
        if(is_valid_ip(addr) != 0){
            return NET_MANAGER_FALSE;
        }
    }
    
    return NET_MANAGER_TRUE;
}
 
/*
*设置子网掩码
*/
int set_ip_netmask(char* ip,int length)
{
    int ip1,ip2,ip3,ip4;
    
    if(NULL == ip){
        printf("set_ip_netmask error: ip is NULL \n");
        return NET_MANAGER_FALSE;
    }
    
    sscanf(ip, "%03d.%03d.%03d.%03d", &ip1,&ip2,&ip3,&ip4);
    snprintf((char *)ip, length, "%d.%d.%d.%d", ip1, ip2, ip3, ip4);
    GUI_DEBUG("============set_ip_netmask======= %s =============\n", ip);
    return set_addr(ip, SIOCSIFNETMASK);
}

/*
*设置ip
*/
int set_ip(char* ip,int length)
{
    int ip1,ip2,ip3,ip4;
    
    if(NULL == ip){
        printf("set_ip_netmask error: ip is NULL \n");
        return NET_MANAGER_FALSE;
    }
    
    sscanf(ip, "%03d.%03d.%03d.%03d", &ip1,&ip2,&ip3,&ip4);
    snprintf((char *)ip, length, "%d.%d.%d.%d", ip1, ip2, ip3, ip4);
    GUI_DEBUG("============set_ip======= %s =============\n", ip);
    return set_addr(ip, SIOCSIFADDR);
}

/*
*根据参数设置
*/
static int set_addr(char* ip, int flag)
{
    struct ifreq ifr;
    struct sockaddr_in sin;
    int sockfd;

    if(ip == NULL){
        printf("set_addr error: ip is NULL\n");
        return NET_MANAGER_FALSE;
    }
 
    if (is_valid_ip(ip) != 0)
    {
        printf("ip was invalid!\n");
        return NET_MANAGER_FALSE;
    }
 
    sockfd = socket(AF_INET, SOCK_DGRAM, 0);
    if(sockfd == -1){
        fprintf(stderr, "Could not get socket.\n");
        perror("eth0\n");
        return NET_MANAGER_FALSE;
    }
 
    snprintf(ifr.ifr_name, (sizeof(ifr.ifr_name) - 1), "%s", DEFAULT_ETH);
 
    /* Read interface flags */
    if (ioctl(sockfd, SIOCGIFFLAGS, &ifr) < 0) {
        fprintf(stderr, "ifdown: shutdown ");
        perror(ifr.ifr_name);
        close(sockfd);
        return NET_MANAGER_FALSE;
    }
 
    memset(&sin, 0, sizeof(struct sockaddr));
    sin.sin_family = AF_INET;
    inet_aton(ip, &sin.sin_addr.s_addr);
    memcpy(&ifr.ifr_addr, &sin, sizeof(struct sockaddr));
    if (ioctl(sockfd, flag, &ifr) < 0){
        fprintf(stderr, "Cannot set IP address. ");
        perror(ifr.ifr_name);
        close(sockfd);
        return NET_MANAGER_FALSE;
    }
    
    close(sockfd);
    return NET_MANAGER_TRUE;
}  

/*
*设置网关
*/
int set_gateway(char* gateway,int length)
{
    int s;
    struct rtentry rt;
    struct sockaddr_in sockaddr;
    int ip1,ip2,ip3,ip4;
    
    if((NULL == gateway) || (length == 0)){
        printf("set_gateway: gateway error.\n");
        return NET_MANAGER_FALSE;
    }
    
    sscanf(gateway, "%03d.%03d.%03d.%03d", &ip1,&ip2,&ip3,&ip4);
    snprintf((char *)gateway, length, "%d.%d.%d.%d", ip1, ip2, ip3, ip4);
    GUI_DEBUG("============set_gateway======= %s =============\n", gateway);
    s = socket(AF_INET, SOCK_DGRAM, 0);
    if (s < 0)
    {
        perror("Socket create error.\n");
        return NET_MANAGER_FALSE;
    }

    memset(&rt, 0, sizeof(struct rtentry));
    memset(&sockaddr, 0, sizeof(struct sockaddr_in));
    sockaddr.sin_family = AF_INET;
    sockaddr.sin_port = 0;
    if(inet_aton(gateway, &sockaddr.sin_addr)<0)
    {
        perror("inet_aton error\n" );
        close(s);
        return NET_MANAGER_FALSE;
    }

    memcpy ( &rt.rt_gateway, &sockaddr, sizeof(struct sockaddr_in));
    ((struct sockaddr_in *)&rt.rt_dst)->sin_family=AF_INET;
    ((struct sockaddr_in *)&rt.rt_genmask)->sin_family=AF_INET;
    rt.rt_flags = RTF_GATEWAY;
    if (ioctl(s, SIOCADDRT, &rt)<0)
    {
        perror("ioctl(SIOCADDRT) error in set_default_route\n");
        close(s);
        return NET_MANAGER_FALSE;
    }

    close(s);
    return NET_MANAGER_TRUE;
}

/*
*获取网关
*/
int get_gateway(char* gateway, int length)
{   
    FILE *fp;
    char buf[512];
    char cmd[128];
    char *tmp;   

    if(gateway == NULL){
        printf("get_gateway error: gateway is NULL\n");
        return NET_MANAGER_FALSE;
    }
  
    strcpy(cmd, "busybox ip route");   
    fp = popen(cmd, "r");   
    if(NULL == fp)   
    {   
        perror("popen error");   
        return NET_MANAGER_FALSE;   
    }   
    while(fgets(buf, sizeof(buf), fp) != NULL)   
    {   
        tmp =buf;   
        while(*tmp && isspace(*tmp))   
            ++ tmp;   
        if(strncmp(tmp, "default", strlen("default")) == 0){
            GUI_DEBUG("default gateway:%s\n", buf);
            sscanf(buf, "%*s%*s%s", gateway);
            long ipaddr = inet_addr(gateway);
            snprintf((char *)gateway, length, "%03d.%03d.%03d.%03d", (ipaddr >> 0) & 0xFF, (ipaddr >> 8) & 0xFF, (ipaddr >> 16) & 0xFF, (ipaddr >> 24) & 0xFF);
            GUI_DEBUG("default gateway:%s\n", gateway);
            break;  
        } 
    }
    pclose(fp);
       
    return NET_MANAGER_TRUE;
}

/*
*获取dns
*/
int get_dns(char* dns1, int length_dns1, char* dns2, int length_dns2)
{   
    FILE *fp;
    char buf[512];
    char cmd[128];
    int i = 0;

    if(dns1 == NULL || NULL == dns2){
        printf("get_dns error: dns is NULL \n");
        return NET_MANAGER_FALSE;
    }
    strcpy(cmd, "cat /tmp/resolv.conf");
    fp = popen(cmd, "r");
    if(NULL == fp)
    {   
        perror("popen error");
        return NET_MANAGER_FALSE;
    }
    while(fgets(buf, sizeof(buf), fp) != NULL)
    {
        if(strlen(buf) == 0 || strncmp(buf, "nameserver",strlen("nameserver")) != 0){
            continue;
        }
        if(i >= 2){
            i = 0;
        }
        if(i == 0){
            sscanf(buf, "%*s%s", dns1);
            long ipaddr = inet_addr(dns1);
            snprintf((char *)dns1, length_dns1, "%03d.%03d.%03d.%03d", (ipaddr >> 0) & 0xFF, (ipaddr >> 8) & 0xFF, (ipaddr >> 16) & 0xFF, (ipaddr >> 24) & 0xFF);
        }else{
            sscanf(buf, "%*s%s", dns2);
            long ipaddr = inet_addr(dns2);
            snprintf((char *)dns2, length_dns2, "%03d.%03d.%03d.%03d", (ipaddr >> 0) & 0xFF, (ipaddr >> 8) & 0xFF, (ipaddr >> 16) & 0xFF, (ipaddr >> 24) & 0xFF);
        }
        i++;
    }
    pclose(fp);
    return NET_MANAGER_TRUE;
} 

/*
*设置dns
*/
int set_dns(const char *dns1,int length_dns1, const char *dns2, int length_dns2)
{
    int ret = NET_MANAGER_TRUE;
    char cmd[128] = {0};
    int ip1,ip2,ip3,ip4;

    if(NULL == dns1 || NULL == dns2){
        printf("set_dns error: dns1 or dns2 is NULL \n");
        return NET_MANAGER_FALSE;
    }
    
    sscanf(dns1, "%03d.%03d.%03d.%03d", &ip1,&ip2,&ip3,&ip4);
    snprintf((char *)dns1, length_dns1,"%d.%d.%d.%d", ip1, ip2, ip3, ip4);
    sscanf(dns2, "%03d.%03d.%03d.%03d", &ip1,&ip2,&ip3,&ip4);
    snprintf((char *)dns2, length_dns2,"%d.%d.%d.%d", ip1, ip2, ip3, ip4);
    GUI_DEBUG("============set_dns====dns1=== %s =============\n", dns1);
    GUI_DEBUG("============set_dns====dns2=== %s =============\n", dns2);
    if(sizeof(dns1) == 0)
    {
        return;
    }
    snprintf(cmd, sizeof(cmd),"echo \"nameserver %s\" > /tmp/resolv.conf",dns1);
    ret = system(cmd);
    if(ret < 0)
    {
        perror("route error");
        return NET_MANAGER_FALSE;
    }
    snprintf(cmd, sizeof(cmd), "echo \"nameserver %s\" >> /tmp/resolv.conf",dns2);
    //strcpy(cmd, "route add default gw ");
    //strcat(cmd, szGateWay);
       
    ret = system(cmd);   
    if(ret < 0)   
    {   
        perror("set_dns error");   
        return NET_MANAGER_FALSE;   
    }

    return ret;   
} 

/*
*设置静态IP网络
*/
void set_net(char *ip_addr,int length_ip_addr,char *netmask,int length_netmask,char *gateway,int length_gateway,char *dns1,int length_dns1,char *dns2,int length_dns2)
{
    if(ip_addr != NULL){
        set_ip(ip_addr,length_ip_addr);
    }
    if((netmask == NULL) && is_valid_netmask(netmask) == 0){
        set_ip_netmask(netmask, length_netmask);
    }else{
        GUI_DEBUG("g_mask_addr is error\n");
    }
    
    if(gateway != NULL){
        set_gateway(gateway, length_gateway);
    }
    if((dns1 != NULL) && (dns2 != NULL)){
        set_dns(dns1, length_dns1, dns2, length_dns2);
    }
    return;
}

void net_init()
{
    IpInfo_S netInfo = getIpinfo();
    if(netInfo.m_netMode == IP_SET_STATIC){
        GUI_DEBUG("net_init is IP_SET_STATIC\n");
        set_net(netInfo.m_ipAddr, strlen(netInfo.m_ipAddr), netInfo.m_Netmask, strlen(netInfo.m_Netmask), netInfo.m_gateWay, strlen(netInfo.m_gateWay), netInfo.m_Dns1,strlen(netInfo.m_Dns1), netInfo.m_Dns2,strlen(netInfo.m_Dns2));
    }else{
        GUI_DEBUG("net_init is IP_SET_AUTO\n");
        start_dhcp(DEFAULT_ETH);
    }
    return;
}

int connect_check_real ()
{  
    int ret = -1;
    int fp;
    char status[10];
    //一定要只读模式打开,读写模式打开不可以  
    fp = open ("/sys/class/net/eth0/operstate",O_RDONLY);

    if (fp<0) {
        printf("open file operstate failure%d\n",fp);
        return;
    }

    memset(status,0,sizeof(status));
    ret = read (fp,status,10);
    printf("status:%s\n",status);
    if (NULL != strstr(status,"up")){
        printf("on line now \n");
        ret = 0;
    }
    else if (NULL != strstr(status,"down")){
        printf("off off \n");
    }
    else{
        printf("unknow error\n");
    }
    close (fp);
    return ret;
}

int device_check_if_conn(char* ifname)
{
    pid_t status;
    uint8_t ret=-1, i=0;
    char cmd[256];
    char serverip[3][32]={"114.114.114.114","8.8.8.8","223.5.5.5"};
    
    for(i=0;i<3;i++){
        snprintf(cmd, sizeof(cmd),"busybox ping -I %s -w 1 -c 1 %s 1>/dev/null 2>&1", ifname, serverip[i]);
        status=system(cmd);
        if(status==-1){
            GUI_DEBUG("run system command error");
        }else{
            if(WIFEXITED(status)){
                if(0==WEXITSTATUS(status)){
                    GUI_DEBUG("%s connect to internet ok", ifname);
                    GUI_DEBUG("cmd: %s", cmd);
                    ret=0;
                    break;
                }else{
                    //GLOG_DEBUG("%s connect to internet fail", ifname);
                }
            }else{
                GUI_DEBUG("exit Code status %d", WEXITSTATUS(status));
            }
        }
    }
    return ret;
}

int check_net()
{
    if(connect_check_real() != 0){
        return -1;
    }
    if(device_check_if_conn("eth0") != 0){
        return 0;
    }
    
    return 1;
}

3、测试代码

#include <stdio.h>
#include "netManager.h"

void set_net();

int main(int argc, char *argv[])
{
    set_net();
    get_dhcp(NULL);
    get_net_info();
    return 0;
}

void set_net()
{
    char g_mask_addr[IP_ADDE_COUNT] = "255.255.0.0";
    char g_ip_addr[IP_ADDE_COUNT] = "172.30.16.68";
    char g_gateway_addr[IP_ADDE_COUNT] = "172.30.15.253";
    char g_dns_addr[2][IP_ADDE_COUNT] = {"8.8.8.8","114.114.114.144"};
    
    set_ip(g_ip_addr);
    if(is_valid_netmask(g_mask_addr) == 0){
        set_ip_netmask(g_mask_addr);
    }else{
        printf("g_mask_addr is error\n");
    }
    
    set_gateway(g_gateway_addr);
    set_dns(g_dns_addr[0],g_dns_addr[1]);
    return;
}

void get_net_info()
{
    char s_ip_addr[IP_ADDE_COUNT] = {0},s_mask_addr[IP_ADDE_COUNT] = {0},s_mac_addr[6] = {0}, \
        s_gateway_addr[IP_ADDE_COUNT] = {0},s_dns_addr[2][IP_ADDE_COUNT] = {0};
    
    get_ip(s_ip_addr);
    get_mac(s_mac_addr);
    get_ip_netmask(s_mask_addr);
    get_gateway(s_gateway_addr);
    get_dns(s_dns_addr);
    
    printf("=========================%s=====================\n",s_ip_addr);
    printf("=========================%s=====================\n",s_mask_addr);
    printf("=========================%2.2x:%2.2x:%2.2x:%2.2x:%2.2x:%2.2x=====================\n", s_mac_addr[0],s_mac_addr[1],s_mac_addr[2],s_mac_addr[3],s_mac_addr[4],s_mac_addr[5]);
    printf("=========================%s=====================\n",s_gateway_addr);
    printf("=========================%s=====================\n",s_dns_addr[0]);
    printf("=========================%s=====================\n",s_dns_addr[1]);
    
    return;
}

结束语

这篇文章主要是记录一下,方便以后回忆和查阅,写的不尽详细,又不懂得欢迎留言交流。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【Linux 应用】网络相关开发---ip、网关、掩码、dns、mac的获取和设置,以及dhcp动态获取 的相关文章

  • 具有少量父设备属性的 udev 规则

    我需要复杂且通用的udev规则来确定插入任何 USB 集线器的特定端口的 USB 设备 所以 我必须结合设备树不同层的父属性 我有这个 udevadm info query all name dev ttyUSB0 attribute wa
  • 如何从类似于 eclipse 的命令行创建可运行的 jar 文件

    我知道 eclipse 会生成一个可运行的 jar 文件 其中提取并包含在该 jar 文件中的所有库 jar 文件 从命令提示符手动创建 jar 文件时如何执行类似的操作 我需要将所有 lib jar 解压到类文件夹中吗 目前我正在使用 j
  • CentOS目录结构是树形的吗?

    CentOS 上有相当于树的东西吗 如果你的 Centos 系统上没有安装 tree 无论如何我通常建议服务器设置使用最小安装磁盘 你应该在命令行中输入以下内容 yum install tree y 如果没有安装 那是因为您没有正确的存储库
  • 如何在 Linux 主机上的 docker 容器中挂载目录 [重复]

    这个问题在这里已经有答案了 我想将一个目录从 docker 容器挂载到本地文件系统 该目录是网站根目录 我需要能够使用任何编辑器在本地计算机上编辑它 我知道我可以跑docker run v local path container path
  • python:numpy 运行脚本两次

    当我将 numpy 导入到 python 脚本中时 该脚本会执行两次 有人可以告诉我如何阻止这种情况 因为我的脚本中的所有内容都需要两倍的时间 这是一个例子 usr bin python2 from numpy import print t
  • 套接字:监听积压并接受

    listen sock backlog 在我看来 参数backlog限制连接数量 这是我的测试代码 server initialize the sockaddr of server server sin family AF INET ser
  • 操作系统什么时候清除进程的内存

    进程在某些操作系统上成功或异常终止 操作系统何时决定擦除分配给该进程的内存 数据 代码等 在退出时或当它想为新进程分配内存时 这个清除内存分配过程在所有操作系统 winXP Win7 linux Mac 上都相同吗 据我了解 页表具有该进程
  • gentoo crontab:为什么这个简单的 crontab 不起作用?

    我使用 GENTOO 发行版 crontab e 35 12 root php5 home www cron php 当我手动运行时 php5 php5 home www cron php 这有效 它向我发送了一封电子邮件 然后我检查日期
  • git在Windows和Linux之间切换后强制刷新索引

    我有一个Windows和Linux共享的磁盘分区 格式 NTFS 它包含一个 git 存储库 约 6 7 GB 如果我只使用Windows or 只使用Linux操作 git 存储库一切正常 但是每次切换系统的时候git status命令将
  • 如何在Python中独立于语言安装(linux)获取用户桌面路径

    我找到了 如何找到用户桌面的路径 的几个问题和答案 但在我看来它们都已失效 至少我找到的那些 原因是 如果用户安装的 Linux 不是英语 他或她的桌面很可能位于除 Desktop 例如 对于瑞典语 我相信它是在 Skrivbord 谁知道
  • 如何以编程方式从Linux中的进程名称获取进程ID

    在我的项目中 我们使用 ACE 自适应通信环境 中间件来编写可在 Windows 和 Linux 上运行的独立于操作系统的代码 要求是从进程名称中获取进程 ID 由于 ACE 不支持这一点 因此我们必须使用特定于平台的宏来分离 Window
  • Bash 方法的返回值总是模 256

    我有一个 bash 脚本方法 它返回输入值 然而 返回值始终是模 256 的值 我用 google 搜索了一段时间 发现this http www tldp org LDP abs html exitcodes html文章说它总是以 25
  • 设置 Apache POI 的路径

    我想创建 Excel 文件并使用 java 程序在该文件中写入数据 That is here http www techbrainwave com p 554我在 java 文件所在的位置提取了 Apache POI 并将该路径包含在路径变
  • Linux shell 脚本中的 while 循环超时

    这工作正常 无限循环 while TRUE do printf done 我在尝试着timeout this while loop与timeout命令 所有这些都不起作用 timeout 5 while TRUE do printf don
  • 让 MongoDB 在 Linux 上监听远程连接

    我已在 Windows 本地计算机上 上成功安装 MongoDB 作为服务 但现在我想将 MongoDb 移动到单独的服务器 所以我将 tarball 解压到网络上的虚拟服务器 运行 Linux 当我从本地计算机使用 PuTTY 连接到服务
  • 在主目录中安装库

    在 Linux Ubuntu 中 我尝试运行一个工具 但它显示错误 库丢失 我无权在系统中安装任何内容 或者根本无法从我的用户帐户执行 sudo 是否可以在我的主目录 没有 sudo 中安装缺少的库 在我的例子中为 libstdc so 6
  • SONAR - 使用 Cobertura 测量代码覆盖率

    我正在使用声纳来测量代码质量 我不知道的一件事是使用 Cobertura 测量代码覆盖率的步骤 我按照以下步骤操作http cobertura sourceforge net anttaskreference html http cober
  • 信号处理程序有单独的堆栈吗?

    信号处理程序是否有单独的堆栈 就像每个线程都有单独的堆栈一样 这是在 Linux C 环境中 来自 Linux 手册页signal 7 http kernel org doc man pages online pages man7 sign
  • GCC 和 ld 找不到导出的符号...但它们在那里

    我有一个 C 库和一个 C 应用程序 尝试使用从该库导出的函数和类 该库构建良好 应用程序可以编译 但无法链接 我得到的错误遵循以下形式 app source file cpp text 0x2fdb 对 lib namespace Get
  • 如何更改 Ubuntu 14.04 上的 php-cli 版本?

    我是 Linux 新手 在篡改时破坏了一些 php 设置 如果我执行一个包含以下内容的 php 脚本 phpinfo 它显示 php 版本为 5 6 但通过命令行 如果我运行php v它返回 7 0 版本 我想让两个版本匹配 我怎样才能修复

随机推荐

  • 【西瓜书】4-决策树

    文章目录 4 1 基本流程 4 2 划分 4 2 1 信息增益 ID3 4 2 2 信息增益率 C 45 4 2 3 基尼指数 CART 4 3 剪枝处理 4 4 连续与缺失值 4 4 2 连续值处理 4 4 1 缺失值处理 4 5 多变量
  • Anchor是什么?

    1 选择性搜索 Selective Search 先介绍一下传统的人脸识别算法 是怎么检测出图片中的人脸的 以下图为例 如果我们要检测图中小女孩的人脸位置 一个比较简单暴力的方法就是滑窗 我们使用不同大小 不同长宽比的候选框在整幅图像上进行
  • crmeb重新安装_手动安装教程 · CRMEB 知识付费版 帮助文档 · 看云

    手动安装 1 创建数据库 倒入数据库文件 数据库文件目录 public install zhishifufei sql 2 修改数据库连接文件 配置文件路径 application database php 数据库类型 type gt my
  • vagrant启动openshift

    1 Install Vagrant 2 Install VirtualBox Ex yum install VirtualBox from the RPM Fusion repository 3 In your bashrc file or
  • 元胞自动机算法汇总含matlab代码_数学建模(十三)

    元胞自动机理论 许多复杂的问题都可以通过元胞自动机来建立模型 元胞自动机实质上是定义在一个具有离散 有限状态的元胞组成的元胞空间上 并按照一定的局部规则 在离散的时间维度上演化的动力学系统 元胞又可称为单元 细胞 是元胞自动机的最基本的组成
  • 【hortonworks/registry】registry 如何添加新的类型 支持 json

    1 概述 hortonworks registry 支持json 但是要自己扩展 有相关接口 支持基本类型 支持自定义对象类型 支持集合类型 map array null 支持嵌套结构 registry支持的数据类型有好几种 其中有Avro
  • STM32F103C8T6+PWM+DMA驱动 WS2812灯带

    STM32 PWM DMA驱动 WS2812灯带 文章目录 1 理论 2代码 理论 1 WS2812参考数据手册 https wenku baidu com view 0925958fba68a98271fe910ef12d2af90342
  • 基于Matlab卡尔曼滤波的IMU和GPS组合导航数据融合(附上源码+数据)

    本文介绍了如何使用Matlab实现惯性测量单元 IMU 和全球定位系统 GPS 组合导航数据融合的卡尔曼滤波算法 通过将IMU和GPS的测量数据进行融合 可以提高导航系统的精度和鲁棒性 我们将详细介绍卡尔曼滤波的原理和实现步骤 并给出源码
  • SpringBoot使用Pio-tl动态填写合同(文档)

    poi tl poi template language 是Word模板引擎 使用Word模板和数据创建很棒的Word文档 poi tl官方网址 项目中有需求需要动态填充交易合同 因此想到了使用poi tl技术来实现 一 引入依赖
  • Keil5无法进入debug(卡死在启动文件)

    Keil5无法进入debug 卡死在启动文件 出现的情况 运行一直卡死在启动文件 例如startup stm32f103xe s 而主程序的箭头也只有一个 两个箭头的运行行在启动文件 debug一直无法运行 解决办法 你在程序中使用了pri
  • Qml与C++交互4:C++信号与Qml的槽函数的连接

    Qml与C 交互4 C 信号与Qml的槽函数的连接 使用场景 整体思路 1 建立C 信号 2 C 实例注册到qml 3 qml中建立槽函数 Connections 类型 建立槽函数 运行结果 使用属性 更多资讯 知识 微信公众号搜索 上官宏
  • OpenCV项目编译错误

    编译遇到如下错误 opencv 3 4 4 modules highgui src window gtk cpp 1062 error 218 No OpenGL support Library was built without Open
  • 长春地铁一号线作业

    长春一号线作业 代码如下 public class 第一次作业 public static void main String args System out println 北环城站 一匡街 胜利公园 解放大路 工农广场 卫星广场 华庆路
  • 卡尔曼及扩展卡尔曼滤波详细推导-来自DR_CAN视频

    卡尔曼及扩展卡尔曼滤波详细推导 来自DR CAN视频 见知乎https zhuanlan zhihu com p 585819291
  • Pytorch权重初始化方法——Kaiming、Xavier

    Pytorch权重初始化方法 Kaiming Xavier 结论 结论写在前 Pytorch线性层采取的默认初始化方式是Kaiming初始化 这是由我国计算机视觉领域专家何恺明提出的 我的探究主要包括 为什么采取Kaiming初始化 考察K
  • window10 设置 cmd 与 PowerShell 格式UTF-8

    win R键 输入 regedit 进入 如果进入不了就去下载 regedit cmd 接下来我们进入对应目录添加对应字符串 好了我们重启vscode运行即可 PowerShell 原CodePage数值数据 更改CodePage数值数据
  • Unity Shader入门精要第七章 基础纹理之遮罩纹理

    Unity系列文章目录 文章目录 Unity系列文章目录 前言 一 实践 参考 前言 遮罩纹理 mask texture 是本章要介绍的最后一种纹理 它非常有用 在很多商业游戏中 都可以见到它的身影 那么什么是遮罩呢 简单来讲 遮罩允许我们
  • WIN10 系统,笔记本电脑显示 “未检测到摄像头”

    笔记本电脑无缘无故不能使用摄像头了 在打开腾讯会议的时候显示 未检测到摄像头 检测设备是否连接 打开设备管理器发现没有 照相机 这个选项 并且在狠心下载360卫士进行系统修复后和驱动检测发现不是驱动的问题之后 摄像头仍然无法使用 在尝试多种
  • 如何使用Minio进行对象存储和数据管理

    Minio是一个开源的对象存储服务器 可用于存储和管理各种类型的数据 包括图像 视频 文档等等 本文将介绍如何安装和配置Minio 使用Minio进行对象存储 以及如何利用Minio的高级功能和解决常见问题 一 简介 1 1 什么是Mini
  • 【Linux 应用】网络相关开发---ip、网关、掩码、dns、mac的获取和设置,以及dhcp动态获取

    最近开始调试Linux 的测试版 需要开发网络设置相关功能 其实这一块以前也做过 但是都忘记了 可见沉淀的重要性 1 ip 掩码设置和获取 通过int ioctl int d int request 这个函数可以获取到 其中 IP设置 SI