MFC网络编程,想通过GetSockName函数获取某个客户端的IP地址,不知道参数怎么用

MFC网络编程,想通过GetSockName函数获取某个客户端的IP地址,不知道参数怎么用,第1张

可以使用这个实现。

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地址和主机名等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9865664.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-02
下一篇 2023-05-02

发表评论

登录后才能评论

评论列表(0条)

保存