[网络编程]socket嵌套字的一些常用接口

目录

一、socket常用接口

1.sockaddr_in 

2.socket

3. bind

4.listen

5.accept

6.connect 

7.send 

8.sendto 

9.recv

10.recvfrom

11.close

二、 字节序之间的转换函数

1. inet_ntoa

2. inet_aton

3.inet_addr

4.inet_pton 

5.inet_ntop 

6.htons

7.ntohs


一、socket常用接口

1.sockaddr_in 

sockaddr_in 是 Unix 和 Linux 中用于表示 IPv4 地址和端口号的结构体。当创建一个 IPv4 套接字时,这个结构体通常用于 bind()connect()sendto()recvfrom() 等系统调用中,以指定或接收网络地址信息。

sockaddr_in 结构体的定义如下:

struct sockaddr_in {  short            sin_family;   // 地址族,对于 IPv4 通常是 AF_INET  unsigned short   sin_port;     // 端口号,网络字节序  struct in_addr   sin_addr;     // IPv4 地址  char             sin_zero[8];  // 未使用的填充字节,通常用零填充  
};
struct in_addr {  uint32_t       s_addr;    // 32 位的 IPv4 地址,网络字节序  
};

2.socket

功能

创建一个新的socket,返回一个新的socket文件描述符。

原型

#include <sys/types.h>
#include <sys/socket.h>int socket(int domain, int type, int protocol);

参数

  1. domain:指定了协议族(也称为协议域或地址族)。常见的值有:

    • AF_INET:IPv4 互联网协议。
    • AF_INET6:IPv6 互联网协议。
    • AF_UNIX(或 AF_LOCAL):本地进程间通信(Unix 域套接字)。
  2. type:指定了套接字类型。常见的值有:

    • SOCK_STREAM:提供有序的、可靠的、基于连接的字节流服务。它通常用于 TCP
    • SOCK_DGRAM:提供无连接的、不可靠的数据报服务。它通常用于 UDP
    • SOCK_RAW:提供原始网络访问,允许应用程序直接操作底层协议。
  3. protocol:通常设置为 0,表示选择默认的协议。在大多数情况下,对于给定的 domain 和 type,系统可以自动确定合适的协议。

返回值

成功时返回socket文件描述符,失败时返回-1,并设置全局变量 errno 以指示错误原因。

3. bind

功能

将一个套接字绑定到一个特定的地址上。

原型

#include <sys/types.h>  
#include <sys/socket.h>  int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);

参数

  • sockfd:这是通过 socket() 函数创建的套接字文件描述符。

  • addr:这是一个指向 sockaddr 结构体的指针,该结构体包含了要绑定的地址信息。这个地址可以是 IP 地址和端口号的组合,或者对于 Unix 域套接字,它可能是一个文件路径。

  • addrlen:这是 addr 参数指向的地址结构体的长度。这允许函数知道 addr 指向的结构的类型(因为 sockaddr 是一个通用结构,有不同的变体,如 sockaddr_in 用于 IPv4,sockaddr_in6 用于 IPv6,sockaddr_un 用于 Unix 域套接字)。

返回值

  • 如果绑定成功,函数返回 0。
  • 如果绑定失败,函数返回 -1,并设置全局变量 errno 以指示错误原因。

4.listen

功能

使socket进入监听状态,等待连接。

原型

#include <sys/types.h>  
#include <sys/socket.h>  int listen(int sockfd, int backlog);

参数

  • sockfd:这是你想要设置为监听模式的套接字的文件描述符。
  • backlog:这是一个整数值,指定了内核应该为相应套接字排队的最大连接数

返回值

成功时返回 0,失败时返回 -1 并设置全局错误变量 errno

5.accept

功能

当一个套接字处于监听模式(通过 listen 函数设置)时,它可以等待来自客户端的连接请求。一旦有客户端尝试连接,accept 函数就会被调用以接受这个连接,并返回一个新的套接字描述符,该描述符专门用于与这个特定客户端的通信

原型

#include <sys/types.h>  
#include <sys/socket.h>  int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);

参数

  • sockfd:这是监听套接字(即调用过 listen 的套接字)的文件描述符。
  • addr:这是一个指向 sockaddr 结构的指针,该结构用于存储客户端的地址信息。如果不需要客户端的地址信息,这个参数可以设置为 NULL
  • addrlen:这是一个指向 socklen_t 类型变量的指针,该变量在调用 accept 之前应该设置为 addr 结构的大小。当 accept 返回时,它将包含实际存储在 addr 中的地址信息的大小。

返回值

成功时返回一个非负整数,这个整数是新套接字的文件描述符,用于与客户端通信。如果出错,则返回 -1 并设置全局错误变量 errno

6.connect 

功能

这个函数通常用在客户端程序中,以连接到服务器端的套接字。

原型

#include <sys/types.h>  
#include <sys/socket.h>  int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);

参数

  • sockfd:这是客户端想要连接的套接字的文件描述符。这个套接字之前通常通过 socket 函数创建。
  • addr:这是一个指向 sockaddr 结构体的指针,该结构体包含了目标服务器的地址和端口信息。
  • addrlen:这是 addr 结构体的大小,以字节为单位。

返回值

成功时返回 0,表示连接已建立。如果连接失败,它将返回 -1 并设置全局错误变量 errno 以指示错误原因。

7.send 

功能

send 函数用于在已连接的套接字上发送数据。它通常用于 TCP 套接字,因为 TCP 套接字在发送数据之前需要先建立连接。

原型

#include <sys/types.h>  
#include <sys/socket.h>  ssize_t send(int sockfd, const void *buf, size_t len, int flags);  

参数

  • sockfd:这是已连接套接字的文件描述符。这个套接字之前通常通过 socket 函数创建,并通过 connect 函数与远程主机建立了连接。
  • buf:这是一个指向要发送数据的缓冲区的指针。这个缓冲区包含了要发送的数据。
  • len:这是要发送数据的字节数。它指定了从 buf 指向的缓冲区中要发送的字节数。
  • flags:这是一组标志,用于修改发送操作的行为。这些标志可以影响发送操作的方式,例如是否应该进行非阻塞发送等。常见的标志包括 MSG_DONTWAIT(非阻塞发送)和 MSG_OOB(发送带外数据)。一般设为0,当flags设置为0时,send函数会以阻塞模式尝试发送整个请求的数据块,并等待直到数据被成功发送或发生错误。

返回值

 成功时返回发送的字节数,如果出错则返回 -1 并设置全局错误变量 errno

8.sendto 

功能

sendto 函数用于在无连接套接字上发送数据。它通常用于 UDP 套接字,因为 UDP 套接字不需要事先建立连接就可以发送数据。

原型

#include <sys/types.h>  
#include <sys/socket.h>  ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,  const struct sockaddr *dest_addr, socklen_t addrlen);

参数

  • ockfd:这是无连接套接字的文件描述符。
  • buf 和 len:与 send 函数中的参数相同,分别指向要发送的数据缓冲区和数据长度。
  • flags:与 send 函数中的标志参数相同。
  • dest_addr 和 addrlen:这两个参数指定了数据的目标地址和地址长度。对于 UDP 套接字,这通常是接收方的 IP 地址和端口号。

返回值

 成功时返回发送的字节数,如果出错则返回 -1 并设置全局错误变量 errno

9.recv

功能

recv 函数用于从已连接的套接字接收数据的函数。它通常与 send 函数配对使用,特别是在 TCP 套接字通信中。TCP 是一种面向连接(面向字节流)的协议,因此在使用 recv 之前,通常需要先通过 socket 和 connect(或 accept 在服务器端)函数建立连接。

原型

#include <sys/types.h>  
#include <sys/socket.h>  ssize_t recv(int sockfd, void *buf, size_t len, int flags);  

参数

  • sockfd:这是已连接套接字的文件描述符。这个套接字应该是一个已经建立连接的 TCP 套接字。
  • buf:这是一个指向接收数据缓冲区的指针。这个缓冲区用于存储从套接字接收到的数据。
  • len:这是要接收数据的最大字节数。它指定了 buf 指向的缓冲区能够容纳的最大字节数。
  • flags:这是一组标志,用于修改接收操作的行为。虽然对于 recv 函数来说,这些标志的使用不像 send 函数那么频繁,但它们仍然可以用于一些特殊用途,例如是否应该进行峰值接收等。一般设为0,当 flags 设置为 0 时,recv 会以阻塞模式、顺序接收数据,并移除已读取的数据。这是大多数应用程序在处理 TCP 套接字接收数据时的期望行为。如果你需要改变这些默认行为(例如,使用非阻塞模式或只查看数据而不移除),你应该使用相应的 flags 值。

返回值

成功时返回接收的字节数,失败时返回-1, 并设置全局错误变量 errno。如果连接已关闭且没有数据可接收,则返回0。

10.recvfrom

功能

recvfrom 函数用于从指定的套接字接收数据,并可以获取发送方的地址信息。这个函数通常用于无连接的套接字类型,如 UDP,但也可以用于连接模式的套接字,如 TCP

原型

#include <sys/types.h>  
#include <sys/socket.h>  ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,  struct sockaddr *src_addr, socklen_t *addrlen);

参数

  • int sockfd:要接收数据的套接字的文件描述符。
  • void *buf:指向一个缓冲区的指针,该缓冲区用于存储接收到的数据。
  • size_t len:指定 buf 缓冲区的大小,即最多可以接收的字节数。
  • int flags:指定接收操作的标志。一般设为0,表示进行默认是接收操作。
  • struct sockaddr *src_addr:指向一个 sockaddr 结构体的指针,用于存储发送方的地址信息。如果此参数为 NULL,则不获取发送方地址。
  • socklen_t *addrlen:指向一个整数变量的指针,用于存储 src_addr 结构体的实际大小。在调用 recvfrom 之前,应该将此变量设置为 src_addr 结构体的大小(通常使用 sizeof(struct sockaddr))。如果 src_addr 为 NULL,则此参数也应为 NULL。

返回值

 成功时返回接收的字节数,失败时返回-1, 并设置全局错误变量 errno。如果连接已关闭且没有数据可接收,则返回0。

11.close

功能

用于关闭一个已打开的文件描述符

原型

#include <unistd.h>  int close(int fd);  

参数

  • fd 或 sockfd:要关闭的socket的文件描述符。

返回值

如果成功,close 返回 0。如果失败,返回 -1 并设置全局变量 errno 以指示错误原因。

二、 字节序之间的转换函数

1. inet_ntoa

功能

将网络字节序的IPv4地址转换成点分十进制的字符串形式。

原型

#include <arpa/inet.h>  
char *inet_ntoa(struct in_addr inaddr);

参数

  • inaddr:一个 struct in_addr 结构体,包含网络字节序的IPv4地址。

返回值

返回指向一个静态存储的点分十进制字符串的指针。如果传入的不是有效的IPv4地址,则结果不可预测。

2. inet_aton

功能

将一个点分十进制的IP地址字符串(例如"127.0.0.1")转换为一个32位的网络字节序的IP地址

原型

#include <arpa/inet.h>  
int inet_aton(const char *cp, struct in_addr *inp);

参数

  • cp 是一个指向以点分十进制表示的IP地址字符串的指针。
  • inp 是一个指向 struct in_addr 的指针,该结构体用于存储转换后的网络字节序的IP地址。

返回值

如果转换成功,inet_aton 函数返回非零值;如果输入地址不正确(例如,不是有效的IP地址),则返回零。此外,值得注意的是,使用 inet_aton 函数并没有错误码存放在 errno 中,所以其返回值通常被直接用来判断转换是否成功。

3.inet_addr

功能

一个点分十进制的IPv4地址转换为一个32位的无符号长整型数据(网络字节序)

原型

#include <arpa/inet.h>  
in_addr_t inet_addr(const char *cp);

参数

  • cp:指向点分十进制IPv4地址字符串的指针。

返回值

成功时返回网络字节序的IPv4地址,如果输入的不是有效的表示形式则返回 INADDR_NONE

4.inet_pton 

功能

将点分十进制的IP地址字符串转换为网络字节序的二进制形式。它支持IPv4和IPv6两种地址族。

原型

#include <arpa/inet.h>  
int inet_pton(int af, const char *src, void *dst);

参数

  • af:指定地址族,AF_INET 指定 IPv4 地址,AF_INET6 指定 IPv6 地址。
  • src:指向要转换的字符串地址的指针。
  • dst:指向存放网络字节序的二进制结果的地址的指针。

返回值

  • 如果成功将地址字符串转换为网络字节序整数,inet_pton 会返回 1。
  • 如果输入的地址字符串无效,它会返回 0。
  • 如果发生错误,它会返回 -1。

5.inet_ntop 

功能

它的主要作用是将网络字节序(大端序)的IPv4或IPv6地址转换成人类可读的字符串形式。这个函数特别适用于需要将IP地址的数字形式转换为文本格式的场景

原型

#include <arpa/inet.h>  
const char *inet_ntop(int af, const void *src, char *dst, socklen_t size);

参数

  • af:地址族,指定了要转换的地址类型。可以是 AF_INET(表示IPv4)或 AF_INET6(表示IPv6)。
  • src:指向要转换的二进制地址的指针。这个地址应该是网络字节序的。
  • dst:指向存储转换后的字符串的缓冲区的指针。
  • sizedst 缓冲区的大小。这用于避免缓冲区溢出。

返回值

  • 如果转换成功,inet_ntop() 函数返回一个指向 dst 的指针,该指针指向转换后的字符串地址。
  • 如果发生错误(比如缓冲区太小无法存储转换后的字符串),则返回值为 NULL,并设置全局错误号 errno

6.htons

功能

将无符号短整形(16位)数值(端口号))从主机字节序转换为网络字节序

原型

#include <arpa/inet.h>  
uint16_t htons(uint16_t hostshort);

参数

  • hostshort参数是一个以主机字节序存储的无符号短整形数值

返回值

返回转换后的网络字节序的无符号短整形数值。

注意

htons函数仅处理16位数值的转换,对于32位数值的转换,应使用htonl(host to network long)函数。同时,对于从网络接收到的数据,需要使用ntohs(network to host short)函数进行相反的转换,即从网络字节序转换回主机字节序。

7.ntohs

功能

用于将16位无符号整数从网络字节序(大端)转换为主机字节序

原型

#include <arpa/inet.h>  
uint16_t ntohs(uint16_t netshort);

参数

  • netshort是要进行转换的16位无符号整数,以网络字节序表示

返回值

返回转换后的主机字节序的16位无符号整数。

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

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

相关文章

[SWPUCTF 2022 新生赛]ez_ez_unserialize

要绕过wakeup函数&#xff0c;只要序列化的中的成员数大于实际成员数&#xff0c;即可绕过。 <?php class X {public $x fllllllag.php; }$anew X(); echo serialize($a); O:1:“X”:1:{s:1:“x”;s:13:“fllllllag.php”;} 修改为 O:1:“X”:3:{s:1:“x”;s:13:“flllll…

NASA数据集—— ACRIMSAT 卫星上的 ACRIM 仪器以快门周期形式收集的 2 级太阳总辐照度

ACRIM III Level 2 Shutter Cycle Data V001 简介 ACR3L2SC_1 是主动空腔辐射计辐照度监测仪&#xff08;ACRIM&#xff09;III 2 级快门周期数据第 1 版产品&#xff0c;包含由 ACRIMSAT 卫星上的 ACRIM 仪器以快门周期形式收集的 2 级太阳总辐照度。 摘要 ACRIMSAT卫星上…

爬虫工具-推广-推广链接

爬虫工具是一种用于自动化获取联网上数据的软件程序。它可以模拟人类在网页上的操作&#xff0c;通过发送HTTP请求获取网页内容&#xff0c;并从中提取所需的数据。以下是一些常用的爬虫工具&#xff1a; Scrapy&#xff1a;Scrapy是一个基于Python的开源爬虫框架&#xff0c;它…

【Java--数据结构】“从扑克到程序:深入探讨洗牌算法的原理与魅力“

前言 以下是学习Java顺序表的一个实例应用———简单的洗牌算法。 欢迎关注个人主页&#xff1a;逸狼 创造不易&#xff0c;可以点点赞吗~ 如有错误&#xff0c;欢迎指出~ 目录 前言 定义每张扑克牌的属性 生成一副扑克牌&#xff08;不包含大小王&#xff09; 洗牌方法 发牌方…

邂逅JavaScript逆向爬虫-------基础篇之深入JavaScript运行原理以及内存管理

目录 一、JavaScript运行原理1.1 前端需要掌握的三大技术1.2 为什么要学习JavaScript1.3 浏览器的工作原理1.4 浏览器的内核1.5 浏览器渲染过程1.6 认识JavaScript引擎1.7 V8引擎以及JavaScript的执行过程1.8 V8引擎执行过程 二、JavaScript的执行过程2.1 初始化全局对象2.2 执…

PCB上有哪些元素

过孔&#xff1a;是用来切换层的 丝印&#xff1a;就是标记&#xff08;白色的线或者符号&#xff09; 焊盘&#xff1a;焊接元器件&#xff0c;相当于线头&#xff0c;连接各个元件 通孔埋孔盲孔&#xff0c;都是用来换层&#xff0c;内部没有桐&#xff0c;是用来固定的 线路…

【pycharm】调试模式中四个常用按钮介绍

【pycharm】调试模式中四个常用按钮介绍 在 PyCharm 的调试模式中&#xff0c;有四个常用的按钮&#xff0c;它们的功能如下&#xff1a; Step Over (F8)&#xff1a;单步执行&#xff0c;但在遇到函数调用时&#xff0c;不会进入函数内部&#xff0c;而是将整个函数作为一步执…

从0到1—POC编写基础篇(二)

接着上一篇 POC常用基础模块 urllib 模块 Python urllib 库用于操作网页 URL&#xff0c;并对网页的内容进行抓取处理。 urllib 包 包含以下几个模块&#xff1a; ●urllib.request - 打开和读取 URL。 ●urllib.error - 包含 urllib.request 抛出的异常。 ●urllib.parse - …

VUE DPlayer编译

源码 GitHub - DIYgod/DPlayer: :lollipop: Wow, such a lovely HTML5 danmaku video player 检查npm/nodejs 两个要配套。我的npm是8.5&#xff0c;nodejs是16 具体参考&#xff1a; 手动安装nodejs-CSDN博客 准备 npm i 编译 npm run build

电脑特别卡,但是看cpu和内存使用量并不大,该如何提升电脑运行速度

1.清理磁盘空间&#xff1a; 检查硬盘空间使用情况&#xff0c;确保有足够的可用空间。使用磁盘清理工具删除不需要的文件。 2.关闭不必要的启动项&#xff1a; 通过任务管理器&#xff08;在 Windows 中可以通过右键点击任务栏并选择“任务管理器”&#xff09;禁用不必要的启…

【八股】计算机网络篇

网络模型 应用层【HTTP&#x1f449;报文/消息】 传输层【TCP或UDP&#x1f449;段&#x1f449;MSS】网络层【IP、寻址和路由&#x1f449;MTU】 ①IP&#xff08;Internet Protocol&#xff0c;网际协议&#xff09;主要作用是定义数据包的格式、对数据包进行路由和寻址&…

React-editor-js not showing up in a function component

React-editor-js not showing up in a function component react-editor-js 在react 函数组件中显示不出来 真的&#xff0c;我马上就想放弃它了。但是看它周下载量还挺多&#xff0c;我不信别人没遇到过。于是我继续在网络上挖呀挖。只是我一开始的方向错了。我一直以为我的写…

6.2 整合MongoDB

6.2 整合MongoDB 1. MongoDB简介2. MongoDB安装2.1 下载2.2 配置MongoDB2.3 MongoDB的启动和关闭1. 启动MongoDB2. 关闭MogoDB 2.4 安全管理 3. 整合SpringBoot3.1 依赖3.2 MongoTemplate使用3.3 测试1. 新增2. 查询3. 删除 *************************************************…

仓库管理存在的问题及改进对策?

大部分人都指导仓库问题会影响一个仓库操作或与之相关的整个流程链的速度、效率和生产力。但在大多数情况下&#xff0c;只有在流程开始甚至完成后才能识别这些错误。 到那时通常已经来不及阻止错误了&#xff0c;甚至可能来不及减少造成的损害。 所以这也是我写这篇内容的目…

[SWPUCTF 2021 新生赛]re2(不同字符加密相同,逆向修改范围)

无壳 直接看ida 完整exp&#xff1a; resultlist(ylqq]aycqyp{) for i in range(len(result)):if (ord(result[i])<94 or ord(result[i])>96) and (ord(result[i])<62 or ord(result[i])>64):result[i]chr(ord(result[i])2)else:result[i]chr(ord(result[i])-24)…

数据结构实验(三)

算法设计 一、判断回文序列 1、算法思路&#xff1a; 输入想要判断的字符串&#xff0c;用数组来存放该字符串&#xff0c;给数组一个最左的下标low,和最右的下标right.比较两端的字符是否相等&#xff0c;如果相等那么low,right--.直到遍历完字符串&#xff0c;如果字符不相…

可持续发展:制造铝制饮料罐要消耗多少资源?

铝制饮料罐是人们经常使用的日常用品&#xff0c;无论是在购物、午休还是在自动售货机前选择喝什么的时候&#xff0c;很少有人会想知道装他们喝的饮料的罐子到底是如何制成的&#xff0c;或者这些铝罐的原材料是如何进出的。 虽然有化学品和一些合金进入铝饮料罐制造过程或成为…

【C++例7-5】派生类析构函数(多继承,含有嵌入对象)

知识点&#xff1a; 1.this指针指向对象自身 2.static静态成员变量 在类内声明&#xff0c;必须要在类外初始化 int Base3::base3 0; 3.由多基类继承而来的派生类构造时构造函数的调用 ①先按继承基类的顺序调用基类的构造函数&#xff0c;有参传参&#xff0c;无参使用…

大小端解释以及如何使用程序判断IDE的存储模式

今天让我们来了解一下大小端的概念吧 什么是大小端&#xff1f; 大端&#xff08;存储&#xff09;模式&#xff1a;指的是数据的低位保存在内存的高地址处&#xff0c;而数据的高位则保存在内存的低地址处。 小端&#xff08;存储&#xff09;模式&#xff1a;指的是数据的低位…

在 Windows 系统上彻底卸载 TeamViewer 软件

在 Windows 系统上彻底卸载 TeamViewer 软件 References 免费版仅供个人使用 您的会话将在 5 分钟后终止 Close TeamViewer by locating the TeamViewer icon in the system tray, right click and “Exit TeamViewer”. Right click Windows start menu then Control Panel -…