Dotcpp  >  编程教程  >  TCP协议客户端及代码实现  >  Sockaddr_in和Sockaddr的区别

Sockaddr_in和Sockaddr的区别

点击打开在线编译器,边学边练

sockaddr和sockaddr_in都是结构体,并且它们的功能都是用来处理网络通信的地址。网络中的地址主要有3个方面的属性:

1、地址类型例如是互联网协议第四版(ipv4)和互联网协议第六版(ipv6)。

2、IP地址,主要有5类分别是A类:(1.0.0.0-126.0.0.0),地址的网络号取值于1~126之间。一般用于大型网络。

    B类:(128.0.0.0-191.255.0.0),地址的网络号取值于128~191之间。一般用于中等规模网络。

    C类:(192.0.0.0-223.255.255.0),地址的网络号取值于192~223之间。一般用于小型网络。

    D类:是多播地址,地址的网络号取值于224~239之间。一般用于多路广播用户  。

    E类:是保留地址,地址的网络号取值于240~255之间。

3、端口,它就像门牌号一样,客户端可以通过ip地址找到对应的服务器端,但是服务器端有很多端口,每个应用程序对应一个端口号,通过类似门牌号的端口号,客户端才能真正的访问到该服务器。为了对端口进行区分,将每个端口进行了编号,这就是端口号,范围是0---65535。

用于存储参与(IP)Windows套接字通信的计算机上的一个internet协议(IP)地址。为了统一地址结构的表示方法 ,统一接口函数,使得不同的地址结构可以被bind()、connect()、recv()、send()等函数调用。但一般的编程中并不直接对此数据结构进行操作,而使用另一个与之等价的数据结构sockaddr_in。这是由于Microsoft TCP/IP套接字开发人员的工具箱仅支持internet地址字段,而实际填充字段的每一部分则遵循sockaddr_in数据结构,两者大小都是16字节,所以二者之间可以进行切换。

sockaddr_in中的in就表示internet也就是网络地址的意思,它弥补了sockaddr的缺陷,把port(端口号),和addr(目标地址)分开存储在两个变量中。


总结

二者长度一样,都是16个字节,即占用的内存大小是一致的,因此可以互相转化。二者是并列结构,指向sockaddr_in结构的指针也可以指向sockaddr。

sockaddr常用于bind、connect、recv、send等函数的参数,指明地址信息,是一种通用的套接字地址。

sockaddr_in 是internet环境下套接字的地址形式。所以在网络编程中我们会对sockaddr_in结构体进行操作,使用sockaddr_in来建立所需的信息,最后使用强制类型转化就可以了。一般先把sockaddr_in变量赋值后,强制类型转换后传入用sockaddr做参数的函数:sockaddr_in用于socket定义和赋值;sockaddr用于函数参数。



本文固定URL:https://www.dotcpp.com/course/810

Dotcpp在线编译      (登录可减少运行等待时间)