mfc怎么获取本机网段的广播地址

mfc怎么获取本机网段的广播地址,第1张

广播地址就是本网段内已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:

---------------在StdAfxh中加入---------------------

#include <winsock2h>    //套接字编程需要的头文件

#pragma  comment(lib,"ws2_32lib") //套接字编程需要的库文件

---------------在要用的地方---------------------

 WSADATA wsadata;

 if(0 != WSAStartup(MAKEWORD(2, 2), &wsadata))   //初始化

 {

  AfxMessageBox("初始化网络环境失败!");

  return TRUE;

 }

 char szHostName[MAX_PATH + 1];

 gethostname(szHostName, MAX_PATH);  //得到计算机名

 hostent p = gethostbyname(szHostName); //从计算机名得到主机信息

 if(p == NULL)

 {

  AfxMessageBox("得到本机网络信息失败!");

  return TRUE;

 }

 m_strName = szHostName;       //保存主机名

 int nCount = 0;                 //保存主机地址

 char pIP = inet_ntoa((in_addr )p->h_addr_list[0]);//将32位IP转化为字符串IP

 m_strAddr = pIP;             //保存主机IP地址

    UpdateData(FALSE);          //显示各个数据

 WSACleanup();               //释放Winsock API

QT:

QString Widget::getIP()  //获取ip地址  

{  

    QList<QHostAddress> list = QNetworkInterface::allAddresses();  

    foreach (QHostAddress address, list)  

    {  

       if(addressprotocol() == QAbstractSocket::IPv4Protocol)  

//我们使用IPv4地址  

            return addresstoString();  

    }  

       return 0;  

}  

或者

QString localHostName = QHostInfo::localHostName();  

  

qDebug() <<"localHostName:"<<localHostName;  

QHostInfo info = QHostInfo::fromName(localHostName);    

foreach(QHostAddress address,infoaddresses())    

{  

    if(addressprotocol() == QAbstractSocket::IPv4Protocol)              

        qDebug() <<"IPV4 Address: "<< addresstoString();    

}

另外,如果是windows系统:

可以参考:>

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中单独存储,再获取就不会出错了。

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

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

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

可以使用这个实现。

BOOL GetSockName(

CString& rSocketAddress,

UINT& rSocketPort

);

可以使用 inet_addr得到IP地址字符串对应的int。

另一个实现中的数据结构:

struct sockaddr {

ushort sa_family;

char sa_data[14];

};

实际上等同于如下架构,可以强制转换使用的。

struct sockaddr_in {

short sin_family;

u_short sin_port;

struct in_addr sin_addr;

char sin_zero[8];

};

其中sin_addr是一个union

typedef struct in_addr {

union {

struct { UCHAR s_b1,s_b2,s_b3,s_b4; } S_un_b;

struct { USHORT s_w1,s_w2; } S_un_w;

ULONG S_addr;

} S_un;

} IN_ADDR, PIN_ADDR, FAR LPIN_ADDR;

我们一般用S_addr,这个就是IP地址,可以使用inet_ntoa得到对应字符串

我在原来的问题里也回答你了,记得采纳哦

ysdoc的回答不对的,因为GetSockName的值是输出,不是输入,所以不需要用recvfrom去获取。

以上就是关于mfc怎么获取本机网段的广播地址全部的内容,包括:mfc怎么获取本机网段的广播地址、C/C++ 如果获取本机IP和修改IP,代码尽量要简介,本人菜鸟、MFC中IP地址控件问题等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

原文地址:https://54852.com/web/10068852.html

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

发表评论

登录后才能评论

评论列表(0条)

    保存