00001 #ifndef PLATFORM_APERIOS
00002 #include "netstream.h"
00003 #include <iostream>
00004
00005 using namespace std;
00006
00007 const unsigned int IPaddr::maxHostNameLen = 256;
00008
00009 IPaddr::IPaddr() : server(), ipname(), ipport(0) { Init(); }
00010
00011 IPaddr::IPaddr(const ipnum_t& num) : server(), ipname(), ipport(0) { Init(); set_num(num); }
00012
00013 IPaddr::IPaddr(const ipname_t& name) : server(), ipname(), ipport(0) { Init(); set_name(name); }
00014
00015 IPaddr::IPaddr(const ipnum_t& num, const ipport_t& port) : server(), ipname(), ipport(0) { Init(); set_addr(num,port); }
00016
00017 IPaddr::IPaddr(const ipname_t& name, const ipport_t& port) : server(), ipname(), ipport(0) { Init(); set_addr(name,port); }
00018
00019 bool IPaddr::set_num(const ipnum_t& num) {
00020 if(get_num()!=num) {
00021 Init();
00022 server.sin_family = AF_INET;
00023 server.sin_addr.s_addr = htonl(num);
00024 server.sin_port = htons(ipport);
00025 struct in_addr a;
00026 a.s_addr = server.sin_addr.s_addr;
00027 char addrname[maxHostNameLen];
00028 inet_ntop(AF_INET,&a,addrname,maxHostNameLen);
00029 ipname=addrname;
00030 }
00031 return true;
00032 }
00033
00034 bool IPaddr::set_name(const ipname_t& name) {
00035 Init();
00036 if(!isalpha(name[0])) {
00037
00038 struct in_addr a;
00039 if(inet_pton(AF_INET,name.c_str(),&a)<=0) {
00040 cerr << "IPaddr error: inet_pton failed: " << name << endl;
00041 return false;
00042 }
00043 return set_num(ntohl(a.s_addr));
00044 } else {
00045 Init();
00046 struct hostent * data = gethostbyname(name.c_str());
00047 if(data == NULL) {
00048 cerr << "IPaddr error: gethostbyname failed: " << name << endl;
00049 return false;
00050 }
00051 ipname=name;
00052
00053 memcpy((char *) &server.sin_addr, data->h_addr_list[0], data->h_length);
00054 server.sin_family = data->h_addrtype;
00055 server.sin_port = htons(ipport);
00056 }
00057 return true;
00058 }
00059
00060 IPaddr::ipname_t IPaddr::get_display_num() const {
00061 struct in_addr a;
00062 a.s_addr = server.sin_addr.s_addr;
00063 char addrname[maxHostNameLen];
00064 inet_ntop(AF_INET,&a,addrname,maxHostNameLen);
00065 return addrname;
00066 }
00067
00068 IPaddr::ipname_t IPaddr::get_rname() const {
00069 struct in_addr a;
00070 a.s_addr = server.sin_addr.s_addr;
00071 struct hostent * data = gethostbyaddr((char*)&a,sizeof(a),AF_INET);
00072 if(data==NULL) {
00073 cerr << "IPaddr error: gethostbyaddr failed: " << ipname << endl;
00074 return "";
00075 }
00076 return data->h_name;
00077 }
00078
00079 void IPaddr::Init() {
00080 ipname="";
00081 memset((char *) &server, sizeof(server), 0);
00082 }
00083
00084 #endif