socket又叫做套接字,网络编程又叫做套接字编程。而socket地址也称为套接字地址,可以理解为计算机的网络地址。
1.理解socket地址
假设小明同学想给女神打电话需要知道对方的电话号码才能继续沟通,而我们进行网络通信也需要知道对方的socket地址。 电话号码以北京地区为例,如010-82512345,有两部分组成,3位区号,8位号码,3-8组合。区号用于标示这在北京,号码用于标示北京具体哪个电话机。
而在网络通信中,采用类似方法标示socket地址。 socket地址最关键的两部分为:(ip,port),即IP地址和port端口号,比如一个网络地址为192.168.130.55:8000, 该ip地址用于区分计算机,而端口号8000用于区分不同的套接字。
2.通用socket地址
socket地址用一个结构体标示,sockaddr头文件以及结构如下:
#include <bits/socket.h>
struct sockaddr
{
sa_family_t sa_family;/*地址族类型,本教程使用AF_INET,代表TCP/IPv4协议族/
char sa_data[14]; /*14字节,存放socket地址值,ip地址和端口号*/
};
sockaddr是通用socket地址,但一般不直接用这个结构体,因为用的会蛋疼,14字节地址还得自己填充,自己填充ip地址和端口号会很麻烦,一般使用sockaddr_in结构体。但是很多网络编程API的参数是通用地址结构struct sockaddr,使用这些API的时候将sockaddr_in进行类型强制转换为sockaddr即可。
3.专用socket地址
sockaddr_in头文件以及结构如下:
#include <bits/socket.h>
struct sockaddr_in
{
sa_family_t int sin_family; /* 地址族,同sockaddr */
unsigned short int sin_port; /* 2字节端口号,网络字节序表示 */
struct in_addr sin_addr; /* 4字节IP地址,见下,网络字节序表示 */
unsigned char sin_zero[8]; /* 8字节,未使用 */
};
struct in_addr
{
u_int32_t s_addr; /* 4字节即32位IPv4地址,网络字节序表示 */
}
如上所示,最大的变化是将14字节拆分 为2字节(端口号)+ 4字节(ip地址)+ 8字节(空闲未使用,保证sockaddr_in和sockaddr内存对齐),这样进行拆分后,极大的方便了用户的使用。