UNIX网络通信
一、网络协议
国际标准化组织(ISO)定义了网络协议的基本框架,被称为OSI模型。OSI模型包括应用层、表示层、会话层、传输层、网络层、数据链路层及物理层。而OSI模型过于复杂至今没有得到实际的应用。
TCP/IP协议模型将OSI的7层协议模型简化为4层,从而更有利于实现和使用。TCP/IP协议模型包括应用层、传输层、网络层、网络接口层。
TCP/IP协议与OSI模型的对应关系如下图:
二、套接字socket
它是一种可以进行网络通信的内核对象,它有一个唯一的标识符,一般称它为socket描述符,跟文件描述符类似,也可以用read/wrote/close操作。
int socket(int domain, int type, int protocol);/*
功能:创建socket对象
domain:通信地址类型
AF_UNIX / AF_LOCAL :本地进程间通信
AF_INET :使用ipv4地址通信
AF_INET6:使用ipv6地址通信
type:
SOCK_STREAM :数据流协议,TCP面向连接的通信协议
优点:安全可靠,数据不丢失,但速度慢。
一般常用于安全性较高的场景
SOCK_DGRAM :数据报协议,UDP面向无连接的通信协议
优点:速度快,数据可能会丢失,安全性和可靠性于TCP相比不高
一般用于安全性要求不高,但对速度有要求的场景。
protocol:特殊协议一般不使用,直接写 0*/
准备通信地址:
基本通信地址
struct sockaddr
{
sa_family_t sa_family;
char sa_data[14];
}
本地通信地址
struct sockaddr_un
{
// 通信地址类型
sun_family_t sun_family;
// socket文件的路径
char sun_path[100];
}
网络通信地址
struct sockaddr_in
{
//通信地址类型
short int sin_family;
//端口号
in_port_t sin_port;
//ip地址
struct in_addr sin_addr;
}
准备好的通信地址通常要将其强制转换成基本通信地址才能传给函数使用。
int bind(int sockfd, const struct sockaddr *addr,socklen_t addrlen);
//功能:把socket对象与通信地址建立联系 int connect(int sockfd, const struct sockaddr *addr,socklen_t addrlen);
//功能:连接通信目标
//socketaddr:目标地址
三、网络通信的数据存储方式
个人计算机系统数据的存储方式可能是大端,也可能是小端,网络通信时需要的是大端数据,必须把数据转换成大端。
uint32_t htonl(uint32_t hostlong);
//功能:把32位的主机字节序转换成32位的网络字节序 uint16_t htons(uint16_t hostshort);
//功能:把16位的主机字节序转换成16位的网络字节序 uint32_t ntohl(uint32_t netlong);
//功能:把32为网络字节序转换成32位的主机字节序 uint16_t ntohs(uint16_t netshort);
//功能:把16为网络字节序转换成16位的主机字节序
生成端口号
端口号就是一个16为的无符号整数
uint16_t htons(uint16_t hostshort);
生成ip地址
in_addr_t inet_addr(const char *cp);
//功能:把点分十进制的字符串ip地址转换成32位的无符号整数 char *inet_ntoa(struct in_addr in);
//功能:把32位的网络字节序的ip地址转换成点分十进制的字符串ip地址
四、网络通信(UDP)
进程A:创建socket对象->准备地址->绑定->接收数据和来时的地址->原路返回数据->关闭socket
进程B:创建socket对象->准备地址->向目标发送数据->接收数据->关闭socket
当socket对象被全部关闭后,会在内核中停留一段时间(给一个重新连接的机会),如果再使用同样的ip地址和端口号时就会失败(延时关闭)
ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,struct sockaddr *src_addr, socklen_t *addrlen);
//功能:接收数据并获取发送端的地址
//addrlen:是参数,要得到的src_addr的长度 ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,const struct sockaddr *dest_addr, socklen_t addrlen);
//功能:发送数据到指定的目标
五、网络通信(TCP)
面向连接的网络通信,在通信过程中时刻保持连接,这种通信方式类似与打电话,能保证安全可靠、数据不丢失,但与UDP相比传输速度略低。
进程A:创建socket->准备地址->绑定->监听(设置队列长度)->等待连接->通信->关闭。
进程B;创建socket->准备地址->连接->通信->关闭
int listen(int sockfd, int backlog);
//功能:设置socket对象最大的排队数量 int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
//功能:等待其他主机与当前socket建立连接关系。
//返回值:建立连接的描述符,此后通信都用此描述符 int connect(int sockfd, const struct sockaddr *addr,socklen_t addrlen);
//功能:连接通信目标
//socketaddr:目标地址 ssize_t recv(int sockfd, void *buf, size_t len, int flags);
//功能:网络通信专用的数据接收
//flag: 0 阻塞
// 1 不阻塞
//返回值:-1 时,说明连接断开,此时应该结束循环 ssize_t send(int sockfd, const void *buf, size_t len, int flags);
//功能:网络通信专用的数据发送
//返回值:-1 时,说明连接断开 ,此时应该结束循环
最新文章
- WeakHashMap 理解笔记
- log4j 应用
- IIS 之 打开/关闭 Internet 信息服务
- 学习C++ Primer 的个人理解(十二)
- 第一次用Github desktop(mac)提交代码遇到的问题
- Mysql 中和同to_char 一样用法的函数
- MongoVUE简单操作手册
- 解析处理常用json数据总结
- 常用排序算法的python实现和性能分析
- jquery中当CheckBoxList被选中时提示
- java笔记---- 获取外网(公网)的ip地址
- 基于Ubuntu的ESP32平台搭建
- elasticsearch外网访问设置
- MAC MYSQ忘记密码重置方法
- css中元素border属性的构成以及配合属性值transparent可得到一些特殊形状1.0
- 【转】Winform程序未捕获异常解决方法 EventType clr20r3 P1
- 2017-2018-2 20165228 实验二《Java面向对象程序设计》实验报告
- 【VSC】git+github/码云+VSCode
- Spring与web MVC的整合——Spring的应用上下文管理
- TensorFlow函数(三)tf.variable_scope() 和 tf.name_scope()
热门文章
- flush logs时做的操作
- Regionals 2014 >;>; Asia - Taichung 7003 - A Balance Game on Trees 树形DP + 二维费用背包
- SPOJ 3267: DQUERY 树状数组,离线算法
- awk 分解行、字段
- Python3基础(3)集合、文件操作、字符转编码、函数、全局/局部变量、递归、函数式编程、高阶函数
- Java中的Enum(枚举)用法介绍
- MongoDB Linux 安装配置 后台运行
- IE6下float双边距问题
- HttpClient向后端的WebAPI工程发送HTTP的Post请求时,返回超过了最大请求长度的异常的解决方法
- 面向对象(OOP)三