linux C/C++套接字通信 TCP粘包

socket编程概述

  • windows和linux平台的套接字函数几乎一样,但是windows中使用socket通信之前需要先加载套接字库,最后在释放这些套接字资源,linux中就不需要夹在和释放了
  • 基于客户端和服务器实现一个并发的通信模型,网络通信中客户端与服务器的比例是n比1,由于客户端过多,就需要客户端多线程并发处理请求,多线程可以换成线程池

6 字节序

  • 小端是主机字节序,数据的低位字节放在低位地址高位字节放在高位地址,不符合人类认知。
  • 大端是网络字节序,数据的低位字节放在高位地址高位字节放在低位地址
  • 套接字通信过程中操作的数据都是大端存储的,包括:接收/发送的数据、IP地址、端口。

9

10 socket 和 bind 函数

本机套接字通信指定int socket(int domain, int type, int protocol)中的参数domainAF_UNIX/AF_LOCAL

11 listen

int listen(int sockfd, int backlog)backlog参数在内核中指定的是128,backlog指的是服务器一次性可以处理多少个客户端请求,而不是说服务器最多可以建立的连接请求

12 和客户端建立连接的accept函数

int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen)中sockfd是第服务端用来监听的fd,而其返回值是用来通信的fd,accept会在没有客户端发起请求连接的时候阻塞,accept一般放在一个循环中,每循环一次就可以和对应的客户端建立连接

13 connect

connect会自动分配端口去绑定fd,因为服务器不会去主动连接客户端

16 fd在套接字通信中的作用

服务端存在多个用于通信的fd,而用于监听的fd只有一个。在进行socket通信的时候,每一个fd对应与内核中的两块内存Read BufferWrite Buffer
![](https://img2022.cnblogs.com/blog/1743182/202204/1743182-202204
30153732159-2003708390.png)

24 线程池实现并发服务器

TCP 粘包

解决方法:

  • 基于标准的应用层协议(http, https)来封装不定长的数据包
  • 在每个数据包的尾部添加特俗字符,接收端如果遇到特殊字符,代表数据接收完毕。但是效率低,因为需要在每接收一个字符就对其做判断,效率低
  • 在数据包的前面添加包头,数据由两部分组成:数据头 + 数据块。
    • 数据头:存储当前数据包的总字节数,接收端先接收数据头,然后再根据接收头接收对应大小的字节
    • 数据块:存储实际内容

参考

b站视频

posted @ 2022-04-16 14:43  抿了抿嘴丶  阅读(314)  评论(0)    收藏  举报