目录
[套接字 socket --> int socket(int domain, int type, int protocol); #include #include](#include #include)
[连接 connect --> int connect(int sockfd, const struct sockaddr *addr,socklen_t addrlen);](#连接 connect --> int connect(int sockfd, const struct sockaddr *addr,socklen_t addrlen);)
[bind --> int bind(int sockfd, const struct sockaddr *addr,socklen_t addrlen);](#bind --> int bind(int sockfd, const struct sockaddr *addr,socklen_t addrlen);)
[listen --> int listen(int sockfd, int backlog);](#listen --> int listen(int sockfd, int backlog);)
[accept --> int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);](#accept --> int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);)
网络基本知识
网络 ------ 解决不同主机间进程的通信
IP地址 ------ 用于标识网络中的一台主机
端口号 ------ 找到该主机上的一个进程
IP地址组成:网络号 + 主机号
- 网络号:标识属于哪一个网络
- 主机号:标识该网络中某一台主机
IP表示方式:IP地址的本质实际上是一个32位的数值,由于人不方便记忆于是出现了**"点分十进制"**
[0~255]. [0~255].[0~255].[0~255]

IPV6是128位,由于IPV4不够用了才出现的
端口号:用来标识一个进程,是16位的数据
分类:1
以OSI为例
物理层:主要定义物理设备标准,主要作用是传输比特流
数据链路层:提供错误检测和纠正,确保数据的可靠传输,定义了如何让格式化数据以帧的形式
网络层(路由器):在位于不同地理位置的网络中的两个主机系统中提供链接
传输层:主要是将从下层接受的数据分段传输,到达目的地址后再进行重组,传输的是数据段
会话层:通过浏览器和爱奇艺服务器建议了一个会话
表示层:加密------解密
应用层:键盘输入了一个数据hello
协议:一套规定彼此双方的规范

编程:
Linux内核应用程序想要用到内核中网络功能(网络协议栈------发挥着网络的功能)
编程接口:socket:套接字
被当作一个特殊的文件来看,操作时当文件来看,获得对应的fd(描述符/字)
基于两个传输层的协议:TCP/UDP
TCP(可靠):连接、可靠、字节流
- 面向连接:在进行通信之前,必须建立好一条逻辑上的通路
- 提供可靠传输(四个"无")
- 无丢失:依靠每个字节编号来丢失重传
- 无失序:编号,重新排列
- 无差错:校验重传
- 无重复:丢弃
应用:①对可靠性要求高的场合②QQ,微信登陆
建立连接:TCP的三次握手 --- 目的是建立连接

UDP(不可靠):无连接,不可靠,数据报
- 不提供可靠传输
- 在数据发送时,不需要建立连接
优势:效率高,实时性好
应用:①对速度和实时性要求高的②广播、组播③无线网的传输
TCP网络编程:
模型
- cs client ---- server
- bs browser ---- server
- p2p peer -- to -- peer(点对点)
cs编程
套接字 socket --> int socket(int domain, int type, int protocol); #include <sys/types.h> #include <sys/socket.h>
功能:创建通信的一端
参数:
@domain:通信的范围
- AF_UNIX 本地通信
- AF_INET IPV4
- AF_TNET6 IPV6
@type:socket的类型
- SOCK_STREAM //流式套接字
- SOCK_DGRAM //用户数据报
@prtocol:表示前面类型对应的具体协议
- SOCK_STREAM ---默认走的协议是TCP
- SOCK_DGRAM --- 默认走的协议是UDP
- 填0表示走默认协议
返回值:成功 返回socket对应的文件描述符
eg:基于TCP协议的socket
int fd = socket(AF_INET,SOCK_STREAM,0);

连接 connect --> int connect(int sockfd, const struct sockaddr *addr,socklen_t addrlen);
功能:发起连接请求
参数:
@sockfd:客户端的socket文件描述符
@addr:代表服务器端的地址信息
@addrlen:addr对应的地址结构体类型的大小
返回值:成功 0 失败 -1 && errno
IPV4地址结构体
struct sockaddr_in {
sa_family_t sin_family; /* address family: AF_INET */ --- 代表通信范围 in_port_t sin_port; /* port in network byte order */ --- 网络字节序格式的端口号 struct in_addr sin_addr; /* internet address */ --- ip地址
}; /* Internet address. */
struct in_addr {
uint32_t s_addr; /* address in network byte order */ //uint32_t --unsigned int --- ip地址 --- 网络字节序 };
bind --> int bind(int sockfd, const struct sockaddr *addr,socklen_t addrlen);

listen --> int listen(int sockfd, int backlog);

accept --> int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
accept 是个阻塞操作 ------ 如果请求连接队列中为空,则会阻塞等待









