网络套接字TCP/IP
OSI七层协议:
应用层
表示层
会话层
网络层
传输层
数据链路层
物理层
TCP/IP四层协议:
应用层
传输层
网络层
网络接口层
服务端流程:
1.创建套接字文件
int socket(int domain, int type, int protocol);
domain:协议域即协议族(IP协议):AF_INET - IPV4协议
Type:套接字类型: 流式 socket(SOCK_STREAM)---tcp
Protocol:传输层协议,直接给0,当protocol(协议)为0时,会自动根据套接字类型来选传输层协议
2.绑定三要素:协议族、ip地址、端口号
int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
struct sockaddr_in {// man 7 ip才能看到
sa_family_t sin_family; /* address family地址族:我们这里用的是 AF_INET */
in_port_t sin_port; /* port in network byte order 16bit端口号*/ --- htons();
struct in_addr sin_addr; /* internet address 32bitIP地址*/ inet_addr()
};
struct in_addr {
In_addr_t s_addr; //32bit IPv4地址
}
3.设置监听数
int listen(int sockfd, int backlog);
4.等待连接
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
5.接收与发送
ssize_t send(int sockfd, const void *buf, size_t len, int flags);
ssize_t recv(int sockfd, void *buf, size_t len, int flags);
6.关闭套接字文件
close(sockfd)
客户端流程:
1.创建套接字文件
2.绑定三要素:协议族、ip地址、端口号(绑定服务端的)
3.请求连接
int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
4.接收与发送
ssize_t send(int sockfd, const void *buf, size_t len, int flags);
ssize_t recv(int sockfd, void *buf, size_t len, int flags);
5.关闭套接字文件
close(fd)