今天介绍的是基于ipv4的socket网络编程,我们知道socket API是一层的抽象的网络编程接口,但各网络协议的地址却是各不相同的。
下图是sockaddr数据结构图:
ipv4和ipv6的地址格式定义在netinet/in.h中,ipv4地址用sockaddr_in结构体表示,包括16位的端口号和32位的ip地址,ipv6地址用sockaddr_in6表示,包括16位的端口号和128位的ip地址和一些控制字段。UNIX Domain Socket的地址格式定义在sys/un.h中,⽤用sockaddr_un结构体表 ⽰示。
IPv4、IPv6和UNIX Domain Socket的地 址类型分别定义为常数AF_INET、AF_INET6、AF_UNIX。所以,我们根据结构体首地址类型字段就可以确定结构体中的内容。
sockaddr_in在/usr/include/usr/include/linux/in.h里面
socket API是一套通用的接口,可以接受各种类型的sockaddr结构体指针,但是参数需为void*类型的,由于socket API早于ANSIC所以那时没有void*类型,所以我们要将函数参数转为struct sockaddr *类型。
TCP连接所用到的一些函数
1、socket函数
作用 :socket函数是一种可用于根据指定的地址族、数据类型和协议来分配一个套接口的描述字及其所用的资源的函数
参数:
domain: 一个地址描述。目前仅支持AF_xxxx格式:AF_INET代表IPv4地址
type: 新套接字的类型描述:SOCK_STREAM : 提供面向连接的稳定数据传输,即TCP协议。 SOCK_dGRAM:表示面向数据报的传输协议,即UDP协议
protocol : 套接字所用的协议。如调用者不想指定,可用0指定,表示缺省。
返回值:成功返回文件描述符,失败返回-1
2、bind
函数作用:声明sockfd所处的状态为监听状态,将套接字地址与所创建字号联系起来
参数:
af: 通信发生的区域
type: 要建立的套接字类型
procotol: 使用的特定协议
3、accept和connect