重头开始嵌入式第二十八天(Linux系统编程 网络通信 套接字)

目录

1.网络编程 

1.OSI(Open System Interconnection)模型即开放式系统互联通信参考模型。

TFTP(Trivial File Transfer Protocol)即简单文件传输协议。

2.  TCP/IP模型也叫网际互联模型共分为4层:也叫协议栈

3、TCP/IP协议族:

4.DNS(Domain Name System,域名系统)是互联网的一项重要服务。

4、网络基础 (A B C D E 类)

5.网络相关命令

 1.sudo vim  /etc/network/interfaces 

  2.sudo /etc/init.d/networking restart      

3.  sudo reboot

4.如有ip如:192.168.0.0

5.单机上网的配置过程:

6.netstat  -anp

7.ifconfig

6、网络接口

1、socket  套接字 

2、ip+port 地址+端口

3、网络字节序 

2.网络编程之 UDP  用户数据报

1. socket().

2.bind().

3.sendto()

4.recvfrom().

5.使用实例:


1.网络编程 

1.OSI(Open System Interconnection)模型即开放式系统互联通信参考模型。


 
一、分层结构
 
1. 物理层:负责在物理介质上传输比特流,如电缆、光纤等。
2. 数据链路层:将比特组合成帧,进行差错检测和纠正,实现介质访问控制。交换机
3. 网络层:负责数据包的路由和转发,实现不同网络之间的通信。ip,nat
4. 传输层:提供端到端的可靠数据传输服务,如 TCP 和 UDP。
5. 会话层:建立、管理和终止会话。
6. 表示层:处理数据的表示形式,如数据加密、压缩等。
7. 应用层:为用户提供各种网络应用服务,如电子邮件、网页浏览等。
 
二、作用
 
1. 标准化网络通信:使得不同厂商的设备可以相互通信。
2. 便于理解和设计网络系统:将复杂的网络通信过程分解为多个层次,每个层次负责特定的功能。
3. 促进网络技术的发展:为新的网络技术和应用提供了一个框架。
 
三、与 TCP/IP 模型的比较
 
1. OSI 模型更加理论化和全面,而 TCP/IP 模型更加实用和简洁。
2. TCP/IP 模型的应用层包含了 OSI 模型的会话层、表示层和应用层的功能。
3. TCP/IP 模型在互联网中得到了广泛的应用,而 OSI 模型更多地作为一种理论参考。

TFTP(Trivial File Transfer Protocol)即简单文件传输协议。


1. 简单:设计简单,占用资源少。
2. 基于 UDP:使用 UDP 协议进行数据传输,不提供可靠性保证。
3. 小文件传输:适用于传输较小的文件。
 
二、应用场景
 
1. 网络设备配置文件的备份和恢复。
2. 嵌入式系统中文件的传输。
3. 引导加载程序(Bootloader)获取内核等文件。
 
三、工作原理
 
1. 客户端向服务器发送文件传输请求。
2. 服务器响应请求并开始传输文件数据。
3. 数据以固定大小的数据块进行传输,直到文件传输完成。
 
由于 TFTP 不提供可靠性保证,在传输过程中可能会出现数据丢失或错误的情况。但对于一些对可靠性要求不高、需要快速传输小文件的场景,TFTP 是一种简单有效的选择。


2.  TCP/IP模型也叫网际互联模型共分为4层:也叫协议栈

TCP/IP模型是一个由多个协议构成的协议簇,它是互联网通信的基础。TCP/IP模型将网络通信分为四层,自底而上分别是:网络接口层、网络层、传输层和应用层。各层的功能如下:
 
1. 网络接口层:
- 功能:负责将数据包从源主机传输到目标主机,具体包括主机连接到物理网络所需的硬件以及传送数据的协议。这一层协议取决于所使用的物理网络,如在局域网(LAN)中通常使用以太网(802.3)协议及其变体;在广域网(WAN)中常用点对点协议(PPP)以及帧中继等协议。它将上层(网络层)的数据封装成帧,并通过物理介质(如电缆、光纤等)进行传输,同时也负责接收来自物理介质的帧,并将其解封后交给网络层处理。
- 举例:两台电脑通过网卡进行数据的发送和接收,每个网卡都有一个独特的地址即MAC地址,以太网数据以帧为单位,包括标头和数据部分,以太网在子网内以广播的形式发送数据。如果两台主机不在同一个子网,就需要通过网络层来区分主机所在的子网,若在同一子网,则用广播发送数据,否则通过路由发送,这也促使了网络层的产生。
2. 网络层:
- 功能:主要任务是处理网络上流动的数据包,规定数据包从源主机到目标主机的传输路径。它负责相邻计算机之间的通信,包括处理来自传输层的分组发送请求,将分组装入IP数据报,填充报头,选择去往信宿机的路径并将数据报发往适当的网络接口;处理输入数据报,检查其合法性并进行寻径,若数据报已到达信宿机,则去掉报头,将剩余部分交给适当的传输协议,若尚未到达信宿,则转发该数据报;还需处理路径、流控、拥塞等问题。核心协议是IP协议,它负责对数据加上IP地址和其他数据以确定传输的目标,IP数据包是不可靠的,不保证数据包按顺序发送或不被破坏。
- 举例:IP协议的数据包放在以太网数据包的数据部分,也分为标头和数据两部分。通过IP协议,可以在不同主机之间发送数据,并且引入了网络地址(即IP地址)来区分不同的主机和网络。例如,当一个数据包从源主机发送到目标主机时,网络层根据IP地址来确定数据包的路由路径,决定是将其直接发送到目标主机所在的子网内,还是通过路由器转发到其他子网。
3. 传输层:
- 功能:为应用程序间的通信提供服务。它接收应用层的数据,将其分成更小的单元(如TCP报文段或UDP数据报),并传输到网络层。主要功能包括格式化信息流和提供可靠或不可靠的传输。传输层协议规定接收端必须发回确认,若分组丢失,必须重新发送。主要协议有TCP(传输控制协议)和UDP(用户数据报协议)。
- 举例:TCP是面向连接的协议,在传输数据前要先建立连接,通过三次握手建立连接,通讯完成时要拆除连接,可提供可靠的数据流服务,采用“带重传的肯定确认”技术实现传输的可靠性,还通过“滑动窗口”方式进行流量控制,如在文件传输、电子邮件发送等场景中,需要保证数据的准确无误传输,通常会使用TCP协议;UDP是无连接的协议,不考虑流控制、错误控制,没有重传机制,也不会对分组进行顺序检查和排序,常用于分组数据较少或对实时性要求较高的场景,如视频会议、在线游戏等,这些场景中偶尔的丢包不会对整体效果产生严重影响,且对数据传输的实时性要求较高,UDP的低开销和无连接特性更适合。
4. 应用层:
- 功能:直接和应用程序接口并提供常见的网络应用服务,如电子邮件、文件传输访问、远程登录等。它是用户与网络交互的界面,将接收到的数据包按照协议解读成各种类型的数据,并将要发送的数据打包进传输层。
- 举例:常见的应用层协议有HTTP(超文本传输协议),用于浏览器和服务器之间的网页传输;FTP(文件传输协议),可实现文件在不同主机之间的传输;SMTP(简单邮件传输协议),用于发送电子邮件;DNS(域名系统),主要功能是通过用户友好的名称为用户提供域名解析服务,即将主机名域名解析为IP地址;Telnet(远程登录协议),提供在网络其他主机上注册的接口,实现远程登录功能等。


pcap 数据包捕获库


3、TCP/IP协议族:

TCP/IP 协议族是一组用于实现网络通信的协议集合。


一、主要协议 


1. IP(Internet Protocol,网际协议):
 
- 负责在网络中寻址和路由数据包。它为每个连接到网络的设备分配一个唯一的 IP 地址,使得数据包能够在不同的网络之间传输。
- IP 协议是一种无连接的协议,不保证数据包的可靠传输。
2. TCP(Transmission Control Protocol,传输控制协议):
 
- 提供可靠的、面向连接的数据流传输服务。在数据传输之前,TCP 会建立连接,确保数据的有序、无差错传输。
- 通过确认机制、重传机制和流量控制等手段保证数据的可靠性。
3. UDP(User Datagram Protocol,用户数据报协议):
 
- 是一种无连接的协议,提供快速但不可靠的数据传输服务。
- 适用于对实时性要求较高而对数据可靠性要求相对较低的应用,如视频流、音频流等。
4. ICMP(Internet Control Message Protocol,互联网控制报文协议):
 
- 用于在 IP 网络中发送控制消息,如错误报告和网络诊断信息。
- 常见的 ICMP 消息包括 ping 请求和响应,用于测试网络连接的可达性。 


二、层次结构


TCP/IP 协议族通常分为四层:
 
1. 网络接口层:
 
- 负责将数据包从源主机传输到目标主机所在的网络,具体的实现依赖于所使用的物理网络技术,如以太网、Wi-Fi 等。
2. 网络层:
 
- 主要由 IP 协议组成,负责数据包的路由和转发。
- 确定数据包从源主机到目标主机的最佳路径。
3. 传输层:
 
- TCP 和 UDP 协议工作在这一层。
- 为应用程序提供端到端的通信服务。
4. 应用层:
 
- 包含各种应用程序使用的协议,如 HTTP、FTP、SMTP 等。
- 为用户提供各种网络服务。
 
三、作用
 
1. 实现全球范围内的网络通信:TCP/IP 协议族是互联网的基础,使得不同地区、不同类型的计算机和设备能够相互通信。
2. 支持多种应用:为各种网络应用提供了统一的通信平台,如网页浏览、电子邮件、文件传输等。
3. 灵活性和可扩展性:协议族中的协议可以根据不同的需求进行定制和扩展,适应不断发展的网络技术和应用。

4.DNS(Domain Name System,域名系统)是互联网的一项重要服务。
 


一、作用
 
1. 域名解析:将易于人类记忆的域名转换为计算机可识别的 IP 地址。例如,当你在浏览器中输入“www.example.com”时,DNS 会将这个域名解析为对应的 IP 地址,以便浏览器能够与目标服务器建立连接。
2. 负载均衡:可以将域名解析到多个 IP 地址,实现流量的分发和负载均衡。这样可以提高网站的可用性和性能。
3. 别名管理:允许为一个 IP 地址设置多个别名,方便管理和使用。
 
二、工作原理
 
1. 客户端查询:当用户在浏览器中输入域名时,操作系统会首先检查本地缓存中是否有该域名的解析结果。如果没有,就会向本地 DNS 服务器发送查询请求。
2. 递归查询:本地 DNS 服务器如果在自己的缓存中也找不到解析结果,就会向根域名服务器发起查询。根域名服务器会返回顶级域名服务器的地址,本地 DNS 服务器再向顶级域名服务器查询,依次类推,直到找到目标域名的 IP 地址。
3. 迭代查询:在某些情况下,DNS 服务器之间也可以采用迭代查询的方式。即每个服务器只返回下一级服务器的地址,由客户端继续向下一级服务器查询,直到找到目标 IP 地址。
4. 缓存机制:为了提高查询效率,DNS 服务器会将查询结果缓存一段时间。当再次收到相同的查询请求时,可以直接从缓存中返回结果,而不需要再次进行查询。
 
三、DNS 记录类型
 
1. A 记录:将域名映射到一个 IPv4 地址。
2. AAAA 记录:将域名映射到一个 IPv6 地址。
3. CNAME 记录:为一个域名设置别名,指向另一个域名。
4. MX 记录:指定邮件服务器的地址,用于电子邮件的路由。
5. NS 记录:指定域名的权威名称服务器。
 
四、重要性
 
1. 方便用户访问:使用域名代替 IP 地址,使得用户更容易记住和访问网站。
2. 网络管理:帮助网络管理员更好地管理和配置网络资源。
3. 提高可用性:通过负载均衡和冗余机制,提高网站的可用性和可靠性。


DHCP
应用层: HTTP TFTP FTP SNMP DNS ...
传输层: TCP  UDP   56k猫
网络层: IP  ICMP(ping) RIP OSPF IGMP ...
物理层: ARP  RARP  ...   ip--->mac arp,,,,
 


4、网络基础 (A B C D E 类)


IP地址 == 网络位 + 主机位

IP地址的分类: 点分十进制   ipv4  712934

在网络基础中,IP地址分为A、B、C、D、E五类。
 
一、分类标准
 
IP地址是一个32位的二进制数,通常被分为四个8位的字节,以点分十进制表示。其分类主要依据IP地址的第一个字节(高8位)的值来确定。
 
1. A类地址:第一个字节的第一位固定为0,范围是1~126。
2. B类地址:第一个字节的前两位固定为10,范围是128~191。
3. C类地址:第一个字节的前三位固定为110,范围是192~223。
4. D类地址:第一个字节的前四位固定为1110,范围是224~239,用于多播地址。
5. E类地址:第一个字节的前四位固定为1111,范围是240~255,保留用于实验和将来使用。
 
二、地址范围及用途
 
1. A类地址:
- 网络地址范围较小,但每个网络可以容纳大量主机。
- 适用于大型网络,如一些国家级或大型企业的网络。
2. B类地址:
- 网络地址范围适中,每个网络可容纳的主机数量也比较可观。
- 常用于中等规模的企业或组织的网络。
3. C类地址:
- 网络地址数量较多,但每个网络能容纳的主机数量相对较少。
- 广泛应用于小型企业和家庭网络等。
4. D类地址:
- 用于多播通信,例如视频会议、在线直播等场景,将数据同时发送给多个接收者。
5. E类地址:
- 目前主要用于实验目的,尚未在实际网络中广泛应用。
 
三、子网划分
 
为了更有效地利用IP地址空间,可以对各类地址进行子网划分。通过子网掩码,可以将一个网络划分为多个子网,每个子网可以有不同的网络地址和主机地址范围。这样可以提高网络的灵活性和可管理性。
 
例如,一个C类地址192.168.1.0,可以通过子网掩码255.255.255.128划分为两个子网,分别是192.168.1.0/25和192.168.1.128/25。每个子网可以容纳126台主机。


A类: 超大规模性网络
8 8 8 8
1.0.0.0 - 126.255.255.255  126.1.1.1 
126.1.1.2
255.0.0.0    
私有:
10.0.0.0 - 10.255.255.255
127.0.0.1
B类: 大中规模型网络
128.0.0.0 - 191.255.255.255
128.2.1.2  128.2.7.2
255.255.0.0
私有:
172.16.0.0 - 172.31.255.255
C类: 中小规模型网络
192.0.0.0 - 223.255.255.255
255.255.255.0
私有:
192.168.0.0 - 192.168.255.255
静态路由
192.168.0.0
192.168.0.1  网关
192.168.0.255 
D类: 组播和广播
224.0.0.0 - 239.255.255.255
192.168.0.255 ==  255.255.255.255
235.1.2.3
192.168.1.0 
192.168.0.1   网关
192.168.1.255 广播 
E类: 实验
240.0.0.0 - 255.255.255.255
  

5.网络相关命令


 1.sudo vim  /etc/network/interfaces 

更改网络设置


  2.sudo /etc/init.d/networking restart      

重置网络设置


3.  sudo reboot

重启虚拟机


4.如有ip如:192.168.0.0


192.168.0.1  route 默认最低为路由网络
192.168.0.255 boardcast默认最高网络为广播
801.n.g 无线网络开头一般为801

5.单机上网的配置过程:


1、有网络接口并插入网线。
2、有ip地址
3、配置网络设置
ip: ifconfig ethX X.X.X.X/24 up  ifconfig ens33 192.168.0.13/24 up  255.255.255.0
网关: route add default gw x.x.x.x 
DNS:  vi /etc/resolv.conf  ==>nameserver 8.8.8.8
测试:ping www.baidu.com  


6.netstat  -anp

在 Linux 和 Windows 系统中,“netstat -anp”是一个用于查看网络连接状态的命令组合。
 
一、参数解释
 
1. “-a”:显示所有连接和监听端口。
2. “-n”:以数字形式显示地址和端口号,避免进行域名解析,加快显示速度。
3. “-p”:显示与每个连接相关的进程 ID 和进程名称。
 
二、输出内容及含义
 
1. Proto:协议类型,如 TCP、UDP 等。
2. Local Address:本地地址和端口号。对于 TCP 连接,这是本地计算机的 IP 地址和正在监听的端口号;对于 UDP,这是本地计算机的 IP 地址和正在使用的端口号。
3. Foreign Address:远程地址和端口号。对于已建立的连接,这是远程计算机的 IP 地址和连接的端口号;对于 UDP,这是最后一个发送到该端口的远程计算机的 IP 地址和端口号。
4. State:连接状态,如 LISTEN(监听)、ESTABLISHED(已建立连接)、TIME_WAIT 等。
5. PID/Program name:进程 ID 和进程名称,显示与每个连接相关的进程信息。
 
三、用途
 
1. 查看网络连接:可以了解当前系统上正在进行的网络连接情况,包括连接的协议、本地和远程地址、端口号以及连接状态。这对于排查网络问题、检测恶意软件或未经授权的连接非常有用。
2. 确定监听端口:帮助确定哪些应用程序正在监听特定的端口,以便进行配置和故障排除。
3. 查找特定进程的网络连接:通过进程 ID 可以找到特定进程的网络连接,有助于分析该进程的网络活动。

7.ifconfig

在 Linux 和类 Unix 系统中,“ifconfig”是一个用于配置和查看网络接口信息的命令。

一、主要功能

1. 查看网络接口信息:

- 显示网络接口的名称,如 eth0、wlan0 等。

- 接口的 IP 地址、子网掩码和广播地址。

- 网络接口的 MAC 地址。

- 接口的状态,如是否启用、连接状态等。

2. 配置网络接口:

- 设置 IP 地址:可以使用“ifconfig”命令为网络接口分配静态 IP 地址。例如,“ifconfig eth0 192.168.1.100 netmask 255.255.255.0”将为 eth0 接口设置 IP 地址为 192.168.1.100,子网掩码为 255.255.255.0。

- 启用或禁用接口:可以使用“ifconfig”命令启用或禁用网络接口。例如,“ifconfig eth0 up”将启用 eth0 接口,“ifconfig eth0 down”将禁用 eth0 接口。

二、使用示例

1. 查看所有网络接口信息:

- 在终端中输入“ifconfig”命令,将显示系统中所有网络接口的详细信息。

2. 查看特定网络接口信息:

- “ifconfig eth0”将只显示 eth0 网络接口的信息。

三、注意事项

1. 在现代的 Linux 系统中,“ifconfig”命令逐渐被“ip”命令所取代。“ip”命令功能更强大,提供了更多的配置选项和灵活性。

2. 使用“ifconfig”命令设置网络接口参数是临时的,系统重启后设置将丢失。要永久设置网络接口参数,需要修改网络配置文件或使用网络管理工具。


6、网络接口


1、socket  套接字 

BSD socket ==》用于网络通信的一组接口函数。socket api  application interface

Socket(套接字)是计算机网络编程中的一个重要概念。
 
一、定义与作用
 
Socket 是一种通信机制,它在网络通信中扮演着关键角色。它提供了一种在不同计算机上的进程之间进行通信的方式,使得这些进程可以像在同一台计算机上一样进行数据交换。
 
二、工作原理
 
1. 创建套接字:在进行网络通信之前,编程者需要在客户端和服务器端分别创建套接字。套接字就像是一个通信端点,它包含了 IP 地址和端口号等信息,用于确定通信的目标和方式。
2. 连接建立:客户端通过指定服务器的 IP 地址和端口号,向服务器发起连接请求。服务器端的套接字处于监听状态,等待客户端的连接请求。一旦接收到请求,服务器端会接受连接,并建立起一个通信通道。
3. 数据传输:连接建立后,客户端和服务器端可以通过套接字进行双向的数据传输。数据可以以字节流的形式在套接字之间发送和接收。
4. 连接关闭:通信完成后,客户端和服务器端可以关闭套接字,释放资源。
 
三、类型
 
1. 流式套接字(SOCK_STREAM):提供面向连接的、可靠的数据传输服务,类似于电话系统。数据在传输过程中不会丢失、重复或乱序,适用于对数据可靠性要求较高的应用,如文件传输、电子邮件等。
2. 数据报套接字(SOCK_DGRAM):提供无连接的、不可靠的数据传输服务,类似于邮政系统。数据以独立的数据包形式发送,可能会丢失、重复或乱序,适用于对实时性要求较高而对数据可靠性要求相对较低的应用,如视频流、音频流等。
 
四、应用场景
 
1. 网络编程:是实现网络应用程序的基础,如 Web 服务器、邮件客户端、即时通讯软件等。
2. 分布式系统:在分布式系统中,不同节点之间的通信通常也使用套接字来实现。
3. 物联网:在物联网设备之间的通信中,套接字也发挥着重要作用。


2、ip+port 地址+端口

     地址用来识别主机
     端口用来识别应用程序

  port分为TCP port / UDP port  范围都是: 1-65535
  约定1000 以内的端口为系统使用。
http 80   www.baidu.com
3306
telnet 21 
ssh 22


3、网络字节序 

大端存储
12 00   小端   0x12345678
00 12
192.168.0.12
12.0.168.192

00 12
数字转换函数:
#include <arpa/inet.h>
1236234687
主机转网络:uint32_t htonl(uint32_t hostlong);
ipv4 192.168.0.1 1~65535
uint16_t htons(uint16_t hostshort);
网络转主机:host to net 
net to host 
uint32_t ntohl(uint32_t netlong);
uint16_t ntohs(uint16_t netshort);

字符串转换函数:
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
主机转网络:in_a ddr_t inet_addr(const char *cp);
inet_addr("192.168.1.20");
cli.sin_addr
网络转主机:char *inet_ntoa(struct in_addr in);

client, server 
browser
b/s  http   
p2p   peer   

........


2.网络编程之 UDP  用户数据报


1、特性: 无链接  不可靠  大数据   
2、框架: C/S模式 
   server:socket() ===>bind()===>recvfrom()===>close()
   client:socket() ===>bind()===>sendto() ===>close()

注意:socket()的参数需要调整。

1. socket().

socket(PF_INET,SOCK_DGRAM,0);

在计算机网络编程中, socket() 函数是用于创建套接字的系统调用。
 
一、函数原型
 
在 C 和 C++等编程语言中, socket() 函数的原型通常如下:
 
int socket(int domain, int type, int protocol);
 
 
二、参数解释
 
1.  domain (地址族):
- 决定了套接字使用的地址格式。常见的取值有:
-  AF_INET :表示 IPv4 地址族。这是最常用的地址族,用于互联网通信。
-  AF_INET6 :表示 IPv6 地址族。随着 IPv6 的逐渐普及,这个地址族也越来越重要。
-  AF_UNIX :用于同一台计算机上的进程间通信,使用 Unix 域套接字。
2.  type (套接字类型):
- 确定套接字的通信方式。常见的取值有:
-  SOCK_STREAM :流式套接字,提供面向连接的、可靠的数据传输服务,类似于电话系统。
-  SOCK_DGRAM :数据报套接字,提供无连接的、不可靠的数据传输服务,类似于邮政系统。
3.  protocol (协议):
- 通常设置为 0,表示让系统根据地址族和套接字类型自动选择合适的协议。例如,在  AF_INET  和  SOCK_STREAM  的组合下,系统通常会选择 TCP 协议;在  AF_INET  和  SOCK_DGRAM  的组合下,系统通常会选择 UDP 协议。
 
三、返回值
 
如果函数调用成功,它将返回一个非负整数,这个整数被称为套接字描述符,用于后续对套接字的操作。如果函数调用失败,它将返回 -1,并设置  errno  变量以指示错误原因。

2.bind().


  bind() 客户端是可选的,服务器端是比选的。
 

在计算机网络编程中, bind() 函数用于将一个套接字与特定的地址和端口号进行绑定。
 
一、函数原型
 
在 C 和 C++等编程语言中, bind() 函数的原型通常如下:
int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
 
 
二、参数说明
 
1.  sockfd :这是由 socket() 函数返回的套接字描述符,表示要进行绑定的套接字。
2.  addr :这是一个指向特定地址结构的指针,该结构根据套接字的地址族而定。例如,对于 IPv4 地址族( AF_INET ),这个结构是 struct sockaddr_in ;对于 IPv6 地址族( AF_INET6 ),这个结构是 struct sockaddr_in6 ;对于 Unix 域套接字( AF_UNIX ),这个结构是 struct sockaddr_un 。这个地址结构包含了要绑定的 IP 地址和端口号等信息。
3.  addrlen :这是地址结构的长度,表示 addr 参数所指向的地址结构的大小。
 
三、返回值
 
如果函数调用成功,它将返回 0。如果函数调用失败,它将返回 -1,并设置 errno 变量以指示错误原因。
 
四、作用及意义
 
1. 确定套接字的通信端点:通过将套接字与特定的地址和端口号进行绑定,确定了该套接字在网络中的通信端点。这样,其他程序可以通过这个地址和端口号与该套接字进行通信。
2. 区分不同的服务:在一台计算机上可能同时运行多个网络服务,每个服务都可以通过绑定不同的端口号来进行区分。例如,Web 服务器通常绑定到端口 80,邮件服务器通常绑定到端口 25 等。
3. 限制通信范围:对于某些网络服务,可能只希望在特定的 IP 地址上进行监听,或者只希望在本地网络中进行通信。通过选择合适的地址进行绑定,可以实现这些限制。
 
五、错误处理
 
如果 bind() 函数返回 -1,表示发生了错误。你可以通过检查 errno 变量来确定错误原因。常见的错误原因包括:
 
1.  EADDRINUSE :指定的地址和端口号已经被其他套接字占用。
2.  EINVAL :地址结构中的某些参数无效,例如端口号超出范围。
3.  EACCES :没有足够的权限进行绑定。
 
你可以使用 perror() 函数或 strerror() 函数来打印错误信息,以便更好地理解错误原因。例如:
 

3.sendto()

在计算机网络编程中, sendto() 函数用于在无连接的数据报套接字上发送数据。
 
一、函数原型
 
在 C 和 C++等编程语言中, sendto() 函数的原型通常如下:
 
ssize_t sendto(int sockfd, const void *buf, size_t len, int flags, const struct sockaddr *dest_addr, socklen_t addrlen);
 
 
二、参数说明
 
1.  sockfd :这是由 socket() 函数返回的套接字描述符,表示要发送数据的套接字。
2.  buf :这是一个指向要发送数据的缓冲区的指针。
3.  len :这是要发送数据的长度。
4.  flags :这是一个标志参数,可以设置为 0 或者一些特定的标志,如 MSG_DONTWAIT 表示非阻塞发送等。
5.  dest_addr :这是一个指向目标地址结构的指针,该结构根据套接字的地址族而定。对于 IPv4 地址族( AF_INET ),这个结构是 struct sockaddr_in ;对于 IPv6 地址族( AF_INET6 ),这个结构是 struct sockaddr_in6 。这个地址结构包含了数据要发送到的目标 IP 地址和端口号等信息。
6.  addrlen :这是目标地址结构的长度,表示 dest_addr 参数所指向的地址结构的大小。
 
三、返回值
 
如果函数调用成功,它将返回实际发送的字节数。如果函数调用失败,它将返回 -1,并设置 errno 变量以指示错误原因。
 
四、作用及意义
 
1. 无连接通信: sendto() 函数适用于无连接的数据报套接字(如使用 SOCK_DGRAM 类型创建的套接字)。在这种通信方式下,发送方不需要先建立连接就可以直接向目标地址发送数据。
2. 确定目标地址:通过指定目标地址结构,发送方可以明确数据要发送到的目的地。这使得在无连接的通信中,数据可以被发送到不同的目标地址。
3. 灵活性: sendto() 函数提供了一些标志参数,可以根据不同的需求进行灵活的配置,如非阻塞发送等。

功能:用于UDP协议中向对方发送数据。


4.recvfrom().


功能:用于UDP协议中获取对方发送的数据。
参数:sockfd 本地的套接字id
  buff   要存储数据的内存区,一般是数组或者动态内存。
  len    要获取的数据长度,一般是buff的大小。
  flags  获取方式,0 阻塞
  src_addr 可选,表示对方的地址信息结构体,
   如果为NULL,表示不关心对方地址。
  addrlen  对方地址信息结构体大小。
   如果对方地址是NULL,则该值也为NULL。
返回值:成功 接收到的数据长度
失败  -1;
在计算机网络编程中, recvfrom() 函数用于在无连接的数据报套接字上接收数据。

一、函数原型
在 C 和 C++等编程语言中, recvfrom() 函数的原型通常如下:
ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags, struct sockaddr *src_addr, socklen_t *addrlen);
二、参数说明
1.  sockfd :这是由 socket() 函数返回的套接字描述符,表示要接收数据的套接字。
2.  buf :这是一个指向接收数据缓冲区的指针。
3.  len :这是接收数据缓冲区的长度。
4.  flags :这是一个标志参数,可以设置为 0 或者一些特定的标志,如 MSG_DONTWAIT 表示非阻塞接收等。
5.  src_addr :这是一个指向源地址结构的指针,该结构根据套接字的地址族而定。对于 IPv4 地址族( AF_INET ),这个结构是 struct sockaddr_in ;对于 IPv6 地址族( AF_INET6 ),这个结构是 struct sockaddr_in6 。这个地址结构将存储发送数据的源 IP 地址和端口号等信息。如果不关心为NULL
6.  addrlen :这是一个指向 socklen_t 类型变量的指针,用于传入源地址结构的长度,在函数返回时,该变量将被更新为实际存储的源地址结构的长度。
三、返回值
如果函数调用成功,它将返回实际接收到的字节数。如果函数调用失败,它将返回 -1,并设置 errno 变量以指示错误原因。
四、作用及意义
1. 无连接通信接收: recvfrom() 函数适用于无连接的数据报套接字(如使用 SOCK_DGRAM 类型创建的套接字)。在这种通信方式下,接收方可以直接从套接字接收数据,而不需要事先建立连接。
2. 获取发送方信息:通过 src_addr 和 addrlen 参数,接收方可以获取发送数据的源 IP 地址和端口号等信息,这对于需要响应不同发送方或者进行特定处理非常有用。
3. 灵活性:和 sendto() 类似, recvfrom() 函数也提供了标志参数,可以根据不同的需求进行灵活的配置,如非阻塞接收等。

5.使用实例:

服务端:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <arpa/inet.h>
#include <time.h>
typedef struct sockaddr * (SA);
int main(int argc, char *argv[])
{
    int sockfd  =socket(AF_INET,SOCK_DGRAM ,0);
    if(-1 == sockfd)
    {
        perror("socket");
        return 1;

    }
    //set ip port  man 7 ip 
    struct sockaddr_in server,client;
    bzero(&server,sizeof(server));
    bzero(&client,sizeof(client));
    server.sin_family  = AF_INET;
    server.sin_port  = htons(50000);// >50000 host to net short 
    server.sin_addr.s_addr = inet_addr("192.168.203.128");
    int ret = bind(sockfd,(SA) &server,sizeof(server));
    if(-1 == ret)
    {
        perror("bind");
        exit(1);
    }
    while(1)
    {
        char buf[1024]={0};
        socklen_t len = sizeof(client);
        recvfrom(sockfd,buf,sizeof(buf),0,(SA)&client,&len);
        time_t tm;
        time(&tm);
        sprintf(buf,"%s %s",buf,ctime(&tm));
        sendto(sockfd,buf,strlen(buf),0,(SA)&client,sizeof(client));
    }
    return 0;
}

用户端:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <arpa/inet.h>
#include <time.h>
typedef struct sockaddr * (SA);
int main(int argc, char *argv[])
{
    int sockfd  =socket(AF_INET,SOCK_DGRAM ,0);
    if(-1 == sockfd)
    {
        perror("socket");
        return 1;

    }
    //set ip port  man 7 ip 
    struct sockaddr_in server;
    bzero(&server,sizeof(server));
    server.sin_family  = AF_INET;
    server.sin_port  = htons(50000);// >50000 host to net short 
    server.sin_addr.s_addr = inet_addr("192.168.203.128");
    
    while(1)
    {
        char buf[1024]="hello,this udp test";
        sendto(sockfd,buf,strlen(buf),0,(SA)&server,sizeof(server));
        bzero(buf,sizeof(buf));
        recvfrom(sockfd,buf,sizeof(buf),0,NULL,NULL);
        printf("server:%s",buf);
        fflush(stdout);
        sleep(1);
    }
    return 0;
}

  • 14
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值