C++ のコードを使用して、centos に新しいルート (ネットワーク名、つまり eth0 と IP ) を追加します。


私はC++が初めてです.centos 6.8オペレーティングシステムのnetbeansでQT4を使用しています。 QT-Formの「ADD」ボタンをクリックすると、Linuxに新しいルートが追加されます

1-network name i.e., eth0.

2- IP address.

「newForm.h」のコードは次のとおりです。

C++
 #ifndef _NEWFORM_H
#define _NEWFORM_H

#include "ui_newForm.h"
#include <net if.h="">
#include <stdio.h>
#include <iostream>
#include <qdebug>


#include <sys ioctl.h="">
#include <net if.h="">
#include <netinet in.h="">
#include <stdio.h>
#include <arpa inet.h="">

#include <arpa inet.h="">
#include <cerrno>
#include <ifaddrs.h>
#include <iostream>
#include <net if.h="">
#include <string>
#include <string.h>
#include <sysexits.h>
#include <sys socket.h="">
#include <sys types.h="">

#include <stdio.h>      
#include <sys types.h="">
#include <ifaddrs.h>
#include <netinet in.h=""> 
#include <string.h> 
#include <arpa inet.h="">

class newForm : public QDialog {
    Q_OBJECT
public:
    newForm();
    virtual ~newForm();
private:
    Ui::newForm widget;
    char addressBuffer[INET_ADDRSTRLEN];
    void setIPv4(char * ip,char * gw,char * netmask);
    bool addNullRoute( long host);
    
private slots:
    void on_Add();

    void indexChanged(int);
};

#endif /* _NEWFORM_H */ 

これが QT newForm を示す私の main.cpp です。

C++
 #include <qapplication>
#include "newForm.h"

int main(int argc, char *argv[]) {
    // initialize resources, if needed
    // Q_INIT_RESOURCE(resfile);

    QApplication app(argc, argv);
    newForm *a =new newForm();
    a->show();

    // create and show your widgets here

    return app.exec();
} 

これが「newForm.cpp」です。このコードでは、on_Add()ボタンをクリックしてLinuxに新しいルートを追加しようとしています 正しく動作しない .

1-network name i.e., eth0.

2- IP address.

エラーは次のとおりです。

ioctl:No such device
ioctl:Operation not supported

Linux で既存のルートを更新する setIPv4() 関数を次に示します。 正しく

C++
#include "newForm.h"
#include <net if.h="">
#include <iostream>
#include <qdebug>

#include <cerrno>
#include <string>
#include <string.h>
#include <sysexits.h>
#include <sys types.h="">

#include <netdb.h>            // struct addrinfo
#include <netinet ip.h="">       // IP_MAXPACKET (which is 65535)
#include <bits ioctls.h="">      // defines values for argument "request" of ioctl.
#include <linux if_ether.h="">   // ETH_P_ARP = 0x0806
#include <linux if_packet.h="">  // struct sockaddr_ll (see man 7 packet)
#include <net ethernet.h="">

#ifndef WIN32_LEAN_AND_MEAN
#define WIN32_LEAN_AND_MEAN
#endif
#include <net route.h="">
#include <sys ioctl.h="">


#pragma comment(lib, "iphlpapi.lib")

    
#define _GNU_SOURCE     /* To get defns of NI_MAXSERV and NI_MAXHOST */
#include <sys socket.h="">
#include <ifaddrs.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <linux if_link.h="">using namespace std;
#include <arpa inet.h="">
#include <errno.h>

newForm::newForm() {
    widget.setupUi(this);

    connect(widget.pushButton_2, SIGNAL(clicked()), this, SLOT(on_Add()));   

    struct ifaddrs * ifAddrStruct=NULL;
    struct ifaddrs * ifa=NULL;
    void * tmpAddrPtr=NULL;

    getifaddrs(&ifAddrStruct);

    for (ifa = ifAddrStruct; ifa != NULL; ifa = ifa->ifa_next) {
        if (!ifa->ifa_addr) {
            continue;
        }
        if (ifa->ifa_addr->sa_family == AF_INET) { // check it is IP4
            // is a valid IP4 Address
            tmpAddrPtr=&((struct sockaddr_in *)ifa->ifa_addr)->sin_addr;
            inet_ntop(AF_INET, tmpAddrPtr, addressBuffer, INET_ADDRSTRLEN);
           // printf("%s IP Address %s\n", ifa->ifa_name, addressBuffer); 
            widget.comboBox_IFname->addItem(QString::fromStdString(ifa->ifa_name));
           
        } 
    }
    if (ifAddrStruct!=NULL) freeifaddrs(ifAddrStruct);



}

void newForm::setIPv4(char * ip,char * gw,char * netmask)
{
    char cmd[128];

    //network interface
    char nwkInf[15]="virbr1";

    //link down command in Linux
    sprintf(cmd,"ip link set %s down",nwkInf);
    system(cmd); 
    
    
    memset(cmd,0x00,64);
    //command to set ip address, netmask
    sprintf(cmd,"ifconfig %s %s netmask %s",nwkInf,ip,netmask);
    system(cmd);     
    printf("\ncmd : %s",cmd); fflush(stdout);
    memset(cmd,0X00,64);

    //command to set gateway
    sprintf(cmd,"route add default gw %s %s",gw,nwkInf);
    system(cmd); 

    memset(cmd,0X00,64);
    //link up command
    sprintf(cmd,"ip link set %s up",nwkInf);
    system(cmd); 
    
}


void newForm::on_Add(){
   setIPv4("192.168.15.188","192.168.15.255","255.255.255.0");

  

   int sockfd;
   struct rtentry rt;
   
   

   sockfd = socket(AF_INET, SOCK_DGRAM, 0);
   if (sockfd == -1)
   {
      perror("socket creation failed\n");
      return;
   }

   struct sockaddr_in *sockinfo = (struct sockaddr_in *)&rt.rt_gateway;
   sockinfo->sin_family = AF_INET;
   sockinfo->sin_addr.s_addr = inet_addr("192.188.88.88");

   sockinfo = (struct sockaddr_in *)&rt.rt_dst;
   sockinfo->sin_family = AF_INET;
   sockinfo->sin_addr.s_addr = INADDR_ANY;

   sockinfo = (struct sockaddr_in *)&rt.rt_genmask;
   sockinfo->sin_family = AF_INET;
   sockinfo->sin_addr.s_addr = INADDR_ANY;

   rt.rt_flags = RTF_UP | RTF_GATEWAY;
   rt.rt_dev = "eth3";

   if(ioctl(sockfd, SIOCADDRT, &rt) < 0 )
       perror("ioctl");

}
newForm::~newForm() {
} 

私が試したこと:

このエラーを取り除く方法:

ioctl:No such device
ioctl:Operation not supported

C++ のコードを使用して centos に新しいルート (ネットワーク名、つまり eth1 と IP アドレス) を追加しますか?

注:私はこのタスクのためにstrackoverflowのさまざまなリンクにアクセスしましたが、それらのどれもこの問題の解決のために働いていません



Source link

コメント

タイトルとURLをコピーしました