如何区分本机上所有IP地址的类型,是拨号上网还是通过局域网?

clk971061 2001-07-17 04:37:20
各位大哥帮帮忙,最好给出源程序。感激涕零。
...全文
260 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
huidao11 2001-07-17
  • 打赏
  • 举报
回复
楼上的思路不错
guostong 2001-07-17
  • 打赏
  • 举报
回复
/***********************************************************
* 功能:得到本地IP地址
* 作者:独云
* Mail:lingping@236.net
***********************************************************/
#include "stdafx.h"
#include <winsock2.h>
#include <mbstring.h>
#include <Ws2tcpip.h>

//一个监听SOCKET请求队列的最大长度
#define C_QUEUE_LEN 5

//本地机NETWORK INTERFACE的最大数
#define MAXSIZE_INTERFACE_NUM 20

//点分IP地址字符串的最大长度(255.255.255.255)
#define MAXSIZE_IP_ADDRESS 15

//点分IP地址字符串的最大长度(255.255.255.255)
#define MAX_IP_ADDRESS_LENGTH 15

//点分IP地址字符串的最小长度(1.1.1.1)
#define MIN_IP_ADDRESS_LENGTH 7

#define FLAG_LOCAL_NETWORK 1 // 局域网
#define FLAG_DIALUP_NETWORK 2 // 拨号

#define FLAG_ON 1 // ON
#define FLAG_OFF 0 // OFF

#define NULL_IP_ADDRESS "0.0.0.0"
#define NULL_NETMASK "0.0.0.0"

FUNC_EXPORT BOOL GetLocalIP(short mode, unsigned char *pszIpAddress)
{
SOCKET sk;
INTERFACE_INFO InterfaceList[ MAXSIZE_INTERFACE_NUM ];
sockaddr_in * pAddress;
sockaddr_in * pMask;
unsigned long nBytesReturned;
int nNumInterfaces;
int i;
int nFound;
u_long nFlags;

pszIpAddress[ 0 ] = '\0';

sk = WSASocket( AF_INET, SOCK_DGRAM, 0, 0, 0, 0 );
if ( SOCKET_ERROR == sk ){
return false;
}

if ( WSAIoctl( sk,
SIO_GET_INTERFACE_LIST,
0,
0,
&InterfaceList,
sizeof(InterfaceList),
&nBytesReturned,
0,
0
) == SOCKET_ERROR) {
closesocket( sk );
return false;
}
closesocket( sk );

nNumInterfaces = nBytesReturned / sizeof(INTERFACE_INFO);

nFound = FLAG_OFF;

for ( i = 0; i < nNumInterfaces; i++ ) {
pAddress = (sockaddr_in*)&(InterfaceList[i].iiAddress);
pMask = (sockaddr_in*)&(InterfaceList[i].iiNetmask);
nFlags = InterfaceList[i].iiFlags;

if ( !( nFlags & IFF_UP )){
continue;
}

switch ( mode ){
case FLAG_LOCAL_NETWORK: // 局域网
if ( nFlags & IFF_POINTTOPOINT ){
break;
}
if ( nFlags & IFF_LOOPBACK ){
break;
}
if ( strcmp( inet_ntoa(pAddress->sin_addr), NULL_IP_ADDRESS ) == 0 ){
break;
}
if ( strcmp( inet_ntoa(pMask->sin_addr), NULL_NETMASK ) == 0 ){
break;
}
strcpy((char*)pszIpAddress, inet_ntoa(pAddress->sin_addr));
nFound = FLAG_ON;
break;
case FLAG_DIALUP_NETWORK: // 拨号
if ( nFlags & IFF_POINTTOPOINT ){
strcpy((char*)pszIpAddress, inet_ntoa(pAddress->sin_addr));
nFound = FLAG_ON;
}
break;
default:
return false;
break;
}

if ( FLAG_ON == nFound ){
break;
}

}

// found a valid ip address
if ( FLAG_ON == nFound ){
return true;
}
return false;
}



rediori 2001-07-17
  • 打赏
  • 举报
回复
看端口

16,551

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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