【嵌入式Linux系统开发】网络编程

简介: 【嵌入式Linux系统开发】网络编程

1.基本概念

网络程序和普通程序最大的区别是,网络程序是由两个部分组成的,即客户端和服客户端的由务器端。网络程序是先服务器程序启动,等待客户端的程序运行并建立连接,一般来说,服务器的程序在一个端口上监听,直到有一个客户端的程序发来请求。

1.1 OSI模型

OSI模型是国际互联网标准化组织所定义的,目的是为了使网络的各个层次有标准。

OSI模型共7个层次:

(1)物理层:硬件连接的接口

(2)数据链路层:负责实现通信信道的无差错传输,提供数据帧、差错控制、流量控制和链路控制等功能。

(3)网络层:负责将数据正确迅速地从源主机传送到目的主机,其功能主要有寻址以及相关的流量控制和拥塞控制等。

(4)传输层:为上层处理过程掩盖下层结构的细节,保证把会话层的信息有效地传输到另一方的会话层

(5)会话层:提供服务请求者和提供者之间的通信,用以实现两端主机之间的会话管理、传输同步和活动管理等

(6)表示层:主要功能是实现信息转换

(7)应用层:为用户提供常用的应用

1.2 常用命令

  • netstat
    命令netstat用于网络的连接、路由器和接口统计等网络的信息
    常用命令:netstat -an:用于显示详细的网络状态
  • telnet
    命令telnet是用来远程控制的程序,可以用该程序来调试用户的服务端程序

1.3 网络地址

网络地址是终端在整个网络中的唯一标识,

1.4 IP设置项

  • IP地址:机器的唯一识别的网络地址
  • 网络广播地址
  • 子网掩码:用于——屏蔽IP网络的一部分、区分网络标识和主机标识、识别子网
  • 网关:用于访问外网
  • MAC地址:网卡的物理地址

1.5 端口

网络地址用来识别哪一台机器;端口用于识别一台机器的哪一个程序

端口分类:

  • 公认端口:端口号为0~1023
  • 注册端口:端口号为1024~49151
  • 动态端口:端口号为49152~65535

2.TCP/IP协议

TCP/IP:传输控制协议/因特网互联协议,又叫网络通信协议

2.1 整体架构概述

TCP/IP 实际上一个协同工作的通信家族,为网络数据通信提供通路。为讨论方便可TCP/IP 协议组大体上分为三部分:

  • Internet 协议(IP)
  • 传输控制协议(TCP)和用户数据报协议(UDP)
  • 处于 TCP 和 UDP 之上的一组应用协议。它们包括:TELNET,文件传送协议(FTP),域名服务(DNS)和简单的邮件传送程序(SMTP)等

2.2 IP协议

IP主要有以下四个主要功能:

  • 数据传送
  • 寻址
  • 路由选择
  • 数据报文的分段

IP的主要目的

为数据输入/输出网络提供基本算法,为高层协议提供无连接的传送服务。

2.3 IP构成

IP包由IP协议头与协议数据两部分构成。

2.4 TCP协议

TCP是重要的传输层协议,目的是允许数据同网络上的其他节点进行可靠的交换。它能提供端口编号的译码,以识别主机的应用程序,而且完成数据的可靠传输

TCP 协议具有严格的内装差错检验算法确保数据的完整性。

TCP 是面向字节的顺序协议,这意味着包内的每个字节被分配一个顺序编号,并分配给每包一个顺序编号。

基于TCP连接的建立

2.5 UDP协议

UDP也是传输层协议,它是无连接的,不可靠的传输服务。

当接收数据时它不向发送方提供确认信息,它不提供输入包的顺序,如果出现丢失包或重份包的情况,也不会向发送方发出差错报文。

由于它执行功能时具有较低的开销,因而执行速度比TCP快。

基于UDP协议连接的建立

3.Linux网络编程

Linux中的网络编程通过Socket(套接字)接口实现,Socket是一种文件描述符

3.1 类型

套接字socket有三种类型:

  • 流式套接字(SOCK_STREAM)

流式的套接字可以提供可靠的、面向连接的通讯流。它使用了TCP协议。TCP 保证了数据传输的正确性和顺序性

  • 数据报套接字(SOCK_DGRAM)

数据报套接字定义了一种无连接的服务,数据通过相互独立的报文进行传输,是无序的 ,并且不保证可靠,无差错,它使用数据报协议UDP。

  • 原始套接字

原始套接字允许对低层协议如IP或ICMP直接访问,主要用于新的网络协议的测试等

3.2 函数使用

进行Socket编程

常用函数:

  • socket()

创建一个socket(套接字)。

  • bind()

用于绑定IP地址和端口号到socket。

  • connect()

该函数用于绑定之后的client端,与服务器建立连接。

操作函数:

  • listen()

设置能处理的最大连接要求,Listen()并未开始接收连线,只是设置socket为listen模式。

  • accept()

用来接受socket连接。

  • Send()

发送数据

  • Recv()

接收数据

4.服务器模型

在网络程序里面,一般来说都是许多客户对应一个服务器,为了处理客户的请求, 对服务端的程序就提出了特殊的要求。目前最常用的服务器模型有:

  • 循环服务器:服务器在同一个时刻只可以响应一个客户端的请求
  • 并发服务器:服务器在同一个时刻可以响应多个客户端的请求

4.1 UDP循环服务器

UDP循环服务器的实现方法:

UDP服务器每次从套接字上读取一个客户端的请求->处理->然后将结果返回给客户机。

socket(...); 
bind(...);
while(1)
{
  recvfrom(...); 
  process(...);
  sendto(...);
}

因为UDP是非面向连接的,没有一个客户端可以老是占住服务端, 服务器对于每一个客户机的请求总是能够满足。

4.2 TCP循环服务器

TCP服务器接受一个客户端的连接,然后处理,完成了这个客户的所有请求后,断开连接。算法如下:

socket(...);
bind(...);
listen(...);
while(1)
{ 
  accept(...);
  process(...);
  close(...);
}

TCP循环服务器一次只能处理一个客户端的请求。只有在这个客户的所有请求都满足后, 服务器才可以继续后面的请求。这样如果有一个客户端占住服务器不放时,其它的客户机都不能工作了,因此,TCP服务器一般很少用循环服务器模型的。

4.3 TCP并发服务器

并发服务器的思想是每一个客户机的请求并不由服务器直接处理,而是由服务器创建一个 子进程来处理。算法如下:

socket(...);
bind(...);
listen(...);
while(1)
{
  accept(...);
  if(fork(..)==0)
  {
    process(...);
    close(...);
    exit(...);
  }
  close(...);
}

TCP并发服务器可以解决TCP循环服务器客户机独占服务器的情况。但同时也带来了问题:为了响应客户的请求,服务器要创建子进程来处理,而创建子进程是一种非常消耗资源的操作。

5.多路复用IO

1.设置要监控的文件

2.调用Select开始监控

3.判断文件是否发生变化

阻塞函数在完成其指定的任务以前不允许程序继续向下执行。

例如:当服务器运行到accept语句时,而没有客户请求连接,服务器就会停止在accept语句上等待连接请求的到来。这种情况称为阻塞(blocking)

而非阻塞操作则可以立即完成。

例如,如果你希望服务器仅仅检查是否有客户在等待连接,有就接受连接,否则就继续做其他事情,则可以通过使用select系统调用来实现。

除此之外,select还可以同时监视多个套接字 。

int select(int maxfd, fd_set *readfds, fd_set *writefds, fe_set *exceptfds, const struct timeval *timeout)
  • Maxfd: 文件描述符的范围,比待检的最大文件描述符大1
  • Readfds:被读监控的文件描述符集
  • Writefds:被写监控的文件描述符集
  • Exceptfds:被异常监控的文件描述符集
  • Timeout:定时器

系统提供了4个宏对描述符集进行操作:

#include <sys/select.h> 
void FD_SET(int fd, fd_set *fdset)
void FD_CLR(int fd, fd_set *fdset)
void FD_ZERO(fd_set *fdset)
void FD_ISSET(int fd, fd_set *fdset)

FD_SET将文件描述符fd添加到文件描述符集fdset中;

FD_CLR从文件描述符集fdset中清除文件描述符fd;

FD_ZERO清空文件描述符集fdset;

在调用select后使用FD_ISSET来检测文件描述符集fdset中的文件fd发生了变化。

实例:

FD_ZERO(&fds); //清空集合
sock1 = socket(……);
sock2 = socket(……);
bind(sock1,…);
bind(sock2,…);
listen(sock1,…);
listen(sock1,…);
FD_SET(sock1,&fds); //设置描述符
FD_SET(sock2,&fds); //设置描述符 
maxfdp=(sock1>sock2?sock1:sock2) + 1;
switch(select(maxfdp,&fds,NULL,NULL,&timeout))
  case -1: exit(-1);break; //select错误,退出程序
  case 0:break;
  default:
    if(FD_ISSET(sock1,&fds)) //测试sock1是否可读  
    accpet(sock1,…)


目录
相关文章
|
4月前
|
监控 安全 Linux
在 Linux 系统中,网络管理是重要任务。本文介绍了常用的网络命令及其适用场景
在 Linux 系统中,网络管理是重要任务。本文介绍了常用的网络命令及其适用场景,包括 ping(测试连通性)、traceroute(跟踪路由路径)、netstat(显示网络连接信息)、nmap(网络扫描)、ifconfig 和 ip(网络接口配置)。掌握这些命令有助于高效诊断和解决网络问题,保障网络稳定运行。
165 2
|
2月前
|
Linux 网络性能优化 网络安全
Linux(openwrt)下iptables+tc工具实现网络流量限速控制(QoS)
通过以上步骤,您可以在Linux(OpenWrt)系统中使用iptables和tc工具实现网络流量限速控制(QoS)。这种方法灵活且功能强大,可以帮助管理员有效管理网络带宽,确保关键业务的网络性能。希望本文能够为您提供有价值的参考。
152 28
|
2月前
|
网络协议 Unix Linux
深入解析:Linux网络配置工具ifconfig与ip命令的全面对比
虽然 `ifconfig`作为一个经典的网络配置工具,简单易用,但其功能已经不能满足现代网络配置的需求。相比之下,`ip`命令不仅功能全面,而且提供了一致且简洁的语法,适用于各种网络配置场景。因此,在实际使用中,推荐逐步过渡到 `ip`命令,以更好地适应现代网络管理需求。
61 11
|
2月前
|
Ubuntu Linux 开发者
Ubuntu20.04搭建嵌入式linux网络加载内核、设备树和根文件系统
使用上述U-Boot命令配置并启动嵌入式设备。如果配置正确,设备将通过TFTP加载内核和设备树,并通过NFS挂载根文件系统。
137 15
|
3月前
|
Ubuntu Unix Linux
Linux网络文件系统NFS:配置与管理指南
NFS 是 Linux 系统中常用的网络文件系统协议,通过配置和管理 NFS,可以实现跨网络的文件共享。本文详细介绍了 NFS 的安装、配置、管理和常见问题的解决方法,希望对您的工作有所帮助。通过正确配置和优化 NFS,可以显著提高文件共享的效率和安全性。
333 7
|
3月前
|
存储 监控 Linux
嵌入式Linux系统编程 — 5.3 times、clock函数获取进程时间
在嵌入式Linux系统编程中,`times`和 `clock`函数是获取进程时间的两个重要工具。`times`函数提供了更详细的进程和子进程时间信息,而 `clock`函数则提供了更简单的处理器时间获取方法。根据具体需求选择合适的函数,可以更有效地进行性能分析和资源管理。通过本文的介绍,希望能帮助您更好地理解和使用这两个函数,提高嵌入式系统编程的效率和效果。
138 13
|
4月前
|
域名解析 网络协议 安全
|
5月前
|
运维 监控 网络协议
|
4月前
|
存储 Ubuntu Linux
2024全网最全面及最新且最为详细的网络安全技巧 (三) 之 linux提权各类技巧 上集
在本节实验中,我们学习了 Linux 系统登录认证的过程,文件的意义,并通过做实验的方式对 Linux 系统 passwd 文件提权方法有了深入的理解。祝你在接下来的技巧课程中学习愉快,学有所获~和文件是 Linux 系统登录认证的关键文件,如果系统运维人员对shadow或shadow文件的内容或权限配置有误,则可以被利用来进行系统提权。上一章中,我们已经学习了文件的提权方法, 在本章节中,我们将学习如何利用来完成系统提权。在本节实验中,我们学习了。