文章目录
- 使用场景:
- `CIPAddressCtrl`类的成员的属性:
- 1、空内容判断 `CIPAddressCtrl::IsBlank()`
- 2、清空控件 `CIPAddressCtrl::ClearAddress()`
- 3、获取IP地址 `CIPAddressCtrl::GetAddress()`
- 方法一
- 方法二
- 4、设置`IP`地址 `CIPAddressCtrl::SetAddress()`
- 方法一
- 方法二 使用SetFieldRange函数
IP
地址控件的主要作用就是进行前台控件内容和后台
IP
地址的相互传递。
使用场景:
- 对于网络通信,一般是用一个
IP
地址结构体来表示IP
地址 - 对于非网络通信编程,一般是用一个32位无符号整型变量来表示
IP
地址
IP
地址控件的几个函数都可以方便的进行网络通信编成和前后台的交互,以及非网络通信编程和前台的交互。
CIPAddressCtrl
类的成员的属性:
1、空内容判断 CIPAddressCtrl::IsBlank()
if( ((CIPAddressCtrl*)GetDlgItem(IDC_IPADDRESS1))->IsBlank() )
{
MessageBox("请输入IP地址");
return;
}
2、清空控件 CIPAddressCtrl::ClearAddress()
((CIPAddressCtrl*)GetDlgItem(IDC_IPADDRESS1))->ClearAddress();
3、获取IP地址 CIPAddressCtrl::GetAddress()
方法一
BYTE nFild[4];
(CIPAddressCtrl*)GetDlgItem(IDC_IPADDRESS)->GetAddress(nFild[0],nFild[1],nFild[2],nFild[3]);
CString str;
str.Format("%d.%d.%d.%d",nFild[0],nFild[1],nFild[2],nFild[3]);
MessageBox(str);
方法二
DWORD dw;
(CIPAddressCtrl*)GetDlgItem(IDC_IPADDRESS)->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);
若我们将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);
//网络编程时直接使用IP地址结构体
struct in_addr addrIP;
((CIPAddressCtrl*)GetDlgItem(IDC_IPADDRESS1))->GetAddress(addrIP.S_un.S_un_b.s_b1,addrIP.S_un.S_un_b.s_b2,addrIP.S_un.S_un_b.s_b3,addrIP.S_un.S_un_b.s_b4);
//非网络编程时直接使用整形变量
DWORD dwAddress ;
((CIPAddressCtrl*)GetDlgItem(IDC_IPADDRESS1))->GetAddress(dwAddress );//参数为主机字节顺序
4、设置IP
地址 CIPAddressCtrl::SetAddress()
void SetAddress(BYTE nField0, BYTE nField1,BYTE nField2, BYTE nField3);
void SetAddress(DWORD dwAddress);
方法一
- 直接赋值
(CIPAddressCtrl*)GetDlgItem(IDC_IPADDRESS)->SetAddress(127.0.0.1);
(CIPAddressCtrl*)GetDlgItem(IDC_IPADDRESS)->SetAddress((DWORD)0x7F000001);
- 将CString型的IP地址在控件中显示
CString strIP="192.168.0.10";
DWORD dwIP=inet_addr(strIP);
unsigned char *pIP = (unsigned char*)&dwIP;
m_ipAddr.SetAddress(*pIP, *(pIP+1), *(pIP+2), *(pIP+3));
//网络编程时直接使用IP地址结构体
struct in_addr addrIP;
((CIPAddressCtrl*)GetDlgItem(IDC_IPADDRESS1))->SetAddress(addrIP.S_un.S_un_b.s_b1,addrIP.S_un.S_un_b.s_b2,addrIP.S_un.S_un_b.s_b3,addrIP.S_un.S_un_b.s_b4);
//非网络编程时直接使用整形变量
DWORD dwAddress = 0x7F000001;//127.0.0.1回环地址
((CIPAddressCtrl*)GetDlgItem(IDC_IPADDRESS1))->SetAddress( dwAddress );//参数为主机字节顺序
//也可以直接填数字
((CIPAddressCtrl*)GetDlgItem(IDC_IPADDRESS1))->SetAddress( 127,0,0,1 );
方法二 使用SetFieldRange函数
参数一:nField是0到3的值,表示域的下标
参数二:nLowerr的范围都是0到255,可以超出范围,但控件也还是默认设置回0到255的
参数三:nUpper的范围都是0到255,可以超出范围,但控件也还是默认设置回0到255的。
void SetFieldRange(int nField, BYTE nLower, BYTE nUpper);
比如我们设置:127.0.0.1
(CIPAddressCtrl*)GetDlgItem(IDC_IPADDRESS)->SetFieldRange(0,5,255);
(CIPAddressCtrl*)GetDlgItem(IDC_IPADDRESS)->SetFieldRange(1,5,255);//当输入比5少时,如0,当失去输入焦点时,它会重置为5
(CIPAddressCtrl*)GetDlgItem(IDC_IPADDRESS)->SetFieldRange(2,5,255);//当输入比127大时,如128,它会自动变回127
(CIPAddressCtrl*)GetDlgItem(IDC_IPADDRESS)->SetFieldRange(3,5,255);
注意:
- IP地址结构体中存储的IP地址是网路字节顺序的,高字节在前,低字节在后的,例如:0x7F000001
- 32位无符号长整型中存储的IP地址是主机字节顺序,低字节在前,高字节在后,例如:0x0100007F
常用:
我们一般常用的是点分十进制的IP地址字符串来表示一个IP地址。
char * strIP = "127.0.0.1";
struct in_addr addrIP;
addrIP.S_un.S_addr = inet_addr( strIP );//把字符串变成ip地址结构体
strIP=inet_ntoa(addrIP);//ip地址结构体变成字符串