UNIX网络编程之常用函数

AUTOSAR内存篇 -内存驱动(Mem) Mem驱动程序的task是基于底层内存设备技术的物理分段的低级内存访问。Mem驱动程序的API与内存设备技术无关,因此向存储器访问模块上层提供了与存储器设备无关的接口。所有高级功能(如跨段操作)都由内存访问模块处理,以尽可能降低Mem驱动器的复杂性和占用空间。Mem驱动API命名、类型定义和文件命名规则都遵循标准的AUTUSAR BSW模块实现。服务Mem_Init初始化Mem驱动的内部状态,并设置Mem驱动Job处理状态到MEM_JOB_OK。 阅读详情
1. 字节序转换函数
头文件<netinet/ih.h>
uint16_t htons(uint16_t host16bitvalue);
uint32_t htonl(uint32_t host32bitvalue);
uint16_t ntohs(uint16_t net16bitvalue);
uint32_t ntohl(uint32_t net32bitvalue);
2. 地址转换函数
头文件<arpa/inet.h>
2.1. IPv4定义的地址转换函数
//将ASCII字符串表示的点分十进制地址字符串转换为32-bit的网络字节序地址
//即转换后的地址即是网络字节序(big-endian)的32-bit整数
int inet_aton(const char *strptr,struct in_addr *addrptr);
//同inet_aton函数,区别在于255.255.255.255这个地址从编址上来说是一个
//合法的地址,但此函数返回错误,认为不合法
in_addr_t inet_addr(const char *strptr);
//功能与inet_aton正好相反
char* inet_ntoa(struct int_addr* inaddr);
2.2 IPv6定义的地址转换函数,兼容IPv4
//将ASCII字符串表示的点分十进制地址字符串转换为32-bit的网络字节序地址
int inet_pton(int family,const char* strptr,void *addrptr);
转换成功返回1,失败返回0
//与inet_pton正好相反
const char *inet_ntop(int family,const void *addrptr,char* strptr,size_t len);
注意strptr长度,建议为IPv4长度16,IPv6长度46,外部分配空间。如果成功,
返回值为strptr
其中"p"意指presentation的意思,"n"意指numericf
family为AF_INET或AF_INET6
3. 基本TCP套接字函数
头文件<sys/socket.h>
3.1 套接字对象创建函数socket(UDP也使用)
int socket(int family,int type,int protocol);
family:地址族,IPv4下编程用AF_INET
type:数据报类型
protocol:传输层协议类型:IPPROTO_TCP、IPPROTO_UDP、IPPROTO_SCTP
如果protocol设置为0,则将根据family和type的类型默认一个值,如
family为AF_INET,type为SOCK_STREAM,则默认为TCP协议,若type为SOCK_DGRAM,
则默认为UDP协议,注意:family与type的组合一定要是有效的,并非所有组合都是有效的。
如果创建成功,其返回一个很小的非负整数值,即大于等于0的数。
3.2 客户端connect函数
int connect(int sockfd,struct sockaddr* servaddr,socklen_t addrlen);
返回0表示成功,返回-1表失败,函数在连接成功,或者出现连接错后才返回。
TCP的三次握手在此函数中完成,函数成功返回0则已建立连接。如果从某个路由器回应了
一个"主机不可达"的ICMP错误,说明服务器没监听,或者地址有错,在有些异步连接的
情况下,函数立即返回,就需要根据具体的错误号作处理。
3.3 bind函数,绑定一个协议地址到一个套接字。
协议地址由一个IPv4地址或IPv6地址和一个公开的端口号组成。
int bind(int sockfd,const struct sockaddr *myaddr,socklen_t addrlen);
如果客户端或服务端没有调用此函数,则在客户端在调用connect或服务端调用listen
函数的时候,内核会自动分配一个临时端口号。一般来说,客户端无需调用,而由服务端调用。
如果在调用bind函数时,公开端口号设置为0,则内核分配一个临时端口号,如果IP地址写为0,
则由内核分配IP地址。
3.4 listen函数
int listen(int sockfd,int backlog);
主要是对backlog的理解,内核维持连接数队列的最大值。
内核维持着两个队列,一个是未完成连接的队列,即收到了SYN请求,但未完成三次握手,
另一个是已完成了三次握手的队列,即正式建立连接的队列,其状态均为ESTABLISHED。
注意不要把backlog设置为0,因为不同的系统对此值的实现是不一样的,由于历史原因,
有的代码设置为5,因为早期的网络应用并发量不大,可以满足需求,为了满足大并发量的需求,
如果新的操作系统或内核支持,应将backlog设置为更大,比如187-192之间。如果设置的值大于
内核支持的最大值,则系统自动切掉越出的值而不会报错,至于究竟要设置为多大没有一个标准。
如果两个队列已满(任何一个),则新来的SYN请求将被忽略而不发出任何回应,客户端只有超时重试。
如果还没有调用accept取出连接,但连接队列里的连接已有数据到来,则系统应该提供一个队列存放
到处来的数据,直到队列缓冲区满,此时,由于滑动窗口的作用,客户端不再发送数据,直到服务端
处理数据后可以接收数据。
3.5 accept函数
int accept(int sockfd,struct sockaddr * cliaddr,socklen_t *addrlen);

其中sockfd为监听套接字描述符,struct cliaddr为客户端地址如果对客户端地址不感兴趣,则将后面两参数设置为NULL,返回值为客户端套接字描述符。注意一个SOCKET选项TCP_DEFER_ACCEPT(linux中的选项)(FreeBSD中为SO_ACCEPTFILTER)defer accept,从字面上理解是推迟accept,实际上是当接收到第一个数据之后,才会创建连接。对于像HTTP等非交互式的服务器,这个很有意义,可以用来防御空连接攻击(只是建立连接,但是不发送任何数据)。

使用方法如下:

val = 5;
setsockopt(srv_socket->fd, SOL_TCP, TCP_DEFER_ACCEPT, &val, sizeof(val)) ; 
里面 val 的单位是秒,注意如果打开这个功能,kernel 在 val 秒之内还没有收到数据,不会继续唤醒进程,而是直接丢弃连接。
如果服务器设置TCP_DEFER_ACCEPT选项后,服务器受到一个CONNECT请求后,三次握手之后,新的socket状态依然为SYN_RECV,而不是ESTABLISHED,操作系统不会Accept。
由于设置TCP_DEFER_ACCEPT选项之后,三次握手后状态没有达到ESTABLISHED,而是SYN_RECV。这个时候,如果客户端一直没有发送"数据"报文,服务器将重传SYN/ACK报文,
重传次数受net.ipv4.tcp_synack_retries参数控制,达到重传次数之后,才会再次进行setsockopt中设置的超时值,因此会出现SYN_RECV生存时间比设置值大一些的情况。


3.6 close函数
3.6 close函数
头文件<unistd.h>
int close(int sockfd);
调用close后,默认的做法是将套接字标记为关闭并立即返回,此后套接字标识符视为无效不再使用。
因TCP底层试图发送任何放在缓冲区的未发出数据,在close调用后,TCP连接就进入了四次挥手的中止环节。
如果要改变这种默认做法,必须要设置SO_LINGER选项。注意,调用close一次,其实是其引用记数减1,只
有当其引用记数减为0时,才真正的关闭套接字。关闭套接字后,未发送的数据继续发送到对方,但未读取的数据
将丢弃。
3.7 shutdown函数
头文件<sys/socket.h>
int shutdown(int sockfd,int howto);
正常中止一个连接是调用close函数,但是,调用shutdown函数可以避免调用close带来的两个限制。
1) 调用close只是减少了文件描述符的引用次数,仅当引用次数为零时才真正关闭连接,调用shutdown
可以立即初始化TCP连接的正常中止序列而不用考虑引用计数;
2) 调用close只能同时中止双向的连接,此时,如果对端还有数据需要发送过来,我们也无法接收。
shutdown函数的行为取决于howto参数
SHUT_RD:关闭读操作,任何调用读的操作都会失败,仍然保留到socket缓冲区中的数据将被丢弃。
SHUT_WR:关闭写操作,任何调用写的操作都会失败,但保留到socket缓冲区中未发出的数据将被
发送出去,并在最后一包数据的后面加上正常连接中止序列,调用此方法后无错误,则可确保数据
全部发送到对端。
SHUT_RDWR:相当于调用了两次shudown,一次SHUT_RD,一次SHUT_WR。
注意事项:在调用shutdown函数后,对于发送端(暂定为客户端),只能保证数据发送到了对端(暂订为服务端)并收到了应答,并不表明服务端已调用了read函数从缓冲区中读出了数据,如果需要明确知道服务端已读取了数据,需要在两端做一个简单的处理,即客户端在调用shutdown时,使用SHUT_WR参数以确保数据全部发出,但不关闭接收端,在shutdown后再调用read函数等待服务端正常关闭,当服务端read函数后,正常关闭连接,此时我们的客户端read会返回0,表明服务端读取了数据并处理,这实际上是利用了TCP协议的特点从应用的角度解决我们的问题。



















【人工智能】大模型可以分为L0层:基础大模型/通用大模型、L1层:行业大模型、L2层:细分场景模型三个层级 大模型确实可以分为L0、L1、L2三个层级,这种分层架构不仅有助于提升模型的泛化能力和适应性,还能更好地满足不同行业和场景的需求。华为盘古大模型的分层架构(L0、L1、L2)在多个证据中得到了详细描述和验证。例如,华为云盘古大模型3.0明确分为L0基础大模型、L1行业大模型和L2场景模型三层架构。此外,其他来源也一致支持这一分层架构,如用友网络的企业服务大模型、智谱AI的GLM-4系列等。 阅读详情

相关推荐

机械臂速成小指南(八):标准DH法实战——从连杆坐标系到运动学方程

本文详细介绍了机械臂运动学建模中的标准DH法,从连杆坐标系的建立到运动学方程的求解,提供了实用的操作步骤和代码示例。通过DH参数表和变换矩阵的构建,帮助读者快速掌握机械臂运动学建模的核心技术,并解决实际应用中的常见问题。

oo7890的博客 211

Unix网络编程常用函数深度解析(干货)

linux网络编程常用函数说明connect函数int connect (int sockfd,struct sockaddr * serv_addr,int addrl...

shenjian58的博客 264

GIS小白也能看懂的实战:5步教你将ArcGIS里的等高线和水系完美导入CAD做规划图

本文详细介绍了如何将ArcGIS中的等高线和水系数据高效导入CAD,制作专业规划底图的5个关键步骤。从数据准备、ArcGIS处理到CAD优化,涵盖坐标系设置、数据裁剪、格式转换等实用技巧,特别适合设计规划领域的新手快速掌握GIS与CAD协同工作流程。

weixin_27966471的博客 426

UNIX常用系统函数

getopt(分析命令行参数) 相关函数 表头文件 #include定义函数 int getopt(int argc,char * const argv[ ],const char * optstring);函数说明 getopt()用来分析命令行参数。参数argc和argv是由main()传递的参数个数和内容。参数optstring 则代表欲处理的选项字符串。此函数会返回在argv

flingblue的专栏 3744

Abaqus梁模型仿真中的常见陷阱与优化策略

本文深入探讨了Abaqus梁模型仿真中的常见陷阱与优化策略,涵盖几何建模、材料属性设置、边界条件处理等关键环节。针对梁截面方向定义、网格划分、复合截面建模等典型问题,提供了实用的Python脚本示例和优化方案,帮助工程师避免计算错误并提升仿真精度。文章特别强调了动力分析中的网格密度要求和材料非线性考虑,为复杂工程应用提供专业指导。

weixin_29099217的博客 462

逆向实战:基于内存态匿名段分析的 DexProtector 检测绕过策略

本文深入探讨了针对DexProtector加固方案的Frida检测绕过策略。通过分析运行时动态加载到匿名内存段的核心检测逻辑,提出了一套基于内存态分析、定位并转储匿名可执行段,进而通过精准Hook与“等式化替换”等技术实现稳定绕过的实战方法。该方法不仅适用于DexProtector,也对采用类似内存隐藏技术的加固方案具有参考价值。

ik678901的博客 516

socket技术详解(看清socket编程)

socket编程是网络常用的编程,我们通过在网络中创建socket关键字来实现网络间的通信,通过收集大量的资料,通过这一章节,充分的了解socket编程,文章用引用了大量大神的分析,加上自己的理解,做个总结性的文章

季风博客 4万+

星网锐捷语音网关密码重置恢复出厂设置

星网锐捷语音网关---密码重置 第一种星网锐捷SVX网关恢复出厂设置的方法 eth1口 任意口插网线,连接电脑并设置电脑固定ip为: 一, 二 网页输入: 192.168.88.86 admin 默认密码 admin 登陆。 忘记密码 可通过以下方法重置: 三: 通过crt或者 shell工具 ,连接 root@192.168.88.86 连续输入两次 passwd a12345678 reboot重启后。通过账号 密码 a12345678 即可登陆系...

cibazhanji2176的博客 1万+

unix网络编程的基本函数

一 socket #include int     socket(int family,int type,int protocol); 返回:若成功则为套接字描述符,若出错则返回-1. 说明:family参数指明协议族,type参数指明套接字类型,protocol参数应设为某个协议类型常值,或设为0以选择所给定family和type组合的系统默认值。

xu_ya_fei的专栏 591

YOLOv8与注意力机制融合:EMA(高效多维注意力)的原理剖析与实战应用

本文介绍了如何在YOLOv8目标检测模型中集成EMA(高效多尺度注意力)机制。主要内容包括:EMA注意力机制的工作原理解析,展示其多尺度特征融合和高效计算特性;详细的环境配置与依赖安装指南;EMA模块的完整代码实现,包含分组处理、空间注意力权重计算和特征融合等关键步骤;以及将EMA集成到YOLOv8网络结构的方法。通过添加EMA模块,可以提升模型对关键特征的关注能力,有效抑制背景干扰,从而增强目标检测性能。本教程提供了从原理到实现的完整解决方案。

m0_64661770的博客 147

【第48例】BLM模型之市场洞察-五看工具篇(一)

BLM市场洞察

产品线负责人 2112

Linux中网络编程常用函数详解

本片博客主要介绍TCP编程,包括TCP常用函数的介绍,以及实例演示 1、函数说明 在编程总常用的基本函数有socket()、bind()、listen()、accept()、send()、sendto()、recvfrom()等,下面开始介绍这些函数的功能以及使用方法: soscket():该函数用于创建一个套接字,同时指定协议与类型。socket返回的fd叫做监听fd,是用来监听客户端的,...

David_361的博客 748

CMake是什么?为什么学习CMake

CMake的主要作用和重要性,包括其在跨平台构建中的应用、如何支持多种编译器及操作系统,以及它在管理大型和复杂项目中的优势。

小鱼酱的博客 3872

unix 网络编程常用函数

概述socket() --得到文件描述符!bind() --我们在哪个端口?connect() --Hello!listen() --有人给我打电话吗?accept() --"Thank you for calling port 3490."send() 和 recv() --Talk to me, baby!sendto() 和 recvfrom() --Talk to me, DGRAM-

stone_kingnet的专栏 1329

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

unix网络编程常用函数详解

基本TCP客户-服务器程序的套接口函数如下图: 1、socket函数 原型:#include int socket(int family, int type, int protocol); 返回值:非负描述符--成功, -1--出错; 作用:指定期望的通信协议接口(TCP或UDP或unix域字节协议等) family 指明协议簇 族 解释 AF_INET

skylinesky的专栏 1195

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

Unix网络编程(一)基本字段和常用函数

Unix网络编程(一)基本字段和常用函数

Fan_wcing的专栏 464

unix网络编程:大端小端、常用的函数细节、inetd介绍、select函数到epoll函数的变化

大端和小端 这个概念一般会在体系结构中碰到,我们所常用的x86架构的系统都是采取小端存储方式,而68K架构的系统都是采取大端存储方式。 小端的存储方式看起来不是很好看,先存低位数据到低地址,因此看过去是反的。大端存储方式看起来容易理解,就是正常顺序,先存高位数据到低地址。 不同机器采取的存储方式不同,在网络通信中数据也难以判断是哪种存储方式的。因此也出了一个统一的规定,在网络上数据必须按照大端的字节序传输。 我们在进行网络编程时都会用到字节序有关的库函数 <netinet/in.h>

MarksSa的博客 772

UNIX环境高级编程——网络编程常用函数及结构

IP地址的转换#include  int inet_aton(const char *strptr,                    struct in_addr *addrptr);//将strptr字符串转换成32位的网络字节序(二进制值--a.b.c.d->32)。int_addr_t inet_addr(const char *strptr)//功能通上,返回地址。in_addr a

ctthuangcheng 1845

网络编程 常用调试测试工具 网络信息检索函数 OOB带外数据和广播、组播 UNIX域套接字

网络编程第六天 文章目录网络编程第六天一、常用调试测试工具二、网络信息检索函数三、网络属性设置四、网络超时五、OOB带外数据和广播、组播广播组播网络地址六、UNIX域套接字服务器端客户端 一、常用调试测试工具 使用telnet测试TCP服务器端 使用lsof 使用tcpdump 使用netstat 使用sniffer 使用wireshark Chariot … SmartBit—硬件 二、网络信息检索函数 gethostname() 获得主机名 getpeername() 获得与套接口相连的远程协议地址

Qt历险记,专注Qt技术,三年医疗设备研发经验,1年机器视觉研发经验,半年柔性传感研发经验。 2381

Unix网络编程(二)套接字地址结构常用函数

注明:本文为学习经验的总结,绝大部分引用自Unix网络编程卷一,有错误或者交流意见请发邮件至yb.zhaoyubo@gmail.com.非常感谢 上篇文章简单介绍了几个金

zhaoyubo的专栏 700

unix网络编程(一) 封装常用的socket函数

sever端socket连接的流程:创建socket ====> 绑定ip和端口 ====> 监听listen ====> 接受连接accept。由于上述流程是通用的,过程中还有大量的错误判断和网络字节序的转换,因此封装成一些函数方便调用。其中accpet易受信号中断和软件中断,使用goto语句,在中断时再次accept。

qq_55796594的博客 448

unix网络编程中的包裹函数

以下是unix网络编程中的包裹函数,同样适用与windows 编程: Writen 和Readn   等等 /* include readn */ #include "unp.h" ssize_t      /* Read "n" bytes from a descriptor. */ readn(int fd, void *vptr, size_t n) {  size_t n

1739

UNIX网络编程卷1:套接字联网-第3章:套接字编程-常用函数

1.字节排序 2.字节操纵 3.地址转换 4.读写函数

tiankong_的博客 466

包裹函数

一下是unix网络编程中的包裹函数,同样适用与windows 编程:Writen 和Readn   等等/* include readn */#include "unp.h"ssize_t      /* Read "n" bytes from a descriptor. */readn(int fd, void *vptr, size_t n){ size_t nleft; ssiz

aobai219的专栏 1913
上一篇: UNIX网络编程之字节序及转换
下一篇: Windows时间CTime与SYSTEMETIME格式化
ComputerInBook
博客等级 码龄19年 1168粉丝 464原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值