目录
一、网络协议
OSI七层协议模型
应用层:用户能够看见的内容
表示层:对数据进行加密、解析
会话层:建立通信节点
传输层:实现点对点的通信
网络层:路由寻址
数据链路层:将数据封装成对应的帧格式,纠错、流控
物理层:屏蔽硬件差异
TCP/IP四层协议模型
应用层:HTTP(超文件传输协议)、FTP(文件传输协议)、NSF(网络挂载协议)、SSH(远程登录协议)
传输层:TCP协议、UDP协议
网络层:IP协议,ICMP协议、IGMP协议(组播、广播)
物理与网络接口层:以太网协议、ARP协议(IP -->MAC)、RARP协议(MAC --> IP)、PPP
二、客户端和服务器的创建步骤
以下图片是通过打电话的例子来说明客户端和服务器的创建步骤
三、socket编程预备知识
1、端口号 -- port
一个端口对应一个进程
本质上是一个 unsigned short类型的数据
取值范围: 0 ~ 65535
0:不能使用
1~1023:系统端口,一般不使用
1024~5000:常用的应用程序接口
5001~65535:用户可以使用的端口
3、套接字 -- socket
本质是一个特殊的按顺序分配的最小的文件描述符;
4、字节序
数据在内存存储的方式
大端序(网络字节序):高位的数据存放在低位
小端序(主机字节序):高位的数据存放在高位
字节序转换 -- 在给端口号赋值时,需要将端口号先转换成网络字节序再赋值
字节序转换相关函数:
htons(port) -- 将主机字节序转换为网络字节序
ntohs(port) -- 将网络字节序转换为主机字节序
四、网络编程相关接口函数
1、创建套接字 -- socket
#include <sys/types.h>
#include <sys/socket.h>
int socket(int domain, int type, int protocol);
参数:
domain: 地址族 //每一个不同的协议,地址结构不同
AF_UNIX: 域套接字
AF_INET: IPV4协议 //PF_INET
AF_INET6:IPV6协议
type:套接字类型
SOCK_STREAM:流式套接字 -- 唯一对应tcp通信
SOCK_GDRAM:数据报套接字 -- 唯一对应udp通信
protocol:
默认值填0;
返回值:
成功返回套接字,失败返回-1;
2、绑定ip地址和端口号 -- bind
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/ip.h>
int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
参数:
sockfd:socket创建得到的套接字
addr:
服务器的地址结构首地址
addrlen:
服务器地址结构的大小
返回值:
成功返回0,失败返回-1;
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 */
};
struct in_addr {
uint32_t s_addr; /* address in network byte order */
};
s_addr才是绑定ip地址的变量
例:
struct sockaddr_in saddr;
saddr.sin_family = AF_INET; //ipv4协议
saddr.sin_port = 8888; //设置端口号为8888
saddr.sin_addr.s_addr = inet_addr("192.168.7.220"); //将点分十进制的地址转换为整型再赋值
3、设置监听套接字 -- listen
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
int listen(int sockfd, int backlog);
参数:
sockfd:套接字
backlog:客户端连接的最大等待队列长度
返回值:成功返回0,失败返回-1;
4、等待客户端连接 -- accpet
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
参数:
sockfd:socket创建得到的套接字
addr:
客户端的地址结构首地址
addrlen:
客户端地址结构的长度的首地址
返回值:
成功返回一个新的套接字(读写套接字),该套接字用于服务器的数据读写,失败返回-1
5、向服务器发起连接 -- connect
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
参数:
sockfd:套接字
addr:
服务器的地址结构的首地址
addrlen:
服务器地址结构的大小
返回值:
成功返回0,失败返回-1;