6.2 Socket编程API

6.2 Socket编程API

前面提到Socket是“打开—读/写—关闭”的模式实现,下面简单介绍一下Socket提供了哪些API供应用程序使用,以TCP协议为例,看看Unix下的Socket API,这里简单解释一下方法作用和参数。

1.Socket编程API

int Socket(int domain,int type,int protocol);

根据指定的地址族、数据类型和协议来分配一个Socket的描述字及其所用的资源。

domain:协议族,常用的有AF_INET、AF_INET6、AF_LOCAL、AF_ROUTE其中AF_INET代表使用ipv4地址。

type:Socket类型,常用的Socket类型有,SOCK_STREAM、SOCK_DGRAM、SOCK_RAW、SOCK_PACKET、SOCK_SEQPACKET等。

protocol:协议。常用的协议有,IPPROTO_TCP、IPPTOTO_UDP、IPPROTO_SCTP、IPPROTO_TIPC等。

2.把一个地址族中的特定地址赋给Socket

int bind(int sockfd,const struct sockaddr *addr,socklen_t addrlen);

sockfd:Socket描述字,也就是Socket引用

addr:要绑定给sockfd的协议地址

addrlen:地址的长度

通常服务器在启动的时候都会绑定一个众所周知的地址(如ip地址+端口号),用于提供服务,客户就可以通过它来接连服务器;而客户端就不用指定,由系统自动分配一个端口号和自身的ip地址组合。这就是为什么通常服务器端在listen之前会调用bind(),客户端就不会调用,而是在connect()时由系统随机生成一个。

3.监听Socket

int listen(int sockfd,int backlog);

sockfd:要监听的Socket描述字

backlog:相应Socket可以排队的最大连接个数

4.连接某个Socket

int connect(int sockfd,const struct sockaddr *addr,socklen_t addrlen);

sockfd:客户端的Socket描述字

addr:服务器的Socket地址

addrlen:Socket地址的长度

5.TCP服务器监听到客户端请求之后,调用accept()函数去接收请求

int accept(int sockfd,struct sockaddr *addr,socklen_t *addrlen);

sockfd:服务器的Socket描述字

addr:客户端的Socket地址

addrlen:Socket地址的长度

6.读取Socket内容

ssize_t read(int fd,void *buf,size_t count);

fd:Socket描述字

buf:缓冲区

count:缓冲区长度

7.向Socket写入内容,其实就是发送内容

ssize_t write(int fd,const void *buf,size_t count);

fd:Socket描述字

buf:缓冲区

count:缓冲区长度

int close(int fd);

Socket标记为已关闭,使相应Socket描述字的引用计数-1,当引用计数为0的时候,触发TCP客户端向服务器发送终止连接请求。