tcp编程流程:面向对象、可靠传输、面向字节流

tcp编程socket
tcp编程socket

客户端:

  • 创建套接字
  • 描述地址信息
  • 发起连接请求
  • 连接建立成功
  • 收发数据
  • 关闭

服务端:

  • 创建套接字
  • 描述地址信息
  • 开始监听
  • 接收连接请求
  • 新建套接字
  • 获取新建套接字描述符
  • 通过这个描述符与客户端通信
  • 关闭

tcp编程socket接口

1.创建套接字
int socket(int domian, int type, int protocol);

  • domian:地址域–不同的网络地址结构 AF_INET(IPv4地址域)
  • type:套接字类型–流式套接字、数据报套接字
    • 流式套接字:有序的、可靠的、双向的、基于连接的字节流传输 SOCK_STREAM
    • 数据报套接字:无连接的、不可靠的、有最大长度限制的传输 SOCK_DGRAM
  • protocol:使用的协议–不同套接字类型下的默认协议。
    流式套接字默认为tcp。数据报套接字默认是udp。
    • IPPROTO_TCP:tcp协议
    • IPPROTO_UDP:udp协议
  • 返回值:返回套接字的操作句柄–文件描述符

2.绑定地址信息
int bind(int sockfd, struct sockaddr *addr, socklen_t len);

  • sockfd:创建套接字返回的操作句柄
  • addr:要绑定的地址信息结构
  • len:地址信息的长度
  • 返回值:成功返回0。失败返回-1。

3.服务端开始监听
int listen(int sockfd, int backlog);–告诉操作系统开始接受连接请求

  • backlog:决定同一时间,服务端所能接受的客户端连接请求数量。但是这个并不能决定服务端能够接受多少客户端的个数。
    tcp编程socket

4.获取新建socket的操作句柄
从内核指定socket的pending queue中取出一个socket,返回操作句柄。
int accept(int sockfd, struct sockaddr *addr,socklen_t *len);

  • sockfd:套接监听字–指定要获取哪个pending queue中的套接字
  • addr:获取一个套接字,这个套接字与指定的客户端进行通信,通过addr获取这个客户端的地址信息
  • len:输入输出型参数–指定地址信息想要的长度以及返回实际的地址长度
  • 返回值:成功则返回新获取的套接字的描述符:操作句柄。失败返回-1。

5.通过新获取的套接字操作句柄(accept返回的描述符)与指定客户端进行通信

  • 接收数据:ssize_t recv(int sockfd, char *buf, int len, int flag);
    • 返回值:成功返回实际读取的数据长度。
      连接断开返回0。tcp连接断开也是写端被关闭的一种表现。
      读取失败返回-1。
  • 发送数据:ssize_t send(int sockfd, char *data, int len, int flag);
    • 返回值:成功返回实际发送的数据长度。
      失败返回-1。
      若连接断开,recv返回0。send会触发异常导致进程退出。

6.关闭套接字:释放资源。
int close(int fd);

7.客户端向服务端发送连接请求
int connect(int sockfd, int sockaddr *addr, socklen_t len);

  • sockfd:客户端套接字–若还未绑定地址,则操作系统会选择合适的源端地址进行绑定。
  • addr:服务端地址信息–struct sockaddr_in。这个地址信息经过connect之后也会描述到socket中
  • len:地址信息长度。

相关文章:

猜你喜欢
相关资源
相似解决方案