/* * DhcpProbe.h * * Created on: 2014. 8. 17. * Author: sound79@gmail.com */ #ifndef DHCPPROBE_H_ #define DHCPPROBE_H_ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define MAX_DHCP_CHADDR_LEN 16 #define MAX_DHCP_SNAME_LEN 64 #define MAX_DHCP_FILE_LEN 128 #define MAX_DHCP_OPTIONS_LEN 312 #define SERVER_DHCP_PORT 67 #define CLIENT_DHCP_PORT 68 #define CHECK_WAITTING_DHCP_OFFER_TIME 2 typedef struct DHCPPacket_t { unsigned char op; unsigned char htype; unsigned char hlen; unsigned char hops; #if 0 unsigned long xid; unsigned short secs; unsigned short flags; #else u_int32_t xid; u_int16_t secs; u_int16_t flags; #endif struct in_addr ciaddr; struct in_addr yiaddr; struct in_addr siaddr; struct in_addr giaddr; unsigned char chaddr [MAX_DHCP_CHADDR_LEN]; char sname [MAX_DHCP_SNAME_LEN]; char file [MAX_DHCP_FILE_LEN]; char options[MAX_DHCP_OPTIONS_LEN]; void clear() { op = 0, htype = 0, hlen = 0 , hops = 0; xid = 0, secs = 0, flags = 0; memset(&ciaddr, 0, sizeof(ciaddr)); memset(&yiaddr, 0, sizeof(ciaddr)); memset(&siaddr, 0, sizeof(ciaddr)); memset(&giaddr, 0, sizeof(ciaddr)); memset(chaddr, 0, MAX_DHCP_CHADDR_LEN); memset(sname, 0, MAX_DHCP_SNAME_LEN); memset(file, 0, MAX_DHCP_FILE_LEN); memset(options, 0, MAX_DHCP_OPTIONS_LEN); } }DHCPPacket; using namespace std; class DHCPProbe { private: DHCPPacket mDHCPPacket; string mEthName; string mEthMacAddress; int mDHCPSocket; unsigned long mPacketXID; private: bool makeDHCPSocket(); void closeDHCPSocket(); bool getMacAddress(); bool makeDHCPDiscoveryPacket(); bool sendDHCPDiscovery(); int recvDHCPOffer(char *buffer, int buffer_size, struct sockaddr_in *sourceAddress); int waitDHCPOfferPacket(); public: DHCPProbe(string ethName = "eth0"); virtual ~DHCPProbe(); int CheckDHCPServerExist(); }; #endif /* DHCPPROBE_H_ */