文章目录
一.什么是socket
socket是在应用层和传输层之间的一个抽象层,socket本质是编程接口(API),它把TCP/IP层复杂的操作抽象为几个简单的接口供应用层调用以实现进程在网络中通信。TCP/IP只是一个协议栈,必须要具体实现,同时还要提供对外的操作接口(API),这就是Socket接口
二.socket()的API函数
1.socket()函数
原型:int socket (int domain, int type, int protocol)
功能描述:
初始化创建socket对象,通常是第一个调用的socket函数。
成功时,返回非负数的socket描述符;失败是返回-1。socket描述符是一个指向内部数据结构的指针,它指向描述符表入口,socket执行体为你管理描述符表。
参数:
- domain
指明使用的协议族。常用的协议族有,AF_INET、AF_INET6、AF_LOCAL(或称AF_UNIX,Unix域socket)、AF_ROUTE等等。
协议族决定了socket的地址类型,在通信中必须采用对应的地址,如AF_INET决定了要用ipv4地址(32位的)与端口号(16位的)的组合、AF_UNIX决定了要用一个绝对路径名作为地址。
-
type – 指明socket类型,有3种:
SOCK_STREAM – TCP类型,保证数据顺序及可靠性;
SOCK_DGRAM – UDP类型,不保证数据接收的顺序,非可靠连接;
SOCK_RAW – 原始类型,允许对底层协议如IP或ICMP进行直接访问,不太常用。 -
protocol
通常赋值"0",由系统自动选择。
2.bind()函数
int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
参数:
- sockfd:即socket描述字,它是通过socket()函数创建了,唯一标识一个socket。bind()函数就是将给这个描述字绑定一
个名字。 - addrlen:对应的是地址的长度。
- addr:一个const struct sockaddr *指针,指向要绑定给sockfd的协议地址。这个地址结构根据地址创建socket时的地
址协议族的不同而不同,但最终都会强制转换后赋值给sockaddr这种类型的指针传给内核:
通用套接字 sockaddr 类型定义:
typedef unsigned short int sa_family_t;
struct sockaddr
{
sa_family_t sa_family; 2个字节
char sa_data[14];14个字节
}
ipv4对应的是sockaddr_in类型定义:
typedef unsigned short sa_family_t;
typedef uint16_t in_port_t;
struct in_addr
{
uint32_t s_addr;
};
struct sockaddr_in {
sa_family_t sin_family; 2个字节
in_port_t sin_port;2个字节
struct in_addr sin_addr; 4个字节
unsigned char sin_zero[8]; 8个字节
};
ipv6对应的sockaddr_in6类型定义:
typedef unsigned shor