linux应用开发基础8-网络通信
8.1 网络通信概述
在一般的网络书籍中,网络协议被分为5层,如下图所示:
应用层:它是体系结构中的最高层,直接为用户的应用进程(例如电子邮件、文件传输和终端仿真)提供服务。在因特网中的应用层协议很多,如支持万维网应用的HTTP协议,支持电子邮件的SMTP协议,支持文件传送的FTP协议,DNS,SNMP等等。
运输层:负责向两个主机中进程之间的通信提供服务。
运输层主要使用以下两种协议:
(1) 传输控制协议TCP(Transmission Control Protocol):面向连接的,数据传输的单位是报文段,能够提供可靠的交付。
(2) 用户数据包协议UDP(User Datagram Protocol):无连接的,数据传输的单位是用户数据报,不保证提供可靠的交付,只能提供“尽最大努力交付”。
网络层:负责将被称为数据包(datagram)的网络层分组从一台主机移动到另一台主机。
链路层:因特网的网络层通过源和目的地之间的一系列路由器路由数据报。
物理层:在物理层上所传数据的单位是比特。物理层的任务就是透明地传送比特流。
这本文我们只需要知道:我们需要使用“运输层”编写应用程序,我们的应用程序位于“应用层”。
使用“运输层”时,可以选择TCP协议,也可以选择UDP协议。
使用串口进行打印调试信息这一方法,容易导致一些问题,如测试程序和最终版本差距过大。因此考虑网络通信,我们知道数据传输的三要素是:源,目的,长度。
服务器:被动的响应请求,不断循环监测端口。
客户端:主动的发起请求。
TCP协议:可靠,可重传,有连接
UDP协议:不可靠,无连接
在文件的读写中,我们一般使用下面三个函数:fd = open(“文件名”);read(fd,buf,len);write(fd,buf,len);
在网络通信中怎么表示源,目的呢?
所以,在网络传输中需要使用“IP和端口”来表示源或目的。
在tcp传输中,服务器程序中使用fd = socket()函数,通过man 查询可知,
#include <sys/types.h> /* See NOTES */ #include <sys/socket.h>
int socket(int domain, int type, int protocol); 观察可以发现,socket函数不涉及传输的三要素。
bind(自己的ip,端口,)把fd和IP,端口绑定起来,
listen(启动监测数据);accept(建立一条连接);send ()发送数据;recv ()接收数据;
在客户端程序中也使用 fd = socket( );connect(目的,)建立连接;同样send ()发送数据;recv ()接收数据;
8.2 TCP编程和UDP编程
此处暂时省略
本文主要参考:嵌入式Linux应用开发完全手册V4.0_韦东山全系列视频文档-IMX6ULL开发板。