可以使用这个实现。
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去获取。
利用Excel进制转换函数计算IP以及掩码
计算方法内容转自: 涛声508: ip 子网数目 网络号 主机号 广播地址 可用IP地址范围
首先将/18换成为我们习惯的表示法:
111111111111111111000000000000
转为十进制就是2552551920
可以看到这个掩码的左边两节和B类 默认掩码是一致的,所以这个掩码是在B类默认掩码的范围内,意味着我们将对B类大网进行子网划分。B类掩码默类是用16位(16个0)来表示可分配的IP 地址,本题中的掩码在B类默认掩码的基础上多出了两个表示网络号的1,这就是说是将B类大网划分为(11)2进制个子网,将(11)2进制转换为十进制就 是4,所以本题中是将B类大网划分为4个子网。
将IP地址的二进制和子网掩码的二进制进行“与”(and)运算,得到的结果就是网络号。“与运算”的规则是1和1得1,0和1得0,1和0得0。
17231128255转为二进制是
10101100000111111000000011111111
掩码是:
11111111111111111100000000000000
所以:
10101100000111111000000011111111
11111111111111111100000000000000
10101100000111111000000000000000
将
10101100000111111000000000000000
转换为十进制就是172311280
所以网络号是172311280
用IP地址的二进制和(子网掩码的二进制的反码)进行“与”运算,得到的结果就是主机号。反码就是将原本是0的变为1,原本是1的变为0。
由于掩码是
11111111111111111100000000000000
所以其反码表示为
00000000000000000011111111111111
再将IP地址的二进制和掩码的反码表示法进行“与”运算:
10101100000111111000000011111111
00000000000000000011111111111111
00000000000000000000000011111111
将
00000000000000000000000011111111
转换为十进制是000255,我们将左边的0去掉,只留右边的数字,所以我们说这个IP的主机号是255。主机号是表示网络号再加上255就是这个IP地址了。
在得到网络号的基础上,将网络号右边的表示IP地址的主机部分的二进制位全部填上1,再将得到的二进制数转换为十进制数就可以得到广播地址。因为本题中
子网掩码是
11111111111111111100000000000000
网络号占了18位,所以本题中表示IP地址的主机部分的二进制位是14位,我们将网络号172311280
转换为二进制是
10101100000111111000000000000000
然后从右边数起,将14个0全部替换为1, 即:
10101100000111111011111111111111
这就是这个子网的广播地址的二进制表示法。将这个二进制广播地址转换为十进制就是17231191255
因为网络号是172311280,广播地址是17231191255,所以子网中可用的IP地址范围就是从网络号+1 到广播地址-1,所以子网中的可用IP地址范围就是从172311281-17231191254。
首先,不要管这个IP是A类还是B类还是C类,IP是哪一类对于解题是没有任何意义的,因为在很多题中B类掩码和A类或是C类网络一起出现,不要把这认为是一个错误,很多时候都是这样出题的。
其次,应该掌握以下一些知识:
可以看到:
第一行左起第一个二进制1对应十进制的128
第一行左起第二个1对应十进制的64依次类推。
上面这些关系要牢记,这是进制转换的基础!
比方说将十进制的133转为二进制,可以这样想:因为133和128比较近,又由于公式表中左起第一个二进制1表示128,所以可以马上将待转换成8 位二进制的最左边的一位确定下来,定为1。再接下来,看到133和128只相差5,而5是4与1的和,而4与1分别对应公式表中的左起第6和第8位,所以 十进制的133转换为8位二进制表示就是10000101,对应如下:
1 0 0 0 0 1 0 1 (二进制表示的133)
1280 0 0 0 4 0 1 (十进制表示的133)
其它255以内的十进制数转换为8位二进制数的方法依此类推。
今天阿驹电脑安全就给大家粗浅地说一下如何用VC++编程获取IP以及主机名。首先告诉大家,可以通过gethostname()和gethostbyname()函数来获取计算机的主机名和IP地址。两个函数的语法格式如下:gethostname()int gethostname(char FAR name, int namelen);name:表示返回主机名。namelen:表示字符串name的大小。获取IP地址的代码char computername[128];CString str;if(gethsotname(computername,128) == 0) //获得主机名{ struct hostent phost; int i=0, j, h_len=4; phost = gethostbyname(computername); m_hostname = computername; for( j=0, j0) str+=””; m_addrFormat(“%u”, (unsigned int)((unsigned char)->h_addr_list[i][j] )); str+=m_addr; }}m_ipaddress = str;UpdataData(FALSE);
function ip() {
if(getenv('>
ifconfig命令获取网卡地址,再过滤一下ip就出来了
ifconfig | grep '[0-9]\{1,3\}\[0-9]\{1,3\}\'|cut -d ":" -f2| cut -d " " -f1 | sed -n "1p"
以上就是关于MFC网络编程,想通过GetSockName函数获取某个客户端的IP地址,不知道参数怎么用全部的内容,包括:MFC网络编程,想通过GetSockName函数获取某个客户端的IP地址,不知道参数怎么用、利用Excel函数公式计算IP地址可用范围、VC++黑客编程:如何获得IP地址和主机名等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)