网络编程套接字 | 预备知识

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

在之后的文章中我们将来讲解网络编程中的相关知识点,再本文中我们首先来讲解一下网络编程中的预备知识:

预备知识

源IP地址和目的IP地址

在IP数据包中有两个IP地址分别是源IP地址和目的IP地址,此时这里就会出现一个问题就是:如果我们光有IP地址,是无法完成通信的。有了IP地址只能够将消息发送到对方的机器上,但是还徐亚欧有一个其他的标识位来进行区分,这个数据需要发送给哪一个程序进行解析。

端口号

端口号是(port)是传输层协议的内容

  • 端口号是一个2字节16位的整数;
  • 端口号用来标识一个进程,告诉操作系统,当前的这个数据要交给哪一个进程来处理;
  • IP地址 + 端口号能够标识网络上的某一台主机的某一个进程;
  • 一个端口号只能被一个进程占用。
    需要注意的是:一个进程可以绑定多个端口号,但是一个端口号不能被多个进程绑定

理解端口号和进程ID

之前我们在学习系统编程的时候,学习过在Linux中pid可以表示一个进程;此处在网络编程中端口号也表示唯一的一个进程,那么这两者有什么关系?对于此处的理解在我看来就是:我们使用的操作系统有很多,那么就意味着每一个操作系统都有着自己的进程ID的处理方式,但是网络在目前只有一个,所有的操作系统都需要接入这个网络,有了端口号就可以让网络在各个操作系统上都可以正常的运行,不用让网络来对操作系统进行适配,同时可以让网络与操作系统进行解耦。

认识TCP协议和UDP协议

在此处我们简单直观的了解一下TCP协议和UDP协议,后面我们再对其进行详细的学习。

TCP协议

  • 传输层协议
  • 有连接
  • 可靠传输
  • 面向字节流

UDP协议

  • 传输层协议
  • 无连接
  • 不可靠传输
  • 面向数据报

网络字节序

在之前学习C语言的时候,我们遇到过一个问题就是:计算机内存中的多字节序对于内存地址有大段和小段之分,磁盘文件中的多字节数据相对于文件中的偏移地址也有大段小段之分。对于网络数据流来说同样有着大段小段之分。

  • 发送主机通常将发送缓冲区的数据按照内存地址从低到高的顺序发出
  • 接受主机把网络上接收到的字节依次保存在接受缓冲区中,也是按照内存地址从低到高的顺序保存
  • 因此网络数据流的地址应该这样规定:先发出的数据是低地址,后发出的数据是高地址
  • TCP/IP协议规定,网络数据流应采用大端字节序,即低地址高字节
  • 不管这台主机是大端机还是小端机,都会按照这个TCP/IP规定的网络字节序来发送/接收数据;如果当前发送主机是小端,就需要将数据转成大端;否则就忽略,直接发送即可。
    例子:将0x1234abcd写入到以0x0000开始的内存中,则结果为:
big-endian little-endian
0x0000 0x12 0xcd
0x0001 0x34 0xab
0x0002 0xab 0x34
0x0003 0xcd 0x12
为了使网络程序具有可移植性,使同样的C代码在大端和小端计算机上编译后都能正常运行,可以调用一下的库函数做网络字节序和主机字节序的转换。
#include <arpa/inet.h>
uint32_t htonl(uint32_t hostlong);
uint16_t htons(uint16_t hostshort);
uint32_t ntohl(uint32_t netlong);
uint16_t ntohs(uint16_t netshort);
// 这几个函数名都比较好记: h表示host, n表示network, l表示32为长整数, s表示16为短整数
// htonl 表示将32位的长整数从主机字节序转换成网络字节序,例如将IP地址转化后准备发送
// 如果主机是小段字节序,这些函数将参数做相应的大小端转换然后返回
// 如果主机是大段字节序,这些函数将不做转换,将参数原封不动的返回

socket 常见API

// 创建 socket 文件描述符 (TCP/UDP, 客户端 + 服务器)
int socket(int domain, int type, int protocol);
// 绑定端口号 (TCP/UDP, 服务器)
int bind(int socket, const struct sockaddr *address,
socklen_t address_len);
// 开始监听socket (TCP, 服务器)
int listen(int socket, int backlog);
// 接收请求 (TCP, 服务器)
int accept(int socket, struct sockaddr* address,
socklen_t* address_len);
// 建立连接 (TCP, 客户端)
int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);

在上述的API中我们都可以看到一个类型 – struct sockaddr结构
socket API是一层抽象的网络编程接口,适用于各种底层网络协议,如IPv4、 IPv6。然而, 各种网络协议的地址格式并不相同。
struct sockaddr和struct sockaddr_in这两个结构体用来处理网络通信的地址。

  • IPv4和IPv6的地址格式定义在netinet/in.h中,IPv4地址用sockaddr_in结构体表示,包括16位地址类型, 16位端口号和32位IP地址
  • IPv4、 IPv6地址类型分别定义为常数AF_INET、 AF_INET6. 这样,只要取得某种sockaddr结构体的首地址,不需要知道具体是哪种类型的sockaddr结构体,就可以根据地址类型字段确定结构体中的内容
  • socket API可以都用struct sockaddr *类型表示, 在使用的时候需要强制转化成sockaddr_in; 这样的好处是程序的通用性, 可以接收IPv4, IPv6, 以及UNIX Domain Socket各种类型的sockaddr结构体指针做为参数;
    网络编程套接字 | 预备知识,Linux,网络,开发语言,c++

sockaddr结构

/* Structure describing a generic socket address.  */
struct sockaddr
  {
    __SOCKADDR_COMMON (sa_);	/* Common data: address family and length.  */
    char sa_data[14];		/* Address data.  */
  };

虽然socket api的接口是sockaddr,但是我们真正在基于IPv4编程时,使用的结构是sockaddr_in,这个结构体中主要有三部分信息:地址类型,端口号,IP地址

sockaddr_in

/* Structure describing an Internet socket address.  */
struct sockaddr_in
  {
    __SOCKADDR_COMMON (sin_);
    in_port_t sin_port;			/* Port number.  */
    struct in_addr sin_addr;		/* Internet address.  */

    /* Pad to size of `struct sockaddr'.  */
    unsigned char sin_zero[sizeof (struct sockaddr) -
			   __SOCKADDR_COMMON_SIZE -
			   sizeof (in_port_t) -
			   sizeof (struct in_addr)];
  };
// ----------------------------------------------------------------- 
// __SOCKADDR_COMMON (sin_);的定义如下:
/* 
#define	__SOCKADDR_COMMON(sa_prefix) \
  sa_family_t sa_prefix##family
  
sa_prefix##family 是一个预处理宏中的宏替换语法。它的作用是将两个标识符合并成一个单词,并用于创建结构体的字段名。在这个语法中:
sa_prefix 是一个标识符(通常是一个结构体字段的前缀),它是宏的一个参数。
## 是预处理器中的连接运算符,用于将两个标识符连接在一起,形成一个新的标识符。
family 是另一个标识符(通常是表示套接字地址族的字段名称),它在这里与 sa_prefix 合并。

// Type to represent a port.
typedef uint16_t in_port_t;

// Internet address.
typedef uint32_t in_addr_t;
struct in_addr
  {
    in_addr_t s_addr;
  };
*/

后面的文章中我们将开始使用UDP协议、TCP协议等来进行代码的编写。文章来源地址https://www.toymoban.com/news/detail-697730.html

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

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

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

相关文章

  • C++网络编程 TCP套接字基础知识,利用TCP套接字实现客户端-服务端通信

    流式套接字编程针对TCP协议通信,即是面向对象的通信,分为服务端和客户端两部分。 1)加载套接字库( 使用函数WSAStartup() ),创建套接字( 使用socket() ) 2)绑定套接字到一个IP地址和一个端口上( 使用函数bind() ) 3)将套接字设置为监听模式等待连接请求( 使用函数

    2024年02月03日
    浏览(60)
  • 【网络】socket——预备知识 | 套接字 | UDP网络通信

    🐱作者:一只大喵咪1201 🐱专栏:《网络》 🔥格言: 你只管努力,剩下的交给时间! 在前面本喵对网络的整体轮廓做了一个大概的介绍,比如分层,协议等等内容,现在我们直接进入socket(套接字)编程,先来感受到网络编程。 我们知道,在网络通信中,存在两套地址,一

    2024年02月13日
    浏览(54)
  • 网络编程套接字 | UDP套接字

    前面的文章中我们叙述了网络编程套接字的一些预备知识点,从本文开始我们就将开始UDP套接字的编写。本文中的服务端与客户端都是在阿里云的云服务器进行编写与测试的。 在v1的版本中我们先来使用一下前面讲过得一些接口,简单的构建一个udp服务器: 然后运行上述的程

    2024年02月09日
    浏览(100)
  • 【网络】网络编程套接字

    目录 一、预备知识 1、网络通信理解 2、源IP地址和目的IP地址 3、端口号 二、网络字节序 三、socket编程接口 1、socket常见API 2、sockaddr结构 3、sockaddr结构体 3.1、sockaddr结构体 3.2、sockaddr_in结构体 四、简单的UDP网络程序 1、创建套接字接口 2、绑定端口号 3、服务器运行 4、创建

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

    端口号(port)是传输层协议的内容. 端口号是一个2字节16位的整数; 端口号用来标识一个进程, 告诉操作系统, 当前的这个数据要交给哪一个进程来处理; IP地址 + 端口号能够标识网络上的某一台主机的某一个进程; 一个端口号只能被一个进程占用. 既然端口号是用来标识一个进程,

    2024年02月12日
    浏览(122)
  • 网络编程2(套接字编程)

    套接字编程:如何编写一个网络通信程序 1.网络通信的数据中都会包含一个完整的五元组: sip,sport,dip,dport,protocol(源IP,源端口,对端IP,对端端口,协议) 五元组完整的描述了数据从哪来,到哪去,用什么数据格式 2.网络通信–两个主机进程之间的通信:客户端服务

    2023年04月09日
    浏览(54)
  • 【网络】网络编程套接字(一)

    在前面我们说过可以使用IP地址来标识一台主机,但是我们光有IP地址就可以完成通信了嘛? 答案是:不可以,当我们的主机接收到了数据以后还要确定这个数据是发送给哪一个进程的,两台主机的两个软件进行网络通信时,我们还需要有一个其他的标识来区分出这个数据要给

    2024年02月06日
    浏览(58)
  • 【JavaEE】网络编程之TCP套接字、UDP套接字

    目录 1.网络编程的基本概念 1.1为什么需要网络编程  1.2服务端与用户端 1.3网络编程五元组  1.4套接字的概念 2.UDP套接字编程 2.1UDP套接字的特点  2.2UDP套接字API 2.2.1DatagramSocket类 2.2.2DatagramPacket类  2.2.3基于UDP的回显程序 2.2.4基于UDP的单词查询  3.TCP套接字编程 3.1TCP套接字的特

    2023年04月20日
    浏览(75)
  • 【JaveEE】网络编程之TCP套接字、UDP套接字

    目录 1.网络编程的基本概念 1.1为什么需要网络编程  1.2服务端与用户端 1.3网络编程五元组  1.4套接字的概念 2.UDP套接字编程 2.1UDP套接字的特点  2.2UDP套接字API 2.2.1DatagramSocket类 2.2.2DatagramPacket类  2.2.3基于UDP的回显程序 2.2.4基于UDP的单词查询  3.TCP套接字编程 3.1TCP套接字的特

    2023年04月13日
    浏览(169)
  • 【Linux网络编程】网络编程套接字二

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

    2024年04月15日
    浏览(64)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包