网络编程socket相关操作

Socket

socket

打开一个网络连接

int socket (int family , int type ,int protocol)

family :协议族 , type : 套接字类型 , protocol :协议类型常值
套接字描述符sockfd

famliy : AF_INET(IPv4) AF_INET6(IPv6) AF_LOCAL AF_ROUTE
type : SOCK_STREAM(字节流套接字) SOCK_DGRAM(数据报套接字) SOCK_SEQPACKET(有序分组套接字) SOCK_RAW(原始套接字)
protocol : IPPROTO_TCP(TCP传输协议) IPPROTO_UDP(UDP传输协议) IPPROTO_SCTP(SCTP传输协议)

connect

TCP客户用connect来建立与TCP服务器的链接

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

sockfd : 套接字描述符 , addr : 指向套接字地址结构的指针 , addrlen : 该结构的大小
成功为0 , 出错则为-1

bind

把一个本地协议地址赋予一个套接字(协议地址是32位的IPv4地址或128位的IPv6地址与TCP或UDP的端口号的组合等)–>(绑定一个端口到套接字)
服务器在启动时捆绑它众所周知的端口。如果一个TCP客户或服务器未曾调用bind绑定一个端口,当调用connect或listen时,内核就要为相应套接字选一个临时端口。

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

sockfd : 套接字描述符 , myaddr : 指向特定协议地址地址结构的指针 , addrlen : 该结构的大小
输出 成功为0 , 出错则为-1

listen

本函数通常应该在调用socket和bind之后,并且在accept之前
作用 : listen仅由TCP调用
(1)把一个未连接的套接字转换为一个被动套接字
(2)本函数的第二个参数规定了内核应该为相应套接字排队的最大连接个数

int listen (int sockfd, int backlog);

sockfd : 套接字描述符 , backlong : 相应套接字排队的最大连接个数
输出 成功为0 , 出错则为-1

accept

由TCP服务器调用,用于从已完成链接队列队头返回下一个已完成的链接

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

sockfd : 套接字描述符 , cliaddr和addrlen用来返回已连接的对端进程(客户)的协议地址
输出 成功为已连接套接字描述符 , 出错则为-1

accept成功,那么其返回值是由内核自动生成的一个全新描述符,代表与所返回客户的TCP链接

shudown

可以半关闭链接

int shutdown(int sockfd , int howto)

getsockopt setsockopt

获取和设置影响套接字的选项

int getsockopt(int sockfd, int level, int optname, void *optval, socklen_t *optlen);
int setsockopt(int sockfd, int level, int optname,const void *optval, socklen_t optlen);

sockfd: 必须指向一个打开的套接字描述符,level(级别)指定系统中解析选项的代码或为通用套接字代码,或为某个特定于协议的代码(例如IPv4、IPv6、TCP或SCTP)
level:协议层次
SOL_SOCKET 套接字层次
IPPROTO_IP ip层次
IPPROTO_TCP TCP层次
option_name:选项的名称(套接字层次)
SO_BROADCAST 是否允许发送广播信息
SO_REUSEADDR 是否允许重复使用本地地址
SO_SNDBUF 获取发送缓冲区长度
SO_RCVBUF 获取接收缓冲区长度
SO_RCVTIMEO 获取接收超时时间
SO_SNDTIMEO 获取发送超时时间
optval: 用于接收选项值 , 是一个指向某个变量(optval)的指针,setsockopt从optval中取得选项代设置的新值,getsockopt则把已获取的选项当前值存放到*optval中。*optval的大小由最后一个参数指定。
option_len:value的长度

getsockname getpeername

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

用于获取套接字本地/对端地址信息的函数。它允许程序检索与已绑定到特定套接字上的本地IP地址和端口号。

sockfd:标识要查询的套接字文件描述符。
addr:指向一个struct sockaddr类型的缓冲区指针,该缓冲区将填充套接字的本地地址信息(由于储存接受的信息)。
addrlen:在调用前,应设置为addr缓冲区的大小;在函数返回时,将包含实际存储在addr中的字节数。

unix域

sockpair

socketpair函数创建两个随后连接起来的套接字。本函数仅仅适应于unix域套接字

#include <sys/socket.h>int socketpair(int family,int type,int protocol,int sockfd[2]);

family参数必须为AFLOCAL,protocol参数必须为0.type参数既可以是SOCKSTREAM。要创建的两个套接字描述符作为sockfd[0]和sockfd[1]返回

io

send recv

send 用于发送数据到已连接套接字的函数。它主要用于面向连接的协议,如TCP。
recv 主要用于面向连接的协议如TCP。它从指定的套接字读取数据,并将其存储在用户提供的缓冲区中。

ssize_t send(int sockfd, const void *buf, size_t len, int flags);
ssize_t recv(int sockfd, void *buf, size_t len, int flags);

sockfd:标识要发送数据的已连接套接字文件描述符。
buf:指向包含待发送数据的缓冲区指针。
len:指定要发送的数据量(以字节为单位)。
flags:可选标志,控制发送操作的行为。常见的标志包括:
MSG_OOB:发送带外数据。
MSG_DONTROUTE:不使用路由表,直接发送到网络接口。
在大多数情况下,此参数设置为0,表示使用默认行为。

返回值:
如果成功发送了所有数据,则返回实际发送/接受的字节数,可能小于请求发送的字节数。
若发生错误,返回-1,并将errno设置为相应的错误代码。

sendmsg recvmsg

sendmsg()允许程序以消息的形式同时发送多个缓冲区的数据,并可以附带控制信息。这个函数通常用于需要更多灵活性和功能的网络通信场景,如一次性发送多个独立的数据块或者传递协议相关的附加控制信息。
recvmsg()它允许程序以消息的形式从套接字接收数据,并可以获取与接收到的数据相关的控制信息。这个函数常用于需要处理多个缓冲区或底层协议控制信息的情况。

ssize_t sendmsg(int sockfd, const struct msghdr *msg, int flags);
ssize_t recvmsg(int sockfd, struct msghdr *msg, int flags);struct msghdr {void         *msg_name;       // 指向目标地址结构的指针,对于接收操作是来源地址,在某些情况下可以为NULLsocklen_t     msg_namelen;    // 目标地址结构的长度struct iovec *msg_iov;        // 指向iovec结构数组的指针,每个iovec定义了一个缓冲区和其长度int           msg_iovlen;     // iov数组中的元素个数void         *msg_control;    // 指向辅助控制信息的缓冲区的指针,包含与消息相关的底层协议控制信息socklen_t     msg_controllen; // 控制信息缓冲区的长度int           msg_flags;      // 返回值标志,由recvmsg()设置,表示消息接收的状态
};struct iovec {void  *iov_base;   // 指向缓冲区起始位置的指针size_t iov_len;    // 缓冲区的长度(以字节为单位)
};

sockfd:标识要发送数据的已连接或未连接套接字文件描述符。
msg:指向一个 struct msghdr 结构体的指针,该结构体包含了待发送的消息的所有信息:
flags:可选标志,与 send() 或 sendto() 函数中的 flags 参数类似,控制发送操作的行为。

使用:

    char message1[] = "Hello, ";char message2[] = "world!";struct iovec iov[2];iov[0].iov_base = message1;iov[0].iov_len = strlen(message1);iov[1].iov_base = message2;iov[1].iov_len = strlen(message2) + 1; // 包括终止的空字符struct msghdr msg;memset(&msg, 0, sizeof(msg));msg.msg_iov = iov;msg.msg_iovlen = 2;ssize_t bytes_sent = sendmsg(sockfd, &msg, 0);

sendto recvfrom

读取数据,发送数据类似于read,write

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

sockfd:标识要从中接收数据的未连接套接字文件描述符。
buf:指向一个缓冲区的指针,接收的数据将被存放在这个缓冲区中。
len:指定缓冲区的大小,即最多可以接收多少字节的数据。
flags:可选标志,控制接收操作的行为。例如,MSG_PEEK可以让数据保留在接收缓冲区中不被移除,MSG_WAITALL则请求接收所有请求的数据量。
src_addr:指向一个 struct sockaddr 类型的缓冲区,用来存放发送/接受数据的源地址信息。
addrlen:在调用前,应该设置为 src_addr 缓冲区的大小;函数返回后,会更新为实际存储的地址结构体的长度。

输出 成功为读或者写的字节数 , 出错则为-1

    char message[] = "Hello, UDP!";size_t len = strlen(message) + 1; // 包括终止的空字符struct sockaddr_in dest_addr;memset(&dest_addr, 0, sizeof(dest_addr));dest_addr.sin_family = AF_INET;inet_pton(AF_INET, "192.168.1.100", &dest_addr.sin_addr); // 目标IP地址dest_addr.sin_port = htons(12345); // 目标端口号ssize_t bytes_sent = sendto(sockfd, message, len, 0, (struct sockaddr*)&dest_addr, sizeof(dest_addr));

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

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

相关文章

第一篇【传奇开心果系列】Python的pyttsx3库技术点案例示例:文本转换语言

传奇开心果短博文系列 系列短博文目录Python的pyttsx3库技术点案例示例系列 短博文目录前言一、pyttsx3主要特点和功能介绍二、pyttsx3文字转语音操作步骤介绍三、多平台支持介绍和示例代码四、多语言支持介绍和示例代码五、自定义语言引擎介绍和示例代码六、调整语速和音量介绍…

Transformer?

Transformer模型是一种深度学习架构&#xff0c;它在2017年由Vaswani等人在论文《Attention is All You Need》中首次提出。这种架构特别适用于处理序列数据&#xff0c;如文本、音频或时间序列数据&#xff0c;因此在自然语言处理(NLP)、语音识别和时序分析等领域有着广泛的应…

姿态传感器MPU6050模块之陀螺仪、加速度计、磁力计

MEMS技术 微机电系统&#xff08;MEMS, Micro-Electro-Mechanical System&#xff09;&#xff0c;也叫做微电子机械系统、微系统、微机械等&#xff0c;指尺寸在几毫米乃至更小的高科技装置。微机电系统其内部结构一般在微米甚至纳米量级&#xff0c;是一个独立的智能系统。 微…

Win11 Android studio 打开新项目提示 Microsoft Defender configuration 问题解决

Microsoft Defender configuration The IDE has detected Microsoft Defender with Real-Time Protection enabled. It might severely degrade IDE performance. It is recommended to make sure the following paths are added to the Defender folder exclusion list 。。…

[Vue warn]: Duplicate keys detected: ‘1‘. This may cause an update error.

[Vue warn]: Duplicate keys detected: ‘1‘. This may cause an update error.——> Vue报错&#xff0c;key关键字不唯一&#xff1a; 解决办法&#xff1a;修改一下重复的id值&#xff01;&#xff01;&#xff01;

线性回归:大体介绍

线性回归是一种常见的统计学和机器学习方法&#xff0c;用于建立一个线性关系模型来预测一个连续型目标变量。它假设自变量和因变量之间存在线性关系&#xff0c;并且通过最小化预测值与实际观测值之间的差异来确定最佳拟合直线。 线性回归模型可以表示为&#xff1a;Y β0 …

IMX6ULL移植U-Boot 2022.04

目录 目录 1.编译环境以及uboot版本 2.默认编译测试 3.uboot中新增自己的开发板 3.编译测试 4.烧录测试 5.patch文件 1.编译环境以及uboot版本 宿主机Debian12u-boot版本lf_v2022.04 ; git 连接GitHub - nxp-imx/uboot-imx: i.MX U-Boot交叉编译工具gcc-arm-10.3-2021.0…

Excel导入预览与下载

&#x1f497;wei_shuo的个人主页 &#x1f4ab;wei_shuo的学习社区 &#x1f310;Hello World &#xff01; Excel导入预览与下载 preview Controller PostMapping("preview")ApiOperation("上传拒付预警预览")public Result<List<ResChargebackWa…

CFS三层靶机

参考博客&#xff1a; CFS三层内网靶场渗透记录【详细指南】 - FreeBuf网络安全行业门户 CFS三层靶机搭建及其内网渗透【附靶场环境】 | TeamsSix CFS三层网络环境靶场实战 - PANDA墨森 - 博客园 (cnblogs.com) CFS三层靶机实战--内网横向渗透 - 知乎 (zhihu.com) CFS靶机…

【图论经典题目讲解】洛谷 P2149 Elaxia的路线

P2149 Elaxia的路线 D e s c r i p t i o n \mathrm{Description} Description 给定 n n n 个点&#xff0c; m m m 条边的无向图&#xff0c;求 2 2 2 个点对间最短路的最长公共路径 S o l u t i o n \mathrm{Solution} Solution 最短路有可能不唯一&#xff0c;所以公共路…

使用正点原子i.mx6ull加载字符驱动模块chrdevbase

搞了整整两天才整好&#xff01;踩了不少坑&#xff0c;记录一下 0. 操作基础 操作前需要设置好如下配置 1.开发板和ubuntu能够互相ping通 2.开发板的SD卡中安装好uboot&#xff0c;我用的V2.4版本的&#xff0c;其他版本应该也行 3.准备材料 01_chrdevbase文件 linux-im…

Java类的加载器

package chapter03;//Java种的类主要分为3种 //1.Java核心类库种的类:String&#xff0c;0bject //2.JVM 软件平台开发商 //3.自己写的类&#xff0c;User&#xff0c;Child //类加载器也有3种 //1.BootclassLoader:启动类加载器 // 2.PlatformclassLoader:平台类加m载器 // 3.…

HCIA-HarmonyOS设备开发认证V2.0-轻量系统内核内存管理-静态内存

目录 一、内存管理二、静态内存2.1、静态内存运行机制2.2、静态内存开发流程2.3、静态内存接口2.4、实例2.5、代码分析&#xff08;待续...&#xff09;坚持就有收货 一、内存管理 内存管理模块管理系统的内存资源&#xff0c;它是操作系统的核心模块之一&#xff0c;主要包括…

蓝桥杯每日一题------背包问题(三)

前言 之前求的是在特点情况下选择一些物品让其价值最大&#xff0c;这里求的是方案数以及具体的方案。 背包问题求方案数 既然要求方案数&#xff0c;那么就需要一个新的数组来记录方案数。动态规划步骤如下&#xff0c; 定义dp数组 第一步&#xff1a;缩小规模。考虑n个物品…

Spring Boot 笔记 017 创建接口_新增文章

1.1实体类增加校验注释 1.1.1 自定义校验 1.1.1.1 自定义注解 package com.geji.anno;import com.geji.validation.StateValidation; import jakarta.validation.Constraint; import jakarta.validation.Payload; import jakarta.validation.constraints.NotEmpty;import jav…

如何使用 Python 通过代码创建图表

简介 Diagram as Code 工具允许您创建基础架构的架构图。您可以重复使用代码、测试、集成和自动化绘制图表的过程&#xff0c;这将使您能够将文档视为代码&#xff0c;并构建用于映射基础架构的流水线。您可以使用 diagrams 脚本与许多云提供商和自定义基础架构。 在本教程中…

Qt:自定义信号,信号emit,传参问题,信号槽与moc

一、自定义信号&#xff0c;信号emit 1、自定义信号 在头文件中 加入signals&#xff1a; 就可以编写信号 2、emit emit的作用是通知信号发生 二、跨UI控件传参 每次按Dialog添加按钮主控件数字会增长 // .h private slots:void on_btnAdd_clicked(); signals:void sign…

《区块链公链数据分析简易速速上手小册》第8章:实战案例研究(2024 最新版)

文章目录 8.1 案例分析&#xff1a;投资决策支持8.1.1 基础知识8.1.2 重点案例&#xff1a;股票市场趋势预测准备工作实现步骤步骤1: 加载和准备数据步骤2: 特征工程步骤3: 训练模型步骤4: 评估模型 结论 8.1.3 拓展案例 1&#xff1a;基于情感分析的投资策略准备工作实现步骤步…

C# winfrom中NPOI操作EXCEL

前言 1.整个Excel表格叫做工作表&#xff1a;WorkBook&#xff08;工作薄&#xff09;&#xff0c;包含的叫页&#xff08;工作表&#xff09;&#xff1a;Sheet&#xff1b;行&#xff1a;Row&#xff1b;单元格Cell。 2.忘了告诉大家npoi是做什么的了&#xff0c;npoi 能够读…

Node.js开发-fs模块

这里写目录标题 fs模块1) 文件写入2) 文件写入3) 文件移动与重命名4) 文件删除5) 文件夹操作6) 查看资源状态7) 相对路径问题8) __dirname fs模块 fs模块可以实现与硬盘的交互&#xff0c;例如文件的创建、删除、重命名、移动等&#xff0c;还有文件内容的写入、读取&#xff…