首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

【专业技术】linux下socket编程

当应用程序要创建一个套接字时,操作系统就返回一个小整数作为描述符,应用程序则使用这个描述符来引用该套接字需要I/O请求的应用程序请求操作系统打开一个文件。...下图显示,操作系统如何把文件描述符实现为一个指针数组,这些指针指向内部数据结构。 ? 对于每个程序系统都有一张单独的表。精确地讲,系统为每个运行的进程维护一张单独的文件描述符表。...操作系统把该描述符作为索引访问进程描述符表,通过指针找到保存该文件所有的信息的数据结构。 针对套接字的系统数据结构: 1)、套接字API里有个函数socket,它就是用来创建一个套接字。...这个地址结构根据地址创建socket时的地址协议族的不同而不同,如ipv4对应的是: struct sockaddr_in { sa_family_t sin_family; /* address...网络字节序与主机字节序 主机字节序就是我们平常说的大端和小端模式:不同的CPU有不同的字节序类型,这些字节序是指整数在内存中保存的顺序,这个叫做主机序。

1.6K60

【Rust学习】10_定义枚举

为此,Rust允许我们将这些可能性编码为枚举。定义枚举让我们看看我们可能想在代码中表达的情况,看看为什么在这种情况下 enum 比structs 有用且更合适。假设我们需要使用 IP 地址。...目前,IP 地址使用两个主要标准:IPv4 和 IPv6。因为这些是我们的程序会遇到的 IP 地址的唯一可能性,所以我们可以 枚举 所有可能的值,这就是枚举名称的由来。...任何 IP 地址都可以是 IPv4 或IPv6 地址,但不能同时是两者。IP 地址的这个特性使得枚举数据结构非常适合这个场景,因为枚举值只可能是其中一个成员。...Move 包含一个匿名结构体。Write 包含单独一个 String。ChangeColor 包含三个 i32。...,我们就不能像上面定义的 Message 枚举那样简单地定义一个函数来接收这些类型的消息,因为枚举是单独一个类型。

7610
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    什么是socket?

    Socket编程进行的是端到端的通信,基于网络层和传输层的实现。在网络层,Socket 函数需要指定到底是 IPv4 还是IPv6。传输层需要指定是tcp还是udp。...中某些有数据可读的时候,我们希望通知更加精细一点,就是我们希望能够从通知中得到有可读事件的fds列表,而不是需要遍历整个fds来收集。...当epoll_ctl添加一个socket时,会向红黑树中加入一个节点,它的结构中保存着epoll对象,同时该节点也会指向一个文件结构,关联着被通知的socket fds。...为了做到只遍历就绪的fd,我们需要有个地方来组织那些已经就绪的fd。...不需要同时插入到多路复用的socket集合的所有睡眠队列中,相反process只是插入到中间层的epoll的单独睡眠队列中,process睡眠在epoll的单独队列上,等待事件的发生。

    1.2K20

    linux下Socket编程(一)简介

    当应用程序要创建一个套接字时,操作系统就返回一个小整数作为描述符,应用程序则使用这个描述符来引用该套接字需要I/O请求的应用程序请求操作系统打开一个文件。...下图显示,操作系统如何把文件描述符实现为一个指针数组,这些指针指向内部数据结构。 对于每个程序系统都有一张单独的表。精确地讲,系统为每个运行的进程维护一张单独的文件描述符表。...该调用通过传递进来的文件描述符找到对应的socket结构,把一个地址族中的特定地址赋给socket,也可以说是绑定ip端口和socket。...addr:一个const struct sockaddr *指针,指向要绑定给sockfd的协议地址。这个地址结构根据地址创建socket时的地址协议族的不同而不同。...连接套接字socketfd_new 并没有占用新的端口与客户端通信,依然使用的是与监听套接字socketfd一样的端口号,此时我们需要区分两种套接字 connect connect函数的第一个参数即为客户端的

    3.6K23

    【Linux】: Socket 编程

    总的来说,就是如果当前发送主机是小端, 就需要先将数据转成大端;否则就忽略, 直接发送即可 注意事项 发送主机通常将发送缓冲区中的数据按内存地址从低到高的顺序发出 接收主机把从网络上接收到的字节依次保存在接收缓冲区中...由于不同的通信方式(跨网络或本地通信)有不同的地址格式,套接字使用不同的结构体来封装地址信息: sockaddr_in:用于跨网络通信(例如通过 IP 和端口号进行通信)。...为了解决这些不同地址格式的兼容性问题,套接字提供了一个通用的地址结构体 sockaddr,用于统一处理不同的地址结构。...6.3 IPV4 和 IPV6 的地址表示 IPV4 和 IPV6 的地址格式定义在 netinet/in.h 中,IPv4 地址用 sockaddr_in 结构体表示,包括16位地址类型, 16位端口号和...这样只要取得某种 ​​​​​​​sockaddr 结构体的首地址,不需要知道具体是哪种类型的sockaddr结构体,就可以根据地址类型字段确定结构体中的内容 socket API 可以都用 stsockaddr

    13910

    TCPIP网络编程-前三章学习笔记

    不用多说, 即是我们的socket函数返回的文件描述符 2. myaddr 参数 我们看到他是一个 sockaddr 结构体的指针类型。...char sa_data[14]; //地址信息 }; 在sa_data一个成员里,包含了ip、port的地址信息, 这样写起来很麻烦, 所以有了新的结构体 sockaddr_in...}; 结构体 sockaddr_in 的成员分析 成员 sin_family 地址族 含义 AF_INET IPv4互联网使用的地址族 AF_INET6 IPv6互联网使用的地址族 AF_LOCAL...INADDR_ANY 会自动获取当前服务器的IP 我们看到使用到了 htonl、htons 函数,构造IP地址和端口 为什么构造结构体地址时候使用了 htonl、htons对IP、端口进行了转换 首先我们来看下这几个函数的含义...但是我们的主机使用的是哪种字节序取决于CPU,不同的CPU型号有不同的选择。 当我们两台计算机是需要网络通信时, 规范统一约定为大端序进行通讯处理.

    76820

    TKE 容器网络中的 ARP Overflow 问题探究及其解决之道

    我们知道,对于 TCP/IP 网络包发送时,网络栈需要对端的 MAC 地址才能让网络包转换成二层的数据结构——帧,从而在网络中传输。...进一步探究 垃圾回收阈值是按命名空间级别生效还是子机级别生效 我们知道,每个独立的网络命名空间是有完整的网络协议栈的。那么,ARP 缓存的垃圾回收也是每个命名空间单独处理的吗?...这里做了一个简单的实验来验证: 在节点 default ns 上的 gc_thresh1, gc_thresh2 和 gc_thresh3 设置成60 。...为什么相比 TKE 的全局路由模式和单网卡多 IP 模式,独立网卡模式更容易产生这个问题 要回答这个问题,我们先简单看一下 TKE 各网络模式的原理介绍 全局路由模式 ?...我们知道,ARP 协议是为二层通信服务的,因此,该网络方案中,每个 Pod 的网络命名空间内的 ARP 表最大可能保存了节点上所有其他 Pod 的 ARP 表项,最后节点的 ARP 表项的数量最大即为

    1.5K10

    网络编程套接字(一)

    既然说端口号port是进程的一个身份,那么进程的PID按理论上来说,也能通过PID来进行网络上的进程间通信,那么为什么还需要一个port呢?...2、认识TCP协议,认识UDP协议 这里先简单得对TCP和UDP来一个直观的认识: TCP协议和UDP协议都是传输层的控制协议,以下是两种协议的特定,我们需要根据它们的特定,在不同场景下,权衡使用哪种协议...IPv4和IPv6的地址格式定义在netinet/in.h中,IPv4地址用sockaddr_in结构体表示,包括16位地址类型, 16位端口号和32位IP地址。...这样,只要取得某种sockaddr结构体的首地址,不需要知道具体是哪种类型的sockaddr结构体,就可以根据地址类型字段确定结构体中的内容。...in_addr结构 in_addr用来表示一个IPv4的IP地址.

    74850

    Linux的SOCKET编程详解

    当应用程序要创建一个套接字时,操作系统就返回一个小整数作为描述符,应用程序则使用这个描述符来引用该套接字需要I/O请求的应用程序请求操作系统打开一个文件。...下图显示,操作系统如何把文件描述符实现为一个指针数组,这些指针指向内部数据结构。 对于每个程序系统都有一张单独的表。精确地讲,系统为每个运行的进程维护一张单独的文件描述符表。...操作系统把该描述符作为索引访问进程描述符表,通过指针找到保存该文件所有的信息的数据结构。...这个地址结构根据地址创建socket时的地址协议族的不同而不同,如ipv4对应的是: struct sockaddr_in { sa_family_t sin_family; /* address...参数addr 这是一个结果参数,它用来接受一个返回值,这返回值指定客户端的地址,当然这个地址是通过某个地址结构来描述的,用户应该知道这一个什么样的地址结构。

    2.6K10

    配置网站IPV6解析,开启家用宽带公网IPV6地址

    随着IPV4地址耗尽,运营商开始回收并推进IPV4大内网地址,基于IPV4的传统内网映射、动态域名即将失效;但同时我们也要看到,运营商的IPV6推进计划基本快要完成了,现在我们的宽带、手机流量、各大门户网站...一、网站配置IPV6 为域名配置AAAA记录,A记录为IPV4地址,AAAA记录为IPV6地址,IP地址在我们购买VPS时会告诉我们。...为我们的web服务配置IPV6监听,比如我所使用的APPNODE面板需要单独为IPV6配置监听服务。 DNS同步需要一些时间,随后我们对域名进行ping测试,此时解析的已经是IPV6地址了。...如果使用路由器拨号,需要检查光猫是否开启了IPV6桥接,如果没有,百度一下,实在不行你就打客服嘛。 路由器设置,两步,配置完成后保存重启路由器,此时局域网内的设备都获取到了公网地址。...为什么不通呢? 这里就要重点说一下,安全问题!

    5.7K11

    【网络】网络基础概念&&背景&&TCPIP 五层模型&&跨网络传输详解

    我们整个的课程, 凡是提到 IP 协议, 没有特殊说明的,默认都是指 IPv4 IP 地址是在 IP 协议中, 用来标识网络中不同主机的地址 对于 IPv4 来说, IP 地址是一个 4 字节, 32...发送主机通常将发送缓冲区中的数据按内存地址从低到高的顺序发出 接收主机把从网络上接到的字节依次保存在接收缓冲区中,也是按内存地址从低到高的顺序保存 因此,网络数据流的地址应这样规定:先发出的数据是低地址...然而, 各种网络协议的地址格式并不相同 IPv4 和 IPv6 的地址格式定义在 netinet/in.h 中,IPv4 地址用 sockaddr_in 结构体表示,包括 16 位地址类型, 16 位端口号和...这样,只要取得某种 sockaddr 结构体的首地址,不需要知道具体是哪种类型的 sockaddr 结构体,就可以根据地址类型字段确定结构体中的内容 socket API 可以都用 struct sockaddr...sockaddr_in; 这个结构里主要有三部分信息: 地址类型, 端口号, IP 地址 4.6.5 in_addr 结构 in_addr 用来表示一个 IPv4 的 IP 地址.

    10710

    4.1 Paralles 虚拟机安装及网络配置--设置静态ip

    宿主机连接外网,虚拟机也能够访问外网 虚拟机ip固定 说说为什么虚拟机ip要固定,应为在配置k8s网络的时候,经常要用到ip地址,我们通常也是在宿主机通过iterm链接到虚拟机,如果虚拟机的ip总是变...三、网络配置 首先我们来看看我们要做的事情,通过下图来感受一下: 一共有以下几件事: 宿主机和虚拟机可以通过内外网互相访问。...点击Parallels虚拟机-->偏好设置--> 网络-->Shared模式 在这里我们取消勾选IPv4 DHCP> 为什么要取消呢?...GATEWAY:通常前三组数和ip地址是一样的,最后一个是1 主要注意的是GATEWAY网关,这里配置的是10.**.55.1,为什么设置为这个值呢?...因为我们并不是把mac当成Ip数据报文转发路由器,而是当成nat路由器,当采用nat方式为虚拟机提供网络服务时,Parallels会单独为虚拟机生成一个网关地址,这通常是地址池(第二步的起始地址和结束地址

    2.1K30

    LVS DR模式搭建,keepalived + lvs

    三台机器都可以使用同一网段的IP,与NAT模式不同的是,三台机器都需要绑定一个vip,并且分发器不需要有一个单独的外网网卡。...保存退出后执行这个脚本看看是否正常: sh /usr/local/sbin/lvs_rs.sh 我这里出现了一个错误,无法载入本地网卡的配置文件: ?...如图,可以看到分别访问了两台Real Server的默认页,因为分发器会将客户的访问请求,根据调度算法来分发到这个两台Real Server上,如此能够进行分配访问请求的话,就代表我们的DR模式搭建成功...为什么要结合Keepalived: 原因一:分发器(dir)在LVS中是一个重要的角色,因为所有的用户请求都是被分发器所分配到每台Real Server上,所以说分发器也可以看作是一个入口,所有的请求都从这个入口进来...既然说明了为什么需要Keepalived,那么接下来就实际演示一下如何让Keepalived与LVS结合,完整架构需要两台服务器分别安装keepalived软件,的是实现高可用,但keepalived本身也有负载均衡的功能

    1.6K30

    全球 IPv4 地址耗尽,IPv6 来了!

    可能看到这里,有同学会跳出来说:IPv6 不是为了解决 IPv4 地址耗尽的问题吗,既然 IPv6 的地址空间那么大,可以为每一个网络节点分配公网 IPv6 的节点,那为什么 IPv6 还需要支持私网?...但为什么 IPv6 已经发展了十几年了,目前在我们的工作和生活中还是比较少接触和使用。...但是我们在 IPv6 Socket 编程的时候使用链路本地地址,有一个细节需要注意。...图40 IPv6地址结构 在 IPv6 地址结构中(对应于 IPv4 的 struct sockaddr_in),有一个我们非常陌生的字段 scope_id,这个字段在我们使用链路本地地址来编程的时候是必须要使用的...为什么需要需要有这么一个字段,那是因为链路本地地址的特殊性,一个网络节点可以有多个网络接口,多个网络接口可以有相同的链路本地地址,例如我们需要 bind 一个本地链路地址,这个时候就会有冲突,操作系统无法决策需要绑定的是哪个接口的本地链路地址

    3.2K10

    【在Linux世界中追寻伟大的One Piece】网络基础概念

    IP地址是在IP协议中,用来标识网络中不同主机的地址; 对于IPv4来说,IP地址是一个4字节,32位的整数; 我们通常也使用"点分十进制"的字符串表示IP地址,例如192.168.0.1,用点分割的每一个数字表示一个字节...然而,各种网络协议的地址格式并不相同。 IPv4和IPv6的地址格式定义在netinet/in.h中,IPv4地址用sockaddr_in结构体表示,包括16位地址类型16位端口号和32位IP地址。...这样,只要取得某种sockaddr结构体的首地址,不需要知道具体是哪种类型的sockaddr结构体,就可以根据地址类型字段确定结构体中的内容。...sockaddr结构 sockaddr_in结构 虽然socket api的接口是sockaddr,但是我们真正在基于IPv4编程时,使用的数据结构是sockaddr_in;这个结构里主要有三部分信息:...in_addr结构 in_addr用来表示一个IPv4的IP地址。其实就是一个32位的整数;

    8810

    什么是socket套接字?

    image.png (图片来源:极客时间) 我们使用socket的时候就需要对方的ip地址和端口号,socket的地址结构在程序里的表示如下面的图示。...套接字格式地址表示IPv6的地址,还有本地地址结构用于本地 socket 通信,还有一个是通用地址结构,为什么要有通用地址结构呢?...原来为了方便函数的的调用,像connect,bind,accept方法都需要一个套接字地址结构的指针参数: image.png image.png image.png 为了方便起见,函数的定义就直接用通用的地址结构指针定义...但是ipv4地址结构的大小为16字节,ipv6地址结构的大小为28字节,本地地址地址结构的大小最多为110字节,而通用地址结构的大小为16字节。...仔细看一下,这里参数传入的是地址结构的指针哦,后面还有一个*addrlen的参数,表示地址结构的长度,所以只要取addrlen长度的数据就行了,具体的类型可以根据sin_family来确定哦。

    58630

    网络基础入门

    我们可以看到,随着网络的发展,客观事实是主机之间距离越来越远了,这就产生了问题: 如何使用数据的问题 可靠性问题 主机定位问题 数据包局域网转发的问题 那我们就需要一种解决方法来解决这些问题。...作用:假设我们有两台计算机,分别是主机A和主机B,它们需要通过一个以太网交换机进行通信。...下面来明确一下概念: 报头部分,就是对应协议层的结构体字段,我们一般叫做报头 除了报头,剩下的叫做有效载荷 故,报文 = 报头 + 有效载荷 然后,我们在明确一下不同层的完整报文的叫法: 不同的协议层对数据包有不同的称谓...sockaddr 结构体指针做为参数; sockaddr 结构: sockaddr_in 结构: 虽然 socket api 的接口是 sockaddr, 但是我们真正在基于 IPv4 编程时, 使用的数据结...in_addr 结构: in_addr 用来表示一个 IPv4 的 IP 地址. 其实就是一个 32 位的整数。

    9510

    一、什么是DNS?

    每个 IP 地址在其网络中必须是唯一的。我们这里谈论的网络就是指整个互联网。   IPv4,目前最常见的地址形式,由四组数字组成,每组最多有三位数字,每一组用一个点分隔。...例如,111.222.111.222 是有效的 IPv4 IP 地址。使用 DNS,我们可以将名称映射到该地址,这样,你就不必记住一组复杂的数字,来访问你需要的网站。...然后,通过域名注册商来分发 TLD 下面的域名。 主机(Host)   域名所有者可以定义多个单独的主机,指向可以通过该域名访问的不同的计算机或者服务。...就是一个标准的 FQDN 的例子。有时候,一些软件使用的 FQDN 不需要末尾的点,但是要符合 ICANN 标准的话一定要加上末尾的点。...区域文件放置在名称服务器中,通常定义了特定域名下可用的资源,或者可以去获取该信息的位置。 记录(Record)   在区域文件中,保存着记录。其中最简单的记录形式是,是资源和名称之间的单独映射。

    1.6K11

    IPv6技术详解:基本概念、应用现状、技术实践(下篇)

    可以看到无状态自动配置过程十分简易(对比DHCPv4和DHCPv6来说),实际上,无状态自动配置可以单独组网使用,也可以配合有状态自动配置一般会配合使用,加强网络节点管理。...in6_addr就是一个128位的IPv6地址结构体。...但是我们在IPv6 Socket编程的时候使用链路本地地址,有一个细节需要注意。...▲ 图40:IPv6地址结构 在IPv6地址结构中(对应于IPv4的struct sockaddr_in),有一个我们非常陌生的字段scope_id,这个字段在我们使用链路本地地址来编程的时候是必须要使用的...为什么需要需要有这么一个字段,那是因为链路本地地址的特殊性,一个网络节点可以有多个网络接口,多个网络接口可以有相同的链路本地地址,例如我们需要bind一个本地链路地址,这个时候就会有冲突,操作系统无法决策需要绑定的是哪个接口的本地链路地址

    3.4K30

    一文搞懂网络套接字编程

    这样,只要取得某种sockaddr结构体的首地址,不需要知道具体是哪种类型的sockaddr结构体,就可以根据地址类型字段确定结构体中的内容. socket API可以都用struct sockaddr...虽然socket api的接口是sockaddr, 但是我们真正在基于IPv4编程时, 使用的数据结构是sockaddr_in; 这个结构里主要有三部分信息: 地址类型, 端口号, IP地址. in_addr...in_addr用来表示一个IPv4的IP地址....其实就是一个32位的整数; 地址转换函数 本篇博客只介绍基于IPv4的socket网络编程,sockaddr_in中的成员struct in_addr sin_addr表示32位 的IP 地址,但是我们通常用点分十进制的字符串表示...关于inet_ntoa inet_ntoa这个函数返回了一个char*, 很显然是这个函数自己在内部为我们申请了一块内存来保存ip的结果.

    63320
    领券