获取本机ip实现过程:
WSAStartup()。Windows Sockets Asynchronous的启动命令,Windows下的网络编程必须先启用本命令,不然,后续的 *** 作都会报错:10093:WSAStartup() 调用未成功执行过。
gethostname()获得本机名
gethostbyname()获得本机网络信息,存储到struct hostent 指针中,返回给调用者
从struct hostent结构体信息中,获取ip地址,转换成字符串输出
参考代码 :
#include "winsock2h"#pragma comment(lib,"ws2_32lib")
int main(int argc, char argv[])
{
WSADATA wsaData;
char name[155];
char ip;
PHOSTENT hostinfo;
if ( WSAStartup( MAKEWORD(2,0), &wsaData ) == 0 )
{
if( gethostname ( name, sizeof(name)) == 0)
{
printf("hostname=%s\n", name );
if((hostinfo = gethostbyname(name)) != NULL)
{
ip = inet_ntoa ((struct in_addr )hostinfo->h_addr_list); //得到地址字符串
printf("local host ip: %s\n",ip);
}
}
WSACleanup( );
}
return 0;
}
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中单独存储,再获取就不会出错了。
可以使用这个实现。
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去获取。
因为Client是通信的主动方,即发起通信的一端,因此通信之前Client必须已知Server的IP和端口号才行。
通常的C/S模式通信的做法是先为Server申请公网IP,然后在client编程时指明欲连接的Server的IP和端口号,这样的client程序一旦安装后就内置了Server的IP;
另一种做法是在client的执行界面预留输入框,执行时允许用户输入Server的IP,然后实现通信,这两种方式都必须事先知道server的IP信息才行。
以上就是关于VC++如何获取本机的IP地址全部的内容,包括:VC++如何获取本机的IP地址、MFC中IP地址控件问题、MFC网络编程,想通过GetSockName函数获取某个客户端的IP地址,不知道参数怎么用等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)