
广播地址就是本网段内已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地址控件问题等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)