关于局域网内IP的有关问题,请大家帮忙回答一下
关于局域网内IP的问题,请大家帮忙回答一下
我在检索局域网内所有活动主机的时候,IP的检索用的是以下这个代码
WSADATA wsaData;
if (WSAStartup(MAKEWORD( 1,1 ), &wsaData)) return FALSE;
CString hostaddr = _T( " ");
struct hostent *host = gethostbyname(hostname);
sockaddr_in sa;
for (int nAdapter = 0; host != NULL && host-> h_addr_list[nAdapter]; nAdapter++)
{
memcpy ( &sa.sin_addr.s_addr, host-> h_addr_list[nAdapter], host-> h_length);
}
hostaddr = inet_ntoa(sa.sin_addr);
WSACleanup();
}
但是结果有时候是192.x.x.x,有的时候却是202.x.x.x的,192的那个是可以connect成功的,但202的不行的,我怎么才能得到正确有结果呢?
------解决方案--------------------
MARK
------解决方案--------------------
请问你得到的是不是同一个工作组内的计算机啊?
我做了个类似的只是能得到工作组内的计算机!
------解决方案--------------------
如果都是windows系统的话,可以connect 到 139端口,判断是活动.
要不然,发个ARP包也行.
------解决方案--------------------
根据hostname得到了202开头的ip地址,是不是和你的dns解析器配置有关?如果要得到局域网的ip地址,局域网之内有dns服务器吗?你得到的ip地址很可能是你的公网中的dns服务器返回给你的;
最好根据自己机器的ip地址和子网掩码,算出自己机器所处的网络地址,然后给该网络地址下的所有主机发送arp请求包,如果有回复,就说明该机器存活
我在检索局域网内所有活动主机的时候,IP的检索用的是以下这个代码
WSADATA wsaData;
if (WSAStartup(MAKEWORD( 1,1 ), &wsaData)) return FALSE;
CString hostaddr = _T( " ");
struct hostent *host = gethostbyname(hostname);
sockaddr_in sa;
for (int nAdapter = 0; host != NULL && host-> h_addr_list[nAdapter]; nAdapter++)
{
memcpy ( &sa.sin_addr.s_addr, host-> h_addr_list[nAdapter], host-> h_length);
}
hostaddr = inet_ntoa(sa.sin_addr);
WSACleanup();
}
但是结果有时候是192.x.x.x,有的时候却是202.x.x.x的,192的那个是可以connect成功的,但202的不行的,我怎么才能得到正确有结果呢?
------解决方案--------------------
MARK
------解决方案--------------------
请问你得到的是不是同一个工作组内的计算机啊?
我做了个类似的只是能得到工作组内的计算机!
------解决方案--------------------
如果都是windows系统的话,可以connect 到 139端口,判断是活动.
要不然,发个ARP包也行.
------解决方案--------------------
根据hostname得到了202开头的ip地址,是不是和你的dns解析器配置有关?如果要得到局域网的ip地址,局域网之内有dns服务器吗?你得到的ip地址很可能是你的公网中的dns服务器返回给你的;
最好根据自己机器的ip地址和子网掩码,算出自己机器所处的网络地址,然后给该网络地址下的所有主机发送arp请求包,如果有回复,就说明该机器存活