英特網目前有兩種地址格式:1、IPv4(32位地址格式)2、IPv6(128位地址格式)。IPv4的命名空間為PF_INET,IPv6的命名空間則為PF_INET6。
#incldue <sys/socket.h> int PF_INET int PF_INET6
Internet 命名空間下的socket地址有以下兩個組件:
1、想連接的機器的地址:有幾種表示方式,1、Internet Address Formats;2、Host Addresses;3、Host Names
2、端口號
地址和端口號都要遵循一個叫網絡字節順序的標准格式。
Internet Socket Address Formats:
#include <netinet/in.h> struct sockaddr_in { sa_family_t sin_family,//指明了使用的socket地址的地址族。在Internet中為AF_INET struct in_addr sin_addr,//主機的地址(IP地址,或者主機名) unsigned short int sin_port//端口好 } struct sockaddr_in6 { sa_family_t sin6_family, struct in6_addr sin6_addr, unint32_t sin6_flowinfo, //未實現部分。。。。。。 unit16_t sin6_port, }
Host addresses和host name:
主機地址指的就是平常所說的ip地址,比如IPv4地址128.52.46.32。IPv6地址
5f03:1200:836f:c100::1。
主機地址的數據類型:IPv4地址占32位,最好使用unit32_t類型或者struct in_addr。
IPv6占128位,使用struct in6_addr。
#include <netinet/in.h> struct in_addr { uint32_t s_addr; } uint32_t INADDR_LOOPBACK //特指地址127.0.0.1 uint32_t INADDR_ANY //代表任何接入的地址。 uint32_t INADDR_BROADCAST //廣播地址 uint32_t INADDR_NONE //標識錯誤 struct in6_addr struct in6_addr in6addr_loopback //代表Ipv6的回環地址::1 IN6ADDR_LOOPBACK_INIT //與上等同 struct in6_addr in6addr_any //IPV6常量地址'::'。表示任何接入的地址 IN6ADDR_ANY_INIT //與上等同
每台計算機都可以有一個或多個主機名,比如:www.gnu.org。
對於端口號提供了兩個宏
#include <netinet/in.h> int IPPORT_RESERVED int IPPORT_USERRESERVED
端口號小於IPPORT_RESERVED保留給特定應用程序或協議。端口號大於IPPORT_USERRESERVED用於顯示使用,系統不會自動分配。
如果你的socket未指定地址,系統會自動申請一個介於IPPORT_RESERVED和IPPORT_USERRESERVED之間的端口。