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开发板。

经验分享 程序员 微信小程序 职场和发展