当前位置: 首页 > news >正文

socket()、bind()、listen()、htons()

socket()

socket() 是一个系统调用函数,用于创建一个套接字(socket),通过该套接字进行网络通信。在这段代码中,socket() 函数被用于创建一个本地套接字。

具体来说,这是 socket() 在代码中的使用方式:

fd = socket(AF_INET, SOCK_STREAM, 0);
  • AF_INET 是指定的协议簇,表示使用 IPv4 地址簇。
  • SOCK_STREAM 是指定的套接字类型,表示使用 TCP 进行可靠的流式传输。
  • 0 是指定的协议类型,根据指定的协议簇和套接字类型,系统会选择合适的默认协议。

socket() 函数的作用是创建一个新的套接字,并返回一个套接字文件描述符,用于后续的操作。

如果 socket() 调用成功,返回值为非负整数,表示创建的套接字文件描述符;否则返回值为 -1,表示创建套接字失败。

需要注意的是,创建套接字之后,我们还需要通过调用 bind() 函数将其与特定的地址和端口进行绑定,并调用 listen() 函数开始监听连接请求,或者使用 connect() 函数连接到远程服务器,才能进行进一步的通信操作。同时,在使用完套接字后,需要调用 close() 函数关闭套接字以释放资源。

bind()

bind() 是一个系统调用函数,用于将一个套接字(socket)与特定的 IP 地址和端口号进行绑定。在这段代码中,bind() 函数被用于将套接字 fd 绑定到指定的地址和端口上。

具体来说,这是 bind() 在代码中的使用方式:

ret = bind(fd, (struct sockaddr*)&svrAddr, sizeof(struct sockaddr));
  • fd 是之前通过 socket() 函数创建的套接字文件描述符。
  • (struct sockaddr*)&svrAddr 是一个指向要绑定的目标地址结构体的指针。在这段代码中,svrAddr 是一个类型为 struct sockaddr_in 的变量,其中包含了要绑定的地址和端口信息。
  • sizeof(struct sockaddr) 是目标地址结构体的大小。

bind() 函数的作用是让操作系统将指定的套接字与指定的地址进行关联,使得该套接字可以监听并处理来自该地址和端口的数据。如果 bind() 调用成功,返回值为 0;否则返回值为 -1,表示绑定失败。

需要注意的是,在绑定之前,我们需要先设置好 svrAddr 结构体的相关字段,比如协议簇、端口号和 IP 地址等。在这段代码中,使用 bzero(&svrAddr, sizeof(svrAddr)) 来将 svrAddr 清零,并设置 svrAddr.sin_familyAF_INET 表示使用 IPv4 地址簇,svrAddr.sin_port 为指定的端口号,svrAddr.sin_addr.s_addrhtonl(INADDR_ANY) 表示绑定所有可用的网络接口。

如果 bind() 调用失败,通常需要进行错误处理,并关闭套接字。

listen()

listen() 是一个系统调用函数,用于将一个已绑定的套接字(socket)设置为监听状态,以便可以接受来自客户端的连接请求。在这段代码中,listen() 函数被用于将套接字 fd 设置为监听状态。

具体来说,这是 listen() 在代码中的使用方式:

ret = listen(fd, 10);
  • fd 是之前通过 socket()bind() 函数创建并绑定的套接字文件描述符。
  • 10 是指定的连接队列的最大等待连接数。

listen() 函数的作用是告诉操作系统,套接字 fd 应该开始监听连接请求。当有新的客户端连接请求到达时,操作系统会将其加入到连接队列中,等待服务器程序调用 accept() 函数接受连接。

如果 listen() 调用成功,返回值为 0;否则返回值为 -1,表示监听失败。

需要注意的是,在调用 listen() 之前,我们需要先通过 bind() 将套接字与特定的地址和端口进行绑定。同时,需要合理设置连接队列的大小,以确保能够处理所有的连接请求。在这段代码中,设置连接队列最大容量为 10。

如果 listen() 调用失败,通常需要进行错误处理,并关闭套接字。

#htons()
htons() 是一个函数,用于将无符号短整型数据(16位)从主机字节顺序转换为网络字节顺序。在这段代码中,htons() 函数被用于将端口号从主机字节顺序转换为网络字节顺序。

具体来说,这是 htons() 在代码中的使用方式:

svrAddr.sin_port = htons(10083);
  • 10083 是指定的端口号,表示要绑定的监听端口。

htons() 函数的作用是将端口号从主机字节顺序转换为网络字节顺序。网络字节顺序是一种统一的字节序,它不受不同计算机体系结构的影响,用于在网络上传输数据。大多数网络协议要求各种数据结构在网络传输时都必须使用网络字节顺序。

函数名称 “htons” 代表 “host to network short”,意思是将主机字节顺序转换为网络字节顺序的短整型。类似地,还有其他的字节顺序转换函数,例如 htonl() 用于将长整型转换为网络字节顺序,ntohs() 用于将网络字节顺序转换为主机字节顺序等。

需要注意的是,在处理网络通信数据时,确保正确使用适当的字节顺序转换函数,以保证数据在不同计算机上的正确解析和传输。

相关文章:

socket()、bind()、listen()、htons()

socket() socket() 是一个系统调用函数,用于创建一个套接字(socket),通过该套接字进行网络通信。在这段代码中,socket() 函数被用于创建一个本地套接字。 具体来说,这是 socket() 在代码中的使用方式&…...

提升开发效率,Lombok的链式编程和构建模式

目录 链式编程 定义 代码示例 ​编辑 Accessors(chaintrue) 开启链式编程 ​编辑 Accessors(chain true,fluent true) 去除set和get 构建模式 定义 代码示例 ​编辑 踩坑 Singular 定义 代码示例 踩坑默认值情况 ​编辑 With 定义 代码示例 链式编程 定义 链…...

DuDuTalk:AI语音工牌如何帮助教培公司高效管理课程顾问团队

近年来,随着人工智能的快速发展,越来越多的公司开始利用AI技术来提高工作效率和管理效果。在教育培训行业中,课程顾问团队的管理对于公司的运营和发展至关重要。 而在实际管理中,受教培人员素质参差不齐,能力差异大&a…...

C语言——静态库和动态库的创建和使用

使用库函数是源码的一种保护 库函数其实不是新鲜的东西,我们一直都在用,比如C库。我们执行pringf() 这个函数的时候,就是调用C库的函数. 下面记录静态库和动态库的生成和使用. 静态库:libxxx.a 动态库:libxxx.so 静态库: 在程序编译的时候,将库编译进可执行程序中, 运行的…...

数学学习——最优化问题引入、凸集、凸函数、凸优化、梯度、Jacobi矩阵、Hessian矩阵

文章目录 最优化问题引入凸集凸函数凸优化梯度Jacobi矩阵Hessian矩阵 最优化问题引入 例如:有一根绳子,长度一定的情况下,需要如何围成一个面积最大的图像?这就是一个最优化的问题。就是我们高中数学中最常见的最值问题。 最优化…...

HCIP期中实验

考试需求 1 、该拓扑为公司网络,其中包括公司总部、公司分部以及公司骨干网,不包含运营商公网部分。 2 、设备名称均使用拓扑上名称改名,并且区分大小写。 3 、整张拓扑均使用私网地址进行配置。 4 、整张网络中,运行 OSPF 协议…...

【Git系列】IDEA集成Git

🐳IDEA集成Git 🧊1. idea配置git🧊2. idea添加暂存区和提交🪟创建文件🪟将整个项目添加到暂存区🪟提交到本地仓库🪟查看控制台,显示提交的信息🪟修改文件,再次…...

短视频矩阵源码开发搭建分享--多账号授权管理

目录 文章目录 前言 一、矩阵号系统是什么? 二、使用步骤 1.创建推广项目 2.多账号授权 3.企业号智能客服系统 总结 前言 短视频多账号矩阵系统,通过多账号一键授权管理的方式,为运营人员打造功能强大及全面的“矩阵式“管理平台。…...

数据中台系列2:rabbitMQ 安装使用之 window 篇

RabbitMQ 是一个开源的消息队列系统,是高级消息队列协议(AMQP)的标准实现,用 erlang 语言开发。 因此安装 RabbitMQ 之前要先安装好 erlang。 1、安装 erlang 到 这里 下载本机能运行的最新版 erlang 安装包。如果本机没有装过 …...

Windows驱动开发

开发Windows驱动程序时,debug比较困难,并且程序容易导致系统崩溃,这时可以使用Virtual Box进行程序调试,用WinDbg在主机上进行调试。 需要使用的工具: Virtual Box:用于安装虚拟机系统,用于运…...

汽车分析,随时间变化的燃油效率

简述 今天我们来分析一个汽车数据。 数据集由以下列组成: 名称:每辆汽车的唯一标识符。MPG:燃油效率,以英里/加仑为单位。气缸数:发动机中的气缸数。排量:发动机排量,表示其大小或容量。马力&…...

大数据面试题之Elasticsearch:每日三题(六)

大数据面试题之Elasticsearch:每日三题 1. 为什么要使用Elasticsearch?2.Elasticsearch的master选举流程?3.Elasticsearch集群脑裂问题? 1. 为什么要使用Elasticsearch? 系统中的数据,随着业务的发展,时间…...

【管理设计篇】聊聊分布式配置中心

为什么需要配置中心 对于一个软件系统来说,除了数据、代码,还有就是软件配置,比如操作系统、数据库配置、服务配置 端口 ip 、邮箱配置、中间件软件配置、启动参数配置等。如果说是一个小型项目的话,可以使用Spring Boot yml文件…...

远程控制平台简介

写在前面 之所以想自己动手实现一个远程控制平台,很大一部分原因是因为我那糟糕的记性,虽然经常加班到很晚,拖着疲惫的步伐回到家,才想起忘记打卡了,如果我能在家控制在办公室的手机打一下卡就好了… 有人说,市场上有TeamViewer,向日葵,AnyDesk,ToDesk,等等这些老大…...

韦东山Linux驱动入门实验班(5)LED驱动---驱动分层和分离,平台总线模型

前言 (1)前面已经已经详细介绍了LED驱动如何进行编写的代码。如果韦东山Linux驱动入门实验班(4)LED驱动已经看懂了,驱动入门实验班后面的那些模块实验,其实和单片机操作差不太多了。我就不再浪费时间进行讲…...

【雕爷学编程】MicroPython动手做(02)——尝试搭建K210开发板的IDE环境

知识点:简单了解K210芯片 2018年9月6日,嘉楠科技推出自主设计研发的全球首款基于RISC-V的量产商用边缘智能计算芯片勘智K210。该芯片依托于完全自主研发的AI神经网络加速器KPU,具备自主IP、视听兼具与可编程能力三大特点,能够充分适配多个业务场景的需求。作为嘉楠科…...

C#——Thread与Task的差异比较及使用环境

C#——Thread与Task的差异比较及使用环境 前言一、差异1. 创建和管理:2. 异步编程:3. 返回值:4. 异常处理:5. 线程复用: 总结 前言 前面两篇文章,分别通过各自的实例讲了关于Task以及Thread的相关的使用特…...

刷题 31-35

三十一、 747. 至少是其他数字两倍的最大数 给你一个整数数组 nums ,其中总是存在 唯一的 一个最大整数 。 请你找出数组中的最大元素并检查它是否 至少是数组中每个其他数字的两倍 。如果是,则返回 最大元素的下标 ,否则返回 -1 。 示例 1&a…...

【mysql】—— 数据类型详解

序言: 本期我将大家认识关于 mysql 数据库中的基本数据类型的学习。通过本篇文章,我相信大家对mysql 数据类型的理解都会更加深刻。 目录 (一)数据类型分类 (二)数值类型 1、tinyint类型 2、bit类型 …...

kafka常用命令

查看主题 ./kafka-topics.sh --list --bootstrap-server 10.1.1.2:9092 创建主题 ./kafka-topics.sh --bootstrap-server 10.1.1.2:9092 --create --topic test_topic --partitions 1 查看消费者列表--list ./kafka-consumer-groups.sh --bootstrap-server 10.1.1.2:9092 -…...

数字图像处理(番外)图像增强

图像增强 图像增强的方法是通过一定手段对原图像附加一些信息或变换数据,有选择地突出图像中感兴趣的特征或者抑制(掩盖)图像中某些不需要的特征,使图像与视觉响应特性相匹配。 图像对比度 图像对比度计算方式如下: C ∑ δ δ ( i , j …...

flutter:轮播

前言 介绍几个比较有不错的轮播库 swipe_deck 与轮播沾边,但是更多的是一种卡片式的交互式界面设计。它的主要概念是用户可以通过左右滑动手势浏览不同的卡片,每张卡片上都有不同的信息或功能。 Swipe deck通常用于展示图片、产品信息、新闻文章、社…...

高忆管理:股票投资策略是什么?有哪些?

在进行股票买卖过程中,出资者需求有自己的方案和出资战略,并且主张严格遵从出资战略买卖,不要跟风操作。那么股票出资战略是什么?有哪些?下面就由高忆管理为我们剖析: 股票出资战略简略来说便是能够协助出资…...

为公网SSH远程Ubuntu配置固定的公网TCP端口地址主图

文章目录 为公网SSH远程Ubuntu配置固定的公网TCP端口地址 为公网SSH远程Ubuntu配置固定的公网TCP端口地址 在上篇文章中,我们通过cpolar建立的临时TCP数据隧道,成功连接了位于其他局域网下的Ubuntu系统,实现了不同操作系统、不同网络下的系统…...

【前端知识】React 基础巩固(四十一)——手动路由跳转、参数传递及路由配置

React 基础巩固(四十一)——手动路由跳转、参数传递及路由配置 一、实现手动跳转路由 利用 useNavigate 封装一个 withRouter(hoc/with_router.js) import { useNavigate } from "react-router-dom"; // 封装一个高阶组件 function withRou…...

Qt几种字符类型的相互转换

Qt几种字符类型的相互转换 将const QString转换为const char*将const char*转换为const QStringQstring转换为string把string转换为QstringQt中弹出一个窗口 将const QString转换为const char* #include <QString> #include <iostream>int main() {const QString …...

软件测试员的非技术必备技能

成为软件测试人员所需的技能 非技术技能 以下技能对于成为优秀的软件测试人员至关重要。 将您的技能组合与以下清单进行比较&#xff0c;以确定软件测试是否适合您 - 分析技能&#xff1a;优秀的软件测试人员应具备敏锐的分析能力。 分析技能将有助于将复杂的软件系统分解为…...

渗透测试:Linux提权精讲(二)之sudo方法第二期

目录 写在开头 sudo expect sudo fail2ban sudo find sudo flock sudo ftp sudo gcc sudo gdb sudo git sudo gzip/gunzip sudo iftop sudo hping3 sudo java 总结与思考 写在开头 本文在上一篇博客的基础上继续讲解渗透测试的sudo提权方法。相关内容的介绍与背…...

ansible安装lnmp(集中式)

文章目录 一、安装nginx二、安装mysql三、安装php测试&#xff1a; 一、安装nginx - name: the nginx playhosts: webserversremote_user: roottasks:- name: stop firewalld #关闭防火墙service: namefirewalld statestopped enabledno- name: selinux stopc…...

Tomcat的基本使用,如何用Maven创建Web项目、开发完成部署的Web项目

Tomcat 一、Tomcat简介二、Tomcat基本使用三、Maven创建Web项目3.1 Web项目结构3.2开发完成部署的Web项目3.3创建Maven Web项目3.3.1方式一3.3.2方式二&#xff08;个人推荐&#xff09; 总结 一、Tomcat简介 Web服务器&#xff1a; Web服务器是一个应用程序&#xff08;软件&…...