C++中取IP与MAC函数

ArdourCareful 2012-05-09 01:57:02
C++中有没有函数可以取得本机IP与MAC,若没有怎么用代码取得?
...全文
2531 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
Athenacle_ 2012-05-10
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 的回复:]

我用的是VC6.0 WSACleanup( )函数竟然是声明在winsock.h这个头文件中,加入winsock2.h编译错误是重新定义。汗。。。
[/Quote]
难道说VC6的winsock.h头文件没加保护宏
ArdourCareful 2012-05-10
  • 打赏
  • 举报
回复
我用的是VC6.0 WSACleanup( )函数竟然是声明在winsock.h这个头文件中,加入winsock2.h编译错误是重新定义。汗。。。
Qyee16 2012-05-10
  • 打赏
  • 举报
回复
问题一解决,谢谢各位,可问题二就奇怪了,WSACleanup( )这些函数不就是声明在winsock2.h这个头文件中吗,为什么加上这个头文件反而不能通过编译,不加却能通过呢??


不加 ,你能通过?你使用 vs的右键功能 ,“转到定义”看看,是不是找到了 winsock2.h。(不加 此 头文件 )能找到 ,说明你 间接的加入了 。不是在你当前的 文件中 。

编译不过的错误,代码,发上来,一看就知道为什么错了
ArdourCareful 2012-05-10
  • 打赏
  • 举报
回复
问题一解决,谢谢各位,可问题二就奇怪了,WSACleanup( )这些函数不就是声明在winsock2.h这个头文件中吗,为什么加上这个头文件反而不能通过编译,不加却能通过呢??
nice_cxf 2012-05-10
  • 打赏
  • 举报
回复
如果是linux系统,要先建立一个socket,然后用ioctl获取
条件编译就是了:
#ifdef WIN32
...//windows
#else
....//linux
#endif
ArdourCareful 2012-05-10
  • 打赏
  • 举报
回复
对了这个宏保护只能保护winsok.h这个头文件不被重新包含,不并是winsok2.h啊
ArdourCareful 2012-05-10
  • 打赏
  • 举报
回复
有啊#ifndef _WINSOCKAPI_
#define _WINSOCKAPI_
这不就是宏保护

可下面是加上winsok2.h后的部份错误信息因为有太多重定义信息:
error C2011: 'in_addr' : 'struct' type redefinition
c:\program files\microsoft visual studio\vc98\include\winsock2.h(368) : error C2011: 'sockaddr_in' : 'struct' type redefinition
c:\program files\microsoft visual studio\vc98\include\winsock2.h(378) : error C2011: 'WSAData' : 'struct' type redefinition
muyi66 2012-05-09
  • 打赏
  • 举报
回复
你这是和具体环境相关的程序,不可能两方都能通过编译。
ArdourCareful 2012-05-09
  • 打赏
  • 举报
回复
可问题关键是,要用在VC中写的代码放到LINUX环境下去编译生成LINUX下的动态库(.so).这样就出现了上面在VC中能通过编译,而在LINUX下不能通过的情况?有什么方法能在两种环境都通过编译呢?
W170532934 2012-05-09
  • 打赏
  • 举报
回复
C/C++标准里面是没有提供函数处理的。具体的需要去参考操作系统提供的函数以及相应的功能。
qq120848369 2012-05-09
  • 打赏
  • 举报
回复
window和linux是一个人写的吗?

另外楼主这个问题根本不是gethostname和gethostbyname能解决的,开玩笑。

应该使用ioctl的GCONF获取所有网卡名,然后使用ioctl的HADDR获取每张网卡的硬件地址。

建议你自己百度一下ioctl获取网卡列表与MAC,这在UNIX网络编程里是有详细说明与代码的。
ArdourCareful 2012-05-09
  • 打赏
  • 举报
回复
WSADATA wsaData;
char *ip;
char name[155];
PHOSTENT hostinfo;
if ( WSAStartup( MAKEWORD(2,0), &wsaData ) == 0 )
{
if( gethostname ( name, sizeof(name)) == 0)
{
if((hostinfo = gethostbyname(name)) != NULL)
{
ip = inet_ntoa (*(struct in_addr *)*hostinfo->h_addr_list);
}
}
WSACleanup( );

}
问题一:这是我在MFC中取IP的代码,在VC中能编译通过,为什么在Linux下编译不通过,显示如下错误:
wsaData was not declared in this scope
WSAStartup was not declared in this scope
WSACleanup was not declared in this scope

问题二:WSAStartup函数不是在winsock2.h头文件中,可在MFC中加上该头文件编译不通过,而不加却能通过?

patrick_880520 2012-05-09
  • 打赏
  • 举报
回复
简单的方法是通过创建管道获取command窗口中输入ip config /all后的返回字符串,然后在字符串中寻找你要的结果
rendao0563 2012-05-09
  • 打赏
  • 举报
回复

#ifdef WIN32
#pragma comment (lib,"netapi32.lib")

#define MAX_MAC_COUNT 6
#define MAX_ADAPTER_NAME_COUNT 30

static inline void GetMAC(char* mac)
{
typedef struct _ASTAT_
{
ADAPTER_STATUS adapt;
NAME_BUFFER NameBuff[MAX_ADAPTER_NAME_COUNT];
} ASTAT, * PASTAT;
ASTAT Adapter;

typedef struct _LANA_ENUM
{
UCHAR length;
UCHAR lana[MAX_LANA];
} LANA_ENUM ;
LANA_ENUM lana_enum;

NCB ncb;
int uRetCode;

memset(mac,0, MAX_MAC_COUNT);
memset( &ncb, 0, sizeof(ncb) );
memset( &lana_enum, 0, sizeof(lana_enum));

ncb.ncb_command = NCBENUM;
ncb.ncb_buffer = (unsigned char *) &lana_enum;
ncb.ncb_length = sizeof(LANA_ENUM);
uRetCode = Netbios( &ncb );
if( uRetCode != NRC_GOODRET ) return;

for( int lana=0; lana<lana_enum.length; lana++ )
{
ncb.ncb_command = NCBRESET;
ncb.ncb_lana_num = lana_enum.lana[lana];
uRetCode = Netbios( &ncb );
if( uRetCode == NRC_GOODRET ) break;
}
if( uRetCode != NRC_GOODRET ) return;

memset( &ncb, 0, sizeof(ncb) );
ncb.ncb_command = NCBASTAT;
ncb.ncb_lana_num = lana_enum.lana[0];
strcpy( (char* )ncb.ncb_callname, "*" );
ncb.ncb_buffer = (unsigned char *) &Adapter;
ncb.ncb_length = sizeof(Adapter);
uRetCode = Netbios( &ncb );
if( uRetCode != NRC_GOODRET ) return;

memcpy(mac,Adapter.adapt.adapter_address, MAX_MAC_COUNT);
}

static inline std::string GetMAC()
{
unsigned char szBuf[MAX_MAC_COUNT] = {0};
char szMac[4 * MAX_MAC_COUNT] = {0};
GetMAC((char*)szBuf);

sprintf(szMac, "%02X-%02X-%02X-%02X-%02X-%02X", szBuf[0], szBuf[1], szBuf[2], szBuf[3], szBuf[4], szBuf[5]);
return szMac;
}
#endif

static inline std::string GetIP( const std::string &strInput )
{
struct hostent *host = NULL;

if((host = gethostbyname(strInput.c_str())) == NULL)
{
return "";
}

return inet_ntoa(*((struct in_addr*)(host->h_addr)));
}



GetIP里面参数可以是域名或者机器名 记得WSAStartup
多网卡的情况自己搞定
nice_cxf 2012-05-09
  • 打赏
  • 举报
回复
gethostname取主机名
gethostbyname取到hostent的指针,然后就可以取到ip地址以及mac地址了
muyi66 2012-05-09
  • 打赏
  • 举报
回复
没有,C++与IP连一分钱关系都不存在。

64,647

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧