网络 通信

news2024/9/24 22:36:55

一、客户端接收(也可以bind)

1. socket

socket 函数 用于创建一个套接字(socket),这是网络通信的基础。

它的原型如下:int socket(int domain, int type, int protocol);

  • 参数

    • domain:指定协议族,如:
      • AF_INET:IPv4协议
      • AF_INET6:IPv6协议
    • type:指定通信类型,如:
      • SOCK_STREAM:面向连接的TCP协议
      • SOCK_DGRAM:无连接的UDP协议
    • protocol:一般设为0,表示使用默认协议。
  • 返回值:返回套接字的描述符,失败则返回-1。

2. recvfrom

recvfrom 函数用于接收数据报(UDP)的函数。它的原型如下:

ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags, struct sockaddr *src_addr, socklen_t *addrlen);

  • 参数

    • sockfd:套接字描述符。
    • buf:指向接收数据的缓冲区。
    • len:缓冲区的长度。
    • flags:接收选项,一般设为0。
    • src_addr:指向 sockaddr 结构的指针,用于存储发送者的地址信息。
    • addrlen:指向变量的指针,表示 src_addr 的长度。
  • 返回值:成功时返回接收到的字节数,失败时返回-1。

3.sendto 

函数的原型通常如下所示:

ssize_t sendto(int sockfd, const void *buf, size_t len, int flags, const struct sockaddr *dest_addr, socklen_t addrlen);

参数说明:

  • sockfd: 套接字描述符,通常是通过 socket 函数创建的。
  • buf: 指向要发送的数据的指针。
  • len: 要发送的数据的字节数。
  • flags: 发送操作的标志,常用的有 0(无特殊标志)。
  • dest_addr: 目的地的地址信息,指向 struct sockaddr 结构体。
  • addrlen: 目的地地址结构的长度。
  • 返回值:
  • 成功时,返回发送的字节数;失败时,返回 -1,错误信息可以通过 errno 获取。

4. inet_addr

inet_addr 函数用于将IPv4地址的字符串表示形式(如 "192.168.1.1")转换为网络字节序的二进制形式。其原型如下:

in_addr_t inet_addr(const char *cp);

  • 参数cp 是指向包含点分十进制IP地址字符串的指针。
  • 返回值:返回一个 in_addr_t 类型的数值,表示网络字节序的IPv4地址。如果输入的IP地址格式不正确,则返回 INADDR_NONE

4. inet_ntoa

inet_ntoa 函数用于将网络字节序的二进制IP地址转换为点分十进制字符串表示形式。其原型如下:

char *inet_ntoa(struct in_addr addr);

  • 参数addr 是一个 struct in_addr 类型的结构,包含网络字节序的IPv4地址。
  • 返回值:返回一个指向字符串的指针,该字符串表示IPv4地址。该字符串为静态分配,后续调用可能会覆盖该字符串。

5. ntohs

ntohs 函数用于将网络字节序转换为主机字节序的无符号短整型(一般用于端口号)。其原型如下:

uint16_t ntohs(uint16_t netshort);

  • 参数netshort 是网络字节序的无符号短整型值。
  • 返回值:返回一个主机字节序的无符号短整型值。

6.htons

函数原型:   uint16_t htons(uint16_t hostshort);

参数

  • hostshort: 需要转换的 16 位无符号整数,通常代表端口号或其他短整型值。

返回值

htons 返回转换后的 16 位无符号整数,以网络字节序表示。

网络字节序 vs主机字节序

  • 网络字节序:通常是大端字节序(big-endian),即高位字节存储在低地址。
  • 主机字节序:根据具体的硬件架构,可以是大端或小端(little-endian)。例如,大多数 x86 架构使用小端字节序。

二、服务器端

1.socket

2.bind

bind 函数用于将一个套接字(socket)与一个本地地址(包括IP地址和端口号)关联起来。它通常用于服务器套接字,以便在特定地址上监听传入的连接请求。bind 的原型如下:

int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);

参数:
  • sockfd:一个套接字的描述符,通常是通过调用 socket 函数创建的。
  • addr:指向一个 sockaddr 结构体的指针,其中包含接口的地址和端口号。通常需要将其转换为适当的地址结构,例如 sockaddr_in(用于IPv4)。
  • addrlenaddr 的长度,通常可以使用 sizeof 来获取。
返回值:
  • 成功时返回0。
  • 失败时返回-1,并且可以通过 errno 获取具体的错误信息。

三、基于tcp的网络通信;(read,write)

1.tcp服务器

(1)建立连接

   socket

    bind

    listen

listen 函数用于将一个已绑定的套接字设为监听状态,以便接收传入的连接请求。只有在调用 bind 后,才能调用 listen。其原型如下:

int listen(int sockfd, int backlog);

参数:
  • sockfd:一个套接字的描述符,它已经通过 socket 和 bind 函数创建和绑定。
  • backlog:表示等待连接排队的最大数量。如果连接请求超过此数量,额外的请求会被拒绝或被重置。
返回值:
  • 成功时返回0。
  • 失败时返回-1,并且可以通过 errno 获取具体的错误信息

    accept

accept 函数用于接受传入的连接请求。成功后,它会返回一个新的套接字文件描述符,用于与连接的客户端进行通信。其原型如下:

int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);

参数:
  • sockfd:一个处于监听状态的套接字描述符,由 listen 返回。
  • addr:指向一个 sockaddr 结构的指针,用于存储客户端的地址信息。
  • addrlen:指向一个 socklen_t 类型的变量的指针,表示 addr 的大小,接受后会被更新为实际的地址长度。
返回值:
  • 成功时返回一个新的套接字文件描述符,用于与客户端通信。
  • 失败时返回-1,并且可以通过 errno 获取具体的错误信息。

2.tcp客户端

socket

connect

connect 函数用于客户端程序建立与服务器的连接。使用该函数时,客户端需要先创建一个套接字,并且必须知道服务器的地址和端口号。其原型如下:

int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);

参数:
  • sockfd:通过 socket 创建的套接字描述符,客户端使用此套接字进行连接。
  • addr:指向一个 sockaddr 结构的指针,包含服务器的地址(IP 地址和端口号)。
  • addrlenaddr 的大小,通常使用 sizeof(struct sockaddr_in) 来获得。
返回值:
  • 成功时返回0。
  • 失败时返回-1,并且可以通过 errno 获取具体的错误信息。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2067472.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

go-zero接入skywalking链路追踪

文章目录 Skywalking本地测试搭建项目引入dockerfile打包引入最后效果图 Skywalking本地测试搭建 这里用Docker搭建 #数据存储用ES,搭建ES docker run -d -p 9200:9200 -p 9300:9300 --name es -e "discovery.typesingle-node" -e ES_JAVA_OPTS"-X…

【C++】12.智能指针

在上一篇博客【C】11.异常中我们知道有些时候会造成内存空间的未释放从而导致内存泄漏,因此本篇博客的内容就是如何减少内存泄漏——智能指针。 一、RAII RAII(Resource Acquisition Is Initialization)是一种利用对象生命周期来控制程序资…

基于单片机的指纹识别考勤系统设计

本设计基于STC89C52为主控的指纹考勤系统,主要分为光学AS608指纹识别模块、LCD12864液晶模块、AT24C02存储芯片、DS1302时钟芯片模块、矩阵按键模块。AS608指纹模块进行指纹的采集;矩阵按键能实现对指纹的录入、删除、编号;AT24C02存储模块对…

如何使用ssm实现网上服装销售系统

TOC ssm047网上服装销售系统jsp 第一章 绪 论 1.1背景及意义 系统管理也都将通过计算机进行整体智能化操作,对于网上服装销售系统系统所牵扯的管理及数据保存都是非常多的,例如管理员;主页、个人中心、用户管理、商品分类管理、商品信息管…

[Meachines] [Easy] Optimum HFS文件管理2.3.x-RCE+MS16-032

信息收集 IP AddressOpening Ports10.10.10.8TCP:80 $ nmap -p- 10.10.10.8 --min-rate 1000 -sC -sV -Pn PORT STATE SERVICE VERSION 80/tcp open http HttpFileServer httpd 2.3 |_http-server-header: HFS 2.3 |_http-title: HFS / Service Info: OS: Windows; CP…

Python计算机视觉 第2章-局部图像描述子

Python计算机视觉 第2章-局部图像描述子 2.1 Harris角点检测器 Harris角点检测算法(也称Harris & Stephens角点检测器)是一个极为简单的角点检测算法。该算法的主要思想是,如果像素周围显示存在多于一个方向的边,我们认为该…

滥用 DHCP 管理员组来提升 Windows 域中的权限

介绍 从 Google Docs 到 Active Directory,访问管理几乎影响到组织中的每个角色。在讨论权限和访问控制时,如何最大限度地减少员工的挫败感而不增加不必要的风险是一个微妙的平衡——安全团队痛苦地意识到了这一点。 因此,“刚好足够的访问权限”是任何访问策略的关键要素…

鸿蒙内核源码分析(用户态锁篇) | 如何使用快锁Futex(上)

快锁上下篇 鸿蒙内核实现了Futex,系列篇将用两篇来介绍快锁,主要两个原因: 网上介绍Futex的文章很少,全面深入内核介绍的就更少,所以来一次详细整理和挖透。涉及用户态和内核态打配合,共同作用,既要说用户…

日志文件切割:以分隔割tomcat 的 catalina.out 文件为例子

文章目录 引言I 日志文件切割使用用crontab工具,定时执行任务通过Linux系统自带的切割工具logrotate来进行切割【推荐】基于其他日志框架进行分隔II 扩展logrotate 简介logrotate 用法引言 问题:tomcat 的 catalina.out 文件不会进行日志切割,当这个文件大于2G 时,会影响to…

归并排序、计数排序及排序大总结

一、归并排序 1.基本思想 归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide andConquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列&#x…

如何使用ssm实现社区管理与服务的设计与实现

TOC ssm031社区管理与服务的设计与实现jsp 第一章 绪论 1.1研究背景 当今时代是飞速发展的信息时代。在各行各业中离不开信息处理,这正是计算机被广泛应用于信息管理系统的环境。计算机的最大好处在于利用它能够进行信息管理。使用计算机进行信息控制&#xff0…

[Meachines] [Easy] grandpa IIS 6.0+CVE-2017-7269+MS14-070权限提升

信息收集 IP AddressOpening Ports10.10.10.14TCP:80 $ nmap -p- 10.10.10.14 --min-rate 1000 -sC -sV -Pn PORT STATE SERVICE VERSION 80/tcp open http Microsoft IIS httpd 6.0 |_http-server-header: Microsoft-IIS/6.0 |_http-title: Under Construction | htt…

一文了解机器学习顶会ICML 2024的研究热点

对人工智能研究领域前沿方向的跟踪是提高科研能力和制定科研战略的关键。本文通过图文并茂的方式介绍了ICML 2024的研究热点,帮助读者了解和跟踪机器学习和人工智能的前沿研究方向。本推文的作者是许东舟,审校为邱雪和黄星宇。 1 会议介绍 ICML&#x…

揭秘!挑选随身WiFi的终极攻略:一篇文章教会你怎么挑选随身WiFi,学会对比各项参数,随身WiFi哪个好?

对于不方便拉宽带的大流量使用者,随身WiFi尤为重要。面对市场上琳琅满目的随身WiFi品牌和型号,许多用户感到无从下手。不同随身WiFi在性能、价格、续航等方面各有优势,如何挑选一款适合自己的随身WiFi成为了一大难题。本文将为您详细解析随身…

22 Message 组件

Tkinter Message 组件使用指南 Tkinter 的 Message 组件用于显示多行文本消息。它通常用于显示提示信息、警告或状态更新。Message 组件能够自动换行,以适应其分配的空间。以下是对 Message 组件的详细说明和一个使用案例。 Message 组件属性 text: 要显示的文本…

3D 打印的突破:热引发剂在立体光刻中的应用

在当今科技飞速发展的时代,3D打印技术作为一项具有创新性和颠覆性的技术,正不断改变着我们的生产和生活方式。今天,向大家介绍的是一项关于3D打印的重要研究成果《3D printing by stereolithography using thermal initiators》发表于《Natur…

【前端面试】call、apply 、bind、箭头函数

函数除了传参,还有一个调用上下文this,使用call、apply 、bind可以改变函数的this 在实际开发中,选择使用 call、apply 还是 bind 取决于你的具体需求和场景。以下是一些使用这些函数的常见情况: 1. 使用 call 的情况: 当你需要调用一个函数,并且需要明确指定 this 的上下…

【HarmonyOS NEXT星河版开发实战】天气查询APP

目录 前言 界面效果展示 首页 添加和删除 界面构建讲解 1. 获取所需数据 2. 在编译器中准备数据 3. index页面代码讲解 3.1 导入模块: 3.2 定义组件: 3.3 定义状态变量: 3.4 定义Tabs控制器: 3.5 定义按钮样式: 3.6 页面显示时触发…

【django进阶知识点】

day04 django进阶知识点 今日概要: 模板中间件ORM操作(pymysql SQL语句)session和cookie缓存(很多种方式) 内容回顾 请求周期 路由系统 最基本路由关系动态路由(含正则)路由分发不同的app中…

如何通过数据互通提升销售效率与客户满意度

在快速变化的市场中,品牌商与经销商之间的数据互通已成为提升竞争力的关键。让我们以知名品牌——百威啤酒为例,探讨与经销商数据互通如何帮助这些企业解决实际问题,并为各个部门带来益处。 假如一个以下场景 夏日狂欢节 想象一下&#xff…