MFC中基于UDP编写一个简单的聊天室程序,其中在获取对方IP地址时有这么一句:

MFC中基于UDP编写一个简单的聊天室程序,其中在获取对方IP地址时有这么一句:,第1张

GetDlgItem(IDC_IPADDRESS1))是获取控件ID为IDC_IPADDRESS1的句柄

这个是MFC里的IP控件,调用GetAddress,取得IP地址,然后强转成CIPAddressCtrl指针类型。

void CMyDlg::OnIPAddress()

{

// 此段代码:独立的获取本机IP地址和计算机名

WORD wVersionRequested;

WSADATA wsaData;

char name[255];

CString ip;

PHOSTENT hostinfo;

wVersionRequested = MAKEWORD(2, 0);

if (WSAStartup(wVersionRequested, &wsaData) == 0)

{

if(gethostname(name, sizeof(name)) == 0)

{

if((hostinfo = gethostbyname(name)) != NULL)

{

ip = inet_ntoa((struct in_addr )hostinfo->h_addr_list);

}

}

WSACleanup( );

}

// AfxMessageBox(name);//name里是本机名

// AfxMessageBox(ip); //ip中是本机IP

m_IPAddress = ip; // m_IPAddress是IP控件对应的变量,ip是Edit控件对应的变量

// m_IPSetAddress(255, 86, 255, 68); // 直接设置控件里显示的值

// 本段代码:已知IP Address控件里显示的值,转换为CString格式

/

// 下面代码实现:把IP Address控件里的值转化为 CString格式

unsigned char pIP;

CString strIP;

DWORD dwIP;

m_IPGetAddress(dwIP); // m_IP为IP Address控件对应的变量

pIP = (unsigned char)&dwIP;

strIPFormat("%u%u%u%u",(pIP+3), (pIP+2), (pIP+1), pIP);

MessageBox(strIP);/

/

// 下面代码实现:把IP Address控件里的值转化为 CString格式

BYTE f0, f1, f2, f3;

m_IPGetAddress(f0, f1, f2, f3);

CString m_addr;

m_addrFormat("%d%s%d%s%d%s%d", f0, "", f1, "", f2, "", f3);

MessageBox(m_addr);/

/

// 下面代码实现:把IP Address控件里的值转化为 CString格式

BYTE IPByte[4];

m_IPGetAddress(IPByte[0], IPByte[1], IPByte[2], IPByte[3]);

CString strIP = "";

char temp1[10], temp2[10], temp3[10], temp4[10];

itoa(IPByte[0], temp1, 10);

itoa(IPByte[1], temp2, 10);

itoa(IPByte[2], temp3, 10);

itoa(IPByte[3], temp4, 10);

strIP += temp1;

strIP += "";

strIP += temp2;

strIP += "";

strIP += temp3;

strIP += "";

strIP += temp4;

MessageBox(strIP);/

/

// 下面代码实现:把IP Address控件里的值转化为 CString格式

CString strx;

m_IPGetWindowText(strx);

MessageBox(strx);/

// 此段代码:用获取的IP地址值,显示到对话框里IP Address控件中

/ CString strIP;

GetDlgItemText(IDC_EDIT_IPAddress, strIP);

m_IPSetWindowText(strIP);/

m_IPSetWindowText(ip); // 把IP地址(CString类型)直接显示到IP Address控件中

UpdateData(FALSE);

}

因为Client是通信的主动方,即发起通信的一端,因此通信之前Client必须已知Server的IP和端口号才行。

通常的C/S模式通信的做法是先为Server申请公网IP,然后在client编程时指明欲连接的Server的IP和端口号,这样的client程序一旦安装后就内置了Server的IP;

另一种做法是在client的执行界面预留输入框,执行时允许用户输入Server的IP,然后实现通信,这两种方式都必须事先知道server的IP信息才行。

String^ ip=System::Net::Dns::GetHostAddresses(Environment::MachineName)[0]->ToString();

System::Net::Dns::GetHostAddresses(Environment::MachineName)返回一个array<System::Net::IPAddress^>的数组,分别存有本机的所有IP地址(一般电脑都只有一个IP,所以直接用上面一句就可以得到IP地址的字符串。

广播地址就是本网段内已255结尾的IP地址,所以只需找到本机的IP地址,再将最后一个字段替换为255即可,代码如下:

SInfo& info=m_info;

gethostname(infosHost,sizeof(infosHost)); //获取主机名

hostent pHost=gethostbyname(infosHost); //将主机名转化为IP地址

in_addr ad=(in_addr)pHost->h_addr;

strcpy_s(infosIP,inet_ntoa(ad)); //网络IP

DWORD dw=sizeof(infosName);

GetUserName(infosName,&dw);

CString sIP = infosIP; //获取IP地址

int i=sIPReverseFind(''); //找到最后一个字段分隔符

sIP = sIPLeft(i+1)+"255"; //替换为255, sIP 即为本机网段的广播地址

MFC中有专门用来输入IP地址的控件,你添加该控件之后,假如设置其ID为:IDC_IPADDRESS1

直接代码:

CString IPAddr = "";

GetDlgItem(IDC_IPADDRESS1)->GetWindowText(IPAddr); 就OK了

如果你用的是编辑框控件,ID为:IDC_EDIT1,那么你输入的时候就要19216811这样输入了,

代码:

char IPAddr[20] = "";

GetDlgItemText(IDC_EDIT1, IPAddr , 20);

不知道你之前用的那个是编辑框控件还是IP控件,你上面这两种都试试吧

CIPAddressCtrl 获取地址的函数是

int CIPAddressCtrl::GetAddress(BYTE& nField0, BYTE& nField1, BYTE& nField2, BYTE& nField3)

{

ASSERT(::IsWindow(m_hWnd));

DWORD dwAddress;

LRESULT nRetVal = ::SendMessage(m_hWnd, IPM_GETADDRESS, 0, (LPARAM) &dwAddress);

nField0 = (BYTE) FIRST_IPADDRESS(dwAddress);

nField1 = (BYTE) SECOND_IPADDRESS(dwAddress);

nField2 = (BYTE) THIRD_IPADDRESS(dwAddress);

nField3 = (BYTE) FOURTH_IPADDRESS(dwAddress);

return nRetVal;

}

对话框关了,m_IpAddress窗口就销毁了,再去获取,就会

触发ASSERT(::IsWindow(m_hWnd));断言。

建议:将地址变量在dialog中单独存储,再获取就不会出错了。

以上就是关于MFC中基于UDP编写一个简单的聊天室程序,其中在获取对方IP地址时有这么一句:全部的内容,包括:MFC中基于UDP编写一个简单的聊天室程序,其中在获取对方IP地址时有这么一句:、MFC IP地址控件的用法、MFC获取应用程序自身在公网IP及端口号等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9630587.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-30
下一篇 2023-04-30

发表评论

登录后才能评论

评论列表(0条)

保存