[ad_1]
私は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のさまざまなリンクにアクセスしましたが、それらのどれもこの問題の解決のために働いていません
[ad_2]
Source link
コメント