【探索Linux】P.25(网络编程套接字基本概念 —— 预备知识)

这篇具有很好参考价值的文章主要介绍了【探索Linux】P.25(网络编程套接字基本概念 —— 预备知识)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

【探索Linux】P.25(网络编程套接字基本概念 —— 预备知识),Linux,linux,网络,php

引言

在上一篇文章中,我们深入探讨了Linux网络的基础知识和它的发展历史,为读者揭开了Linux网络技术演变的序幕。我们了解到,Linux网络技术的发展不仅促进了操作系统本身的成熟,还对整个互联网的进步产生了深远的影响。随着网络技术的不断进步,Linux系统在网络通信方面的应用也变得日益重要,尤其是网络编程领域。因此,继续沿着这一主题深入,本篇文章将专注于Linux网络编程中的一个核心概念——套接字(Socket)。

通过本文的学习,读者不仅能够掌握Linux网络编程的核心技术——套接字,还能深化对Linux网络技术运作机制的理解,为后续深入研究Linux网络编程打下坚实的基础。我们期待本篇文章能为您在Linux网络编程旅程中提供有价值的指导和帮助。

一、套接字基本概念

套接字是网络软件开发中不可或缺的一部分,它为进程间通信提供了一种抽象的接口。在Linux系统中,套接字编程尤为重要,因为它是实现各种网络应用,如Web服务器、邮件服务器和文件传输等功能的基础。通过对套接字的深入理解和应用,开发人员可以设计出高效、稳定且安全的网络应用程序。

使用套接字进行网络通信的基本步骤包括创建套接字、绑定地址、监听连接(对于服务器端)、连接远程主机(对于客户端)、发送和接收数据等操作。套接字编程涉及到一系列系统调用和函数,如socket()bind()listen()connect()send()recv() 等,开发人员可以利用这些接口实现各种网络应用,下一篇文章会详细介绍相关函数。

二、源IP地址和目的IP地址

源IP地址和目的IP地址是在网络通信中非常重要的概念,顾名思义它们用于标识数据包的来源和目的地。下面将详细介绍这两个概念:

  1. 源IP地址(Source IP Address):

    • 源IP地址指的是数据包的发送方的IP地址,用于标识数据包的来源。在IPv4协议中,源IP地址由32位二进制数表示,通常以点分十进制的格式显示,如xxx.xxx.xxx.xxx。在IPv6协议中,源IP地址由128位二进制数组成。
    • 源IP地址的作用是确保接收方可以知道数据包的来源,从而能够进行响应或者建立回复连接。此外,源IP地址也被用来进行路由,帮助网络设备确定数据包的传输路径
  2. 目的IP地址(Destination IP Address):

    • 目的IP地址指的是数据包的接收方的IP地址,用于标识数据包的目的地。与源IP地址类似,目的IP地址也由32位二进制数(IPv4)或128位二进制数(IPv6)表示。
    • 目的IP地址的作用是指示网络设备将数据包传送到相应的目标主机,确保数据包能够到达正确的接收方

三、端口号

1. “端口号” 和 “进程ID”

我们之前在学习系统编程的时候, 学习了 pid 表示唯一一个进程; 此处我们的端口号也是唯一表示一个进程. 那么这两者之间是怎样的关系呢?

  1. 端口号(Port Number):

    • 端口号是网络通信中用于标识特定应用程序或服务的数字标识符。在TCP/IP协议中,端口号被分为两类:知名端口和动态端口。
    • 知名端口(Well-known Ports):指范围从0到1023的端口号,通常用于标识一些常见的网络应用和服务,如HTTP(端口号80)、FTP(端口号21)、SSH(端口号22)等
    • 动态端口(Dynamic Ports):指范围从1024到65535的端口号,用于临时分配给客户端应用程序或由操作系统自动生成。
  2. 进程ID(PID):

    • 进程ID是操作系统中用于唯一标识每个正在运行的进程的数字标识符。每个进程都有一个独一无二的进程ID,用于操作系统管理和调度进程。
    • 进程ID在操作系统中扮演着重要的角色,可以用于查找和识别特定的进程,监控进程的状态,以及进行进程间的通信和管理。

在网络通信中,端口号和进程ID常常联系在一起,因为网络通信是通过端口号来标识目标应用程序的。当应用程序启动并监听特定端口时,操作系统会为该应用程序分配一个进程ID,并将该端口与该进程关联起来,从而实现数据的发送和接收。

🚨🚨注意一个进程可以绑定多个端口号, 但是一个端口号不能被多个进程绑定

2. 源端口号和目的端口号

在本质上“源端口号和目的端口号”跟“源IP地址和目的IP地址”是相同的。源端口号(Source Port Number)和目的端口号(Destination Port Number)是在网络通信中用于标识数据包发送方和接收方应用程序或服务的端口号

  1. 源端口号

    • 源端口号是指发送数据包的应用程序或服务所使用的端口号。它是在数据包从发送方(客户端)发出时指定的。
    • 源端口号帮助接收方识别数据包的来源,并将响应数据包发送回正确的源端口。
  2. 目的端口号

    • 目的端口号是指接收数据包的应用程序或服务所监听的端口号。它是在数据包到达接收方(服务器)时用于标识目标应用程序或服务的。
    • 目的端口号帮助操作系统将接收到的数据包传递给正确的应用程序或服务。

在网络通信中,源端口号和目的端口号共同构成一个套接字(Socket),用于唯一标识一个网络连接。通过使用不同的源端口号和目的端口号,可以同时建立多个网络连接,并确保数据包能够被正确地路由到相应的应用程序或服务

⭕总的来说:传输层协议( TCPUDP )的数据段中有两个端口号, 分别叫做源端口号和目的端口号. 就是在描述 “数据是谁发的, 要发给谁”

四、网络字节序

我们已经知道,内存中的多字节数据相对于内存地址有大端和小端之分,磁盘文件中的多字节数据相对于文件中的偏移地址也有大端小端之分,网络数据流同样有大端小端之分。那么如何定义网络数据流的地址呢?

网络字节序通常采用大端序(Big-Endian)表示,即数据的高位字节存储在低地址,低位字节存储在高地址。这种字节序是网络协议规定的标准字节序,确保了在不同主机之间的数据交换时能够正确地解释数据

在网络编程中,将数据转换为网络字节序的方式是使用标准的网络字节序函数来进行转换,如htons()(Host to Network Short)、htonl()(Host to Network Long)等函数。这些函数可以确保数据在发送和接收时都按照网络字节序进行处理,从而保证不同主机之间的数据通信的正确性和可靠性。

总的来说,网络字节序是一种用于在网络通信中统一表示数据的字节顺序的规范,通过使用网络字节序,可以确保在不同主机之间的数据交换时能够正确地解释数据,避免因字节序不同而导致的数据解释错误问题。

五、sockaddr结构

1. sockaddr 结构

sockaddr 结构在网络编程中扮演着重要的角色,它用于表示各种类型的套接字地址,包括 IPv4、IPv6 和 UNIX Domain Socket 地址等。sockaddr 结构是一个通用的地址结构,通常会根据具体的协议和地址族进行类型转换为更具体的结构,例如 sockaddr_in 用于表示 IPv4 地址,sockaddr_in6 用于表示 IPv6 地址。

下面是 sockaddr 结构的定义:

struct sockaddr {
    sa_family_t sa_family;   // 地址族,如 AF_INET、AF_INET6
    char sa_data[14];        // 实际存储地址信息的地方,通常不直接使用
};

sockaddr 结构中主要包含两个字段:

  • sa_family:表示地址族,即地址的类型,可以是 AF_INET(IPv4)、AF_INET6(IPv6)等。
  • sa_data:实际存储地址信息的数组,通常不直接使用,而是通过类型转换为更具体的结构体来操作。

在实际编程中,通常会将 sockaddr 结构转换为特定协议对应的结构体,例如 sockaddr_insockaddr_in6,以便更方便地操作地址信息。

如果需要处理多种类型的套接字地址,可以使用 sockaddr 结构作为统一的表示方式,这样可以更灵活地处理不同类型的地址。

2. sockaddr_in 结构

sockaddr_in 结构是用于表示 IPv4 地址的套接字地址结构,它是在 sockaddr 结构的基础上针对 IPv4 地址进行了扩展和特化。在网络编程中,我们经常使用 sockaddr_in 结构来表示和操作 IPv4 地址信息。

下面是 sockaddr_in 结构的定义:

struct sockaddr_in {
    sa_family_t sin_family;    // 地址族,始终设置为 AF_INET
    in_port_t sin_port;        // 16 位端口号,网络字节顺序
    struct in_addr sin_addr;   // IPv4 地址
    char sin_zero[8];          // 用于填充,使该结构和 sockaddr 兼容
};

sockaddr_in 结构中,常用的字段包括:

  • sin_family:始终设置为 AF_INET,表示地址族为 IPv4。
  • sin_port:16 位端口号,存储网络字节顺序(Big-Endian)的端口号。
  • sin_addrstruct in_addr 类型,用于存储 IPv4 地址。
  • sin_zero:用于填充,使 sockaddr_in 结构和通用的 sockaddr 结构大小一致。

在实际编程中,当需要使用 IPv4 地址时,可以将 sockaddr_in 结构用于存储和传递地址信息,同时通过相关函数进行地址信息的设置和获取。

以下是一个示例,演示如何使用 sockaddr_in 结构表示 IPv4 地址:

#include <arpa/inet.h>
#include <netinet/in.h>

// 创建并初始化 sockaddr_in 结构体
struct sockaddr_in server_address;
server_address.sin_family = AF_INET;
server_address.sin_port = htons(8080); // 将端口号转换为网络字节顺序
inet_pton(AF_INET, "127.0.0.1", &server_address.sin_addr); // 设置 IPv4 地址

// 使用 server_address 结构体进行 Socket 编程操作

3. in_addr结构

in_addr 结构是用于表示 IPv4 地址的结构体,它通常作为 sockaddr_in 结构中的一个字段来存储 IPv4 地址信息。in_addr 结构定义如下:

struct in_addr {
    in_addr_t s_addr; // 存储 32 位的 IPv4 地址
};

主要字段:

  • s_addr:一个 32 位整数,用于存储 IPv4 地址,通常以网络字节顺序(Big-Endian)表示。

在进行 Socket 编程时,in_addr 结构通常与 sockaddr_in 结构一起使用,用于存储和传递 IPv4 地址信息。

以下是一个示例,演示如何使用 in_addr 结构表示 IPv4 地址:

#include <arpa/inet.h>
#include <netinet/in.h>

// 创建并初始化 in_addr 结构体
struct in_addr ipv4_address;
inet_pton(AF_INET, "127.0.0.1", &ipv4_address);

// 将 in_addr 结构体的地址设置给 sockaddr_in 结构体
struct sockaddr_in server_address;
server_address.sin_family = AF_INET;
server_address.sin_port = htons(8080);
server_address.sin_addr = ipv4_address;

// 使用 server_address 结构体进行 Socket 编程操作

4. 使用场景

不同的网络协议拥有不同的地址格式,例如IPv4和IPv6具有不同的地址结构。在使用Socket API时,需要根据不同的网络协议来使用相应的地址结构和函数进行处理。

  • 对于IPv4地址,通常使用struct sockaddr_in结构体,并且相关函数如inet_pton()用于IPv4地址的转换。

  • 而对于IPv6地址,可以使用struct sockaddr_in6结构体,并且相关函数也有所不同,比如inet_pton()可以用于IPv6地址的转换。

此外,UNIX Domain Socket(也称为本地套接字)使用文件系统路径作为地址,因此其地址格式与IPv4和IPv6不同。

因此,在实际编程中,需要根据具体的网络协议选择合适的地址结构和相应的函数来处理网络通信。这样可以确保程序能够正确地解析和处理各种网络协议的地址格式,从而实现跨网络的通信。
【探索Linux】P.25(网络编程套接字基本概念 —— 预备知识),Linux,linux,网络,php

温馨提示

感谢您对博主文章的关注与支持!如果您喜欢这篇文章,可以点赞、评论和分享给您的同学,这将对我提供巨大的鼓励和支持。另外,我计划在未来的更新中持续探讨与本文相关的内容。我会为您带来更多关于Linux以及C++编程技术问题的深入解析、应用案例和趣味玩法等。如果感兴趣的话可以关注博主的更新,不要错过任何精彩内容!

再次感谢您的支持和关注。我们期待与您建立更紧密的互动,共同探索Linux、C++、算法和编程的奥秘。祝您生活愉快,排便顺畅!
【探索Linux】P.25(网络编程套接字基本概念 —— 预备知识),Linux,linux,网络,php文章来源地址https://www.toymoban.com/news/detail-859479.html

到了这里,关于【探索Linux】P.25(网络编程套接字基本概念 —— 预备知识)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Linux网络编程】网络编程套接字二

    喜欢的点赞,收藏,关注一下把! TCP和UDP在编程接口上是非常像的,前面我们说过TCP是面向连接的,UDP我们上篇博客也写过了,我们发现UDP服务端客户端写好启动直接就发消息了没有建立连接。TCP是建立连接的,注定在写的时候肯定有写不一样的地方。具体怎么不一样,我们

    2024年04月15日
    浏览(63)
  • 【Linux网络】网络编程套接字(TCP)

    目录 地址转换函数 字符串IP转整数IP 整数IP转字符串IP 关于inet_ntoa 简单的单执行流TCP网络程序 TCP socket API 详解及封装TCP socket  服务端创建套接字  服务端绑定  服务端监听  服务端获取连接  服务端处理请求 客户端创建套接字 客户端连接服务器 客户端发起请求 服务器测试

    2024年03月21日
    浏览(71)
  • linux【网络编程】之网络套接字预备

    在【网络基础】中我们提到了IP地址,接下来了解一下网络通信中其他方面的知识 端口号是一个2字节16位的整数; 端口号用来标识一个进程, 告诉操作系统, 当前的这个数据要交给哪一个进程来处理; 一个端口号只能被一个进程占用 通信原理 (公网)IP唯一标识一台主机,这样两台

    2024年02月05日
    浏览(91)
  • 【Linux】网络编程套接字一

    上篇博客由唐僧的例子我们知道: 在IP数据包头部中,有两个IP地址,分别叫做源IP地址,和目的IP地址。 思考一下: 不考虑中间的一系列步骤,两台主机我们光有IP地址就可以完成通信了嘛? 想象一下发qq消息的例子,有了IP地址能够把消息发送到对方的机器上。 但是我们把

    2024年03月26日
    浏览(256)
  • Linux网络编程(二-套接字)

    目录 一、背景知识 1.1 端口号 1.2 网络字节序 1.3 地址转换函数  二、Socket简介 三、套接字相关的函数  3.1 socket() 3.2 bind() 3.3 connect() 3.4 listen() 3.5 accept()  3.6 read()/recv()/recvfrom() 3.7 send()/sendto()  3.8 close()  四、UPD客服/服务端实验  1.1 端口号 端口号是访问服务器的标识 ,就好像

    2024年01月22日
    浏览(92)
  • 【Linux网络编程】网络编程套接字(TCP服务器)

    作者:爱写代码的刚子 时间:2024.4.4 前言:本篇博客主要介绍TCP及其服务器编码 只介绍基于IPv4的socket网络编程,sockaddr_in中的成员struct in_addr sin_addr表示32位 的IP地址 但是我们通常用点分十进制的字符串表示IP地址,以下函数可以在字符串表示和in_addr表示之间转换 字符串转in

    2024年04月14日
    浏览(79)
  • Linux网络编程——tcp套接字

    本章Gitee仓库:tcp套接字 客户端: 客户端: 关于构造和初始化,可以直接在构造的时候,将服务器初始化,那为什么还要写到 init 初始化函数里面呢? 构造尽量简单一点,不要做一些“有风险”的操作。 tcp 是面向连接的,通信之前要建立连接,服务器处于等待连接到来的

    2024年02月20日
    浏览(57)
  • 【Linux】网络基础+UDP网络套接字编程

    只做自己喜欢做的事情,不被社会和时代裹挟着前进,是一件很奢侈的事。 1. 首先计算机是人类设计出来提高生产力的工具,而人类的文明绵延至今一定离不开人类之间互相的协作,既然人类需要协作以完成更为复杂的工作和难题,所以计算机作为人类的工具自然也一定需要

    2024年02月08日
    浏览(63)
  • 【Linux】网络---->套接字编程(TCP)

    TCP的编程流程:大致可以分为五个过程,分别是准备过程、连接建立过程、获取新连接过程、消息收发过程和断开过程。 1.准备过程:服务端和客户端需要创建各自的套接字,除此之外服务端还需要绑定自己的地址信息和进行监听。注意:服务端调用listen函数后,处理监听状

    2024年02月04日
    浏览(67)
  • 【Linux网络】网络编程套接字(预备知识+UDP)

    目录 预备知识 1. 理解源IP地址和目的IP地址 2. 理解源MAC地址和目的MAC地址 3. 认识端口号  4. 理解源端口号和目的端口号 5. 端口号(port) vs 进程pid 6. 认识TCP协议和认识UDP协议 7. 网络字节序 socket编程接口  1. socket 常见API 2. sockaddr结构  简单的UDP网络程序  1. 服务端创建udp

    2024年02月19日
    浏览(58)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包