1.创建套接字
#include <sys/types.h>
#include <sys/socket.h>
int sockfd = socket(int demain, int type, int protocal);
domain参数告诉系统使用哪个底族协议,IPV4为AF_INET,IPV6为AF_INET6。
type参数指定服务类型,主要有SOCK_STREAM(流服务),SOCK_UGRAM(数据报)
protocal一般设置为0,采用该族下的默认协议
2.命名套接字
int bind(int sockfd, const struct sockaddr *addr, socket_t len);
struct socketaddr_in
{
sa_family_t sin_family;//AF_INET
u_int16_t sin_potr;//端口号,用网络字节序表示
struct in_addr sin_addr;//IPv4地址结构体
};
struct in_addr
{
u_int32_t s_addr;//IPv4地址,用网络字节序表示
};
该函数给套接字描述符绑定一个地址,只用命名后才知道该如何连接它。服务器端要绑定地址,用于提供服务,客户端可以用它连接服务器,客户端调用connect时,系统自动分配socket地址。
3.监听套接字
int listen(int sockfd, int backlog);
创建监听队列以存放待处理的客户端连接。backlog是完成三次握手的连接socket队列的上限,典型值为5。处于半连接状态的socket的上限由内核参数定义。
4.接受连接
int connect_fd = int accept(int sockfd, struct sockaddr *addr, socket_t len);
accept从完成连接的队列中取socket,当accept成功返回时,返回的socket唯一的标识了被接收的这个连接,服务器通过读写这个connect_fd与客户端通信。
5.发起连接
int connect(int sockfd,const struct sockaddr* addr,socket_t len);
connect成功时返回0,一旦返回成功,socket就唯一的标识了这个连接,客户端通过读写这个socket与服务器端通信。
6.关闭连接
int close(int sockfd);
close系统调用并非立即关闭一个连接,而是将sockfd的引用计数-1。只有当引用计数减为0时,才真正关闭连接。