(2)法二在VS中,新建好工程后,点击工具箱---》IP Address Control ,就可以拖出来一个IP专属的控件啦
1.获得IP地址:
(1)法一
先获得控件的指针:
CIPAddressCtrl * pIP=(CIPAddressCtrl*)GetDlgItem(IDC_IPADDRESS);
BYTE nf1,nf2,nf3,nf4;
pIP->GetAddress(nf1,nf2,nf3,nf4);
CString str;
str.Format("%d.%d.%d.%d",nf1,nf2,nf3,nf4);//这里的nf得到的值是IP值了
MessageBox(str);
(2)法二
DWORD dw;
pIP->GetAddress(dw);
CString str;
WORD hiWord=HIWORD(dw);
WORD loWord=LOWORD(dw);
BYTE nf1=HIBYTE(hiWord);//如果不逆序的话,你最终输出的IP是反着的
BYTE nf2=LOBYTE(hiWord);
BYTE nf3=HIBYTE(loWord);
BYTE nf4=LOBYTE(loWord);
str.Format("%d.%d.%d.%d",nf1,nf2,nf3,nf4);
MessageBox(str);
eg://将IPAddressCtrl中的IP地址获得并转换成CString型
unsigned char *pIP;
CString strIP;
DWORD dwIP;
m_ipAddr.GetAddress(dwIP);
pIP = (unsigned char*)&dwIP;
strIP.Format("%u.%u.%u.%u",*(pIP+3), *(pIP+2), *(pIP+1), *pIP);
2.设置IP地址
(1)法一
void SetAddress(BYTE nField0, BYTE nField1,BYTE nField2, BYTE nField3);
void SetAddress(DWORD dwAddress);
eg1:
pIP->SetAddress(127,0,0,1);
pIP->SetAddress((DWORD)0x7F000001);//这两行的效果都是一样的
eg2://将CString型IP地址在IPAddressCtrl中显示
CString strIP="192.168.0.10";
DWORD dwIP;
dwIP = inet_addr(strIP);
unsigned char *pIP = (unsigned char*)&dwIP;
m_ipAddr.SetAddress(*pIP, *(pIP+1), *(pIP+2), *(pIP+3));
(2)法二
void SetFieldRange(int nField, BYTE nLower,BYTE nUpper);
设置每一个域的范围:nField是0到3的值,表示域的下标;nLower和nUpper的范围都是0到255,可以超出范围,但控件也还是默认设置回0到255的。
eg:
pIP->SetFieldRange(0,5,127);//设置每一个域的范围,第一个参数是域的下标,第二和第三个是范围
pIP->SetFieldRange(1,5,127);//当输入比5少时,如0,当失去输入焦点时,它会重置为5
pIP->SetFieldRange(2,5,127);//当输入比127大时,如128,它会自动变回127
pIP->SetFieldRange(3,5,127);
或者直接简单地使用SetWindowText、GetWindowText方法,但是一般你界面做的都是用户自己输入IP再获得并在程序中转换,或者你读取本机IP之类的再显示在窗体中,所以这两个方法一般很少用,最好还是掌握上面的用法。
//CIPAddressCtrl的值转换成CString
CString strIP="192.168.1.184";
m_IPAddr.SetWindowText(strIP);
CString strIP;
m_IPAddr.GetWindowText(strIP);
//CString转换成CIPAddressCtrl
CString strIP="192.168.1.184";
DWORD dwAddress= ntohl( inet_addr(strIP));
m_IPAddr.SetAddress(dwAddress);
//ntohl():将u_short类型的TCP/IP网络字节顺序格式IP地址转换为主机字节顺序
//inet_addr():将点分法IP地址字符串转换为in_addr结构体中的IP地址格式
我第一次用的时候就是用的上面这种方法,将IP地址如"127.0.0.1"通过ntohl()和inet_addr()转换并存到IP控件的DWORD类型的变量中。
补充:如果用到IP地址,你最好用它特有的CIPAddressCtrl控件,当然了,你也可以用编辑框,但这样的话,你不可避免地要判断用户输入的IP是否合法。
判断IP地址是否合法的标准如下:
- 字符串中必须包含3个符号“.”;
- 被符号“.”分隔的4个字符串的长度必须小于或等于3;
- 被符号“.”分隔的4个字符串必须可以转换成整数;
- 被符号“.”分隔的4个字符串转换成的整数不得大于255
bool IsValidIP(char *ip)
{
std::string sip=ip;
int pos=(int)sip.find_first_of(“.“);//查找第1个符号“.”的位置
if(pos==0)//如果没有找到,则返回false
return false;
std::string s1=sip.substr(0,pos);//s1是IP地址中的第1个数字
sip=sip.substr(pos+1,sip.length()-pos);
if(s1.length()>3)
return false;
for(int i=0;i<(int)s1.length();i++)//判断是否每个字符都是数字
{
intc=s1.c_str()[i];
if(!isdigit(c))
return false;
}
inta=atoi(s1.c_str());//判断是否在1~255之间
if(a<1|| a>255)
return false;
pos=(int)sip.find_first_of(“.”);
std::strings2=sip.substr(0,pos); //s2是IP地址中的第2个数字
sip=sip.substr(pos+1,sip.length()-pos);
if(s2.length()>3)
return false;
for(int i=0;i<(int)s2.length();i++)//判断是否每个字符都是数字
{
int c=s2.c_str()[i];
if(!isdigit(c))
return false;
}
a=atoi(s2.c_str());
if(a>255)//判断是否在0~255之间
return false;
pos=(int)sip.find_first_of(“.”);
std::string s3=sip.substr(0,pos); //s3是IP地址中的第3个数字
sip=sip.substr(pos+1,sip.length()-pos);
if(s3.length()>3)
return false;
for(int i=0;i<(int)s3.length();i++)//判断是否每个字符都是数字
{
int c=s3.c_str()[i];
if(!isdigit(c))
return false;
}
a=atoi(s3.c_str());
if(a>255)//判断是否在0~255之间
return false;
pos=(int)sip.find_first_of(“.”);
std::strings4=sip.substr(0,pos); //s4是IP地址中的第4个数字
sip=sip.substr(pos+1,sip.length()-pos);
if(s4.length()>3)
return false;
for(int i=0;i<(int)s4.length();i++)//判断是否每个字符都是数字
{
int c=s4.c_str()[i];
if(!isdigit(c))
return false;
}
a=atoi(s4.c_str());
if(a>254)//判断是否在0~254之间
return false;
//通过上面所有检测后,确定该字符串为合法IP地址
return true;
}