关于socket阻塞与非阻塞情况下的recv、send、read、write返回值及用setsockopt()来控制recv()与send()的超时

Python原生Socket工业级实战:解决粘包、TIME_WAIT、高并发等生产问题 Socket编程本质是操作系统内核I/O资源的协同调度,而非简单的API调用。其核心原理在于TCP字节流特性、内核收发缓冲区机制及四层网络栈(应用层→协议栈→驱动→物理层)间的隐式协作。技术价值体现在对连接可靠性、消息边界可控性与资源可预测性的绝对掌控,广泛应用于金融行情推送、IoT设备通信、嵌入式网关等低延迟高稳定场景。本文聚焦Python原生socket实践,深入解析SO_REUSEADDR规避TIME_WAIT、长度头方案解决粘包、select事件驱动实现3000+并发等关键能力。 阅读详情

地址转换时的htonl和inet_pton 

参数是32bit的二进制数值,在转换地址时就是32位的主机字节序ip地址(经常用点分十进制) 
用法:servaddr.sin_addr.s_addr=htonl(127.0.0.1); 
servaddr.sin_addr.s_addr=htonl(INADDR_ANY); // INADDR_ANY真实值为0.0.0.0

int inet_pton(int family,const char *strptr,void *addrptr); 
该函数完成两个功能:1.字符串->二进制数值 2.主机字节序->网络字节序(所以调用此函数后不需htonl了) 
第二个参数是ip地址字符串的指针

用法:inet_pton(AF_INET,argv[1],&servaddr.sin_addr); 
第三个参数使用&servaddr.sin_addr.s_addr也可以通过

总结:数值型的ip地址转换用htonl,字符串类型的用inet_pton

关于socket阻塞与非阻塞情况下的recv、send、read、write返回值

转自:http://blog.youkuaiyun.com/eroswang/archive/2010/06/02/5642550.aspx

1、阻塞模式与非阻塞模式下recv的返回值各代表什么意思?有没有区别?(就我目前了解阻塞与非阻塞recv返回值没有区分,都是 <0:出错,=0:连接关闭,>0接收到数据大小,特别:返回值 <0时并且(errno == EINTR || errno == EWOULDBLOCK || errno == EAGAIN)的情况下认为连接是正常的,继续接收。只是阻塞模式下recv会阻塞着接收数据,非阻塞模式下如果没有数据会返回,不会阻塞着读,因此需要 循环读取

2、阻塞模式与非阻塞模式下write的返回值各代表什么意思?有没有区别?

阻塞与非阻塞write返回值没有区分,都是 <0:出错,=0:连接关闭,>0发送数据大小,特别:返回值 <0时并且(errno == EINTR || errno == EWOULDBLOCK || errno == EAGAIN)的情况下认为连接是正常的,继续发送。只是阻塞模式下write会阻塞着发送数据,非阻塞模式下如果暂时无法发送数据会返回,不会阻塞着 write,因此需要循环发送

3、阻塞模式下read返回值 < 0 && errno != EINTR && errno != EWOULDBLOCK && errno != EAGAIN时,连接异常,需要关闭,read返回值 < 0 && (errno == EINTR || errno == EWOULDBLOCK || errno == EAGAIN)时表示没有数据,需要继续接收,如果返回值大于0表示接送到数据。

非阻塞模式下read返回值 < 0表示没有数据,= 0表示连接断开,> 0表示接收到数据。

这2种模式下的返回值是不是这么理解,有没有跟详细的理解或跟准确的说明?

4、阻塞模式与非阻塞模式下是否send返回值 < 0 && (errno == EINTR || errno == EWOULDBLOCK || errno == EAGAIN)表示暂时发送失败,需要重试,如果send返回值 <= 0, && errno != EINTR && errno != EWOULDBLOCK && errno != EAGAIN时,连接异常,需要关闭,如果send返回值 > 0则表示发送了数据?send的返回值是否这么理解,阻塞模式与非阻塞模式下send返回值=0是否都是发送失败,还是那个模式下表示暂时不可发送,需要 重发?

用setsockopt()来控制recv()与send()的超时[转]

在send(),recv()过程中有时由于网络状况等原因,收发不能预期进行,而设置收发超时控制: 
在Linux下需要注意的是时间的控制结构是struct timeval而并不是某一整型数,以下是来自于网上一篇文章中的摘录,它是这样写的: 
int nNetTimeout=1000;//1秒, 
//设置发送超时 
setsockopt(socket,SOL_SOCKET,SO_SNDTIMEO,(char *)&nNetTimeout,sizeof(int)); 
//设置接收超时 
setsockopt(socket,SOL_SOCKET,SO_RCVTIMEO,(char *)&nNetTimeout,sizeof(int)); 
这样做在Linux环境下是不会产生效果的,须如下定义:struct timeval timeout = {3,0}; 
//设置发送超时 
setsockopt(socket,SOL_SOCKET,SO_SNDTIMEO,(char *)&timeout,sizeof(struct timeval)); 
//设置接收超时 
setsockopt(socket,SOL_SOCKET,SO_RCVTIMEO,(char *)&timeout,sizeof(struct timeval)); 
有两点注意就是: 
1)recv ()的第四个参数需为MSG_WAITALL,在阻塞模式下不等到指定数目的数据不会返回,除非超时时间到。还要注意的是只要设置了接收超时,在没有MSG_WAITALL时也是有效的。说到底超时就是不让你的程序老在那儿等,到一定时间进行一次返回而已。 
2)即使等待超时时间值未到,但对方已经关闭了socket, 则此时recv()会立即返回,并收到多少数据返回多少数据。

本文来自优快云博客,转载请标明出处:http://blog.youkuaiyun.com/newger/archive/2008/05/19/2459113.aspx

C++网络编程核心:Socket API、并发模型与高性能服务器实践 网络编程是构建分布式系统的基石,它基于操作系统提供的套接字接口实现进程间通信。其核心原理在于通过TCP/IP协议栈管理数据包的可靠传输,涉及连接建立的三次握手与终止的四次挥手。这一技术的核心价值在于能够开发出高性能、高并发的服务器应用,如游戏服务器、高频交易系统和物联网网关。在实际工程中,开发者需要深入理解IO多路复用、非阻塞IO等机制来应对海量连接。本文聚焦于C++网络编程的实践,详细解析了从基础的Socket API到复杂的并发模型演进,并探讨了如何通过epoll等现代技术构建稳定高效的网络应用,其中I 阅读详情

相关推荐

C++网络编程实战:从Socket封装到事件驱动模型的设计与实现

网络编程是构建分布式系统和后端服务的核心技术基础,其核心在于通过操作系统提供的Socket API在不同主机间建立可靠或不可靠的数据通道。理解Socket的工作原理、IO模型和协议栈是掌握网络编程的关键。从基础的阻塞IO到高性能的事件驱动模型(如epoll/kqueue),技术的演进旨在解决C10K乃至C100K问题,提升系统的并发处理能力和资源利用率。在实际工程中,一个设计良好的网络抽象层能显著提升代码的可维护性和健壮性,有效处理连接管理、错误恢复和资源释放等复杂问题。本文聚焦于C++环境,通过封装原生S

weixin_30323631的博客 375

一篇文章完全搞清楚 scoket read/write 返回码、阻塞与非阻塞、异常处理

完全搞清楚 scoket read/write 返回码、阻塞与非阻塞、异常处理等让你头疼已久的问题

hellozhxy的博客 2195

套接字总结

套接字总结

zephyryz的博客 403

read函数的返回值问题

Read函数读取字符串返回值的问题 1. 前言 在学习socket编程的途中, 通过客户端给服务端发送字符串,然后服务端通过read或者recv来读取数据,然后返回读取的字节数. 我在想read返回的读取字节数有没有包含'\0'或者'\n'呢,于是通过一些简单的小例子,来看看实际情况到底如何. 2. read函数 我们来看一下read函数的原型: ssize_t read(int fd, void...

UnknownPlayer的博客 1万+

C++高性能服务器优化:从阻塞模型到非阻塞I/O多路复用实战

在网络编程中,I/O多路复用是一种核心机制,它允许单个线程高效监控和管理大量网络连接的状态变化。其原理在于通过系统调用(如epoll、kqueue)将多个文件描述符的I/O事件集中处理,当任一描述符就绪时,内核通知应用程序进行非阻塞读写,从而避免了传统阻塞模型中为每个连接创建独立线程带来的巨大资源开销和上下文切换损耗。这项技术的核心价值在于显著提升服务器的并发处理能力和资源利用率,是实现高并发、高性能网络服务(如Web服务器、实时通信系统)的基石。在C++服务器开发中,结合非阻塞I/O与事件驱动架构,能够有

weixin_33910460的博客 400

C++ Socket编程入门:从零实现Linux TCP客户端服务器通信骨架

网络编程是现代软件开发的基石,它基于TCP/IP协议栈实现不同主机间的进程通信。其核心原理是通过Socket(套接字)作为通信端点,在操作系统内核中建立虚拟连接通道,实现可靠的数据流传输。掌握Socket编程的技术价值在于能够构建高性能、可扩展的后台服务、物联网网关和分布式系统组件。在实际应用场景中,无论是Web服务器、即时通讯软件还是微服务架构,都离不开底层Socket通信的支持。本文以C++和Linux环境为例,通过实现一个基础的TCP通信模型,深入讲解Socket API的调用流程、阻塞I/O机制以及

weixin_30595035的博客 350

看过的一些博客

看过的一些博客 非阻塞socket中read、write返回值 [link](https://www.cnblogs.com/runnyu/p/5054968.html).

weixin_43886143的博客 152

C++实现阻塞式SocketCAN通信:嵌入式Linux CAN总线同步编程指南

在嵌入式系统和汽车电子领域,CAN总线作为连接控制器、传感器和执行器的关键通信网络,其稳定可靠的数据交换至关重要。Linux内核提供的SocketCAN接口将CAN设备抽象为网络套接字,使得开发者能够使用熟悉的套接字API进行通信。阻塞I/O模型作为一种同步编程范式,其原理在于让`read`或`recv`系统调用在数据未就绪时挂起进程,直至数据到达或超时,这为事件驱动的应用提供了确定性的执行流程。该技术的核心价值在于简化了程序逻辑,降低了并发编程的心智负担,尤其适用于需要严格时序控制、状态机实现或UDS诊断

germmy-神一样的开发 386

socket学习二、accept、read、write函数详解

accept、read、write函数详解

个人工作中学到的专业技术与职业发展知识笔记 4378

西门子SCL出栈入栈算法(附带源码)

栈是一种数据结构,它的特点是数据后入先出(Last In First Out,LIFO)或者说是先入后出,意思是一样的。栈有三个基本动作:初始化、入栈和出栈。接下来给大家介绍下我使用SCL语言编写的栈函数,它以不定长数组作为存储区,以实数作为数据类型,实现了栈的初始化、入栈和出栈的操作。

CHUXUEZHE8210的博客 2330

什么!!!寒假就要准备暑期实习

介绍暑期实习,从作用,时间线,投递渠道,技术准备,常见问题,经验教训几个方面介绍暑期实习

今天不coding的博客 1724

网络编程(14)非阻塞IO

套接字的默认状态是阻塞的,这就意味着当发出一个不能立即完成的套接字调用时,其进程将投入休眠,等待响应操作完成。可能阻塞的套接字分为以下四类: (1)输入操作read、readv、recv、recvform和recvmsg; (2)输出操作write、writev、send、sendto和sendmsg; (3)发起外出连接connect; (4)接受外来连接accept。

热爱生活,忠于自己 2371

Halcon异常检测训练避坑指南:如何避免GPU内存溢出和样本不足问题

本文针对Halcon深度学习异常检测训练中常见的GPU内存溢出和样本不足两大难题,提供了从原理分析到实战解决方案的深度指南。通过调整批次大小、图像尺寸、使用梯度累积等技巧有效管理显存,并利用针对性数据增强与人工合成策略破解小样本困境,帮助开发者构建稳定高效的训练流程。

river的博客 215

socket编程中的读写函数与非阻塞连接

参考文章:https://blog.youkuaiyun.com/A493203176/article/details/65438182https://www.cnblogs.com/eeexu123/p/5275783.html https://blog.youkuaiyun.com/nphyez/article/details/10268723 //非阻塞连接 https://www.cnblogs.co...

fengruoying93的专栏 1305

使用 Restart Extension 继续解决 Ansys 机械分析

您正在执行复杂或大型的多步有限元分析,突然,您意识到经过数小时的求解后,您需要添加或修改边界条件。在本篇博文中,您将了解如何利用 Ansys Mechanical 中的 RestartAnalysis 扩展来扩展多步分析,方法是合并额外的时间步骤和边界条件,而不会丢失已计算的结果。幸运的是,在 Mechanical 中,有一种直接的方法可以实现这一点,而不会损害您之前的结果,而这在添加新边界条件和使用重新启动点时经常发生。得到的结果符合预期,您可以看到施加的力产生的这两个部分之间的相对位移。

jkh920184196的博客 1232

TIA Portal (博图) -两台不同网段S7-1200通信(上)

因为不同网段意味着它们默认不在同一个广播域,并且没有网关设备来处理路由,所以标准的 TCP/IP 通信(如 `TSEND_C`/`TRCV_C`)无法直接建立连接。S7 通信 (PUT/GET): 最简单,配置好连接后,在客户端 PLC 使用 `PUT` 指令发送数据到服务器 PLC,使用 `GET` 指令从服务器 PLC 读取数据。* 在地址详细信息中,确保 本地连接端点是客户端 PLC 的接口,远程连接端点是服务器 PLC 的接口和 IP (`192.168.2.20`)。

电工 2678

linux socket msg oob,Linux Socket

0x0000 Linux Socket 函数bindlistenconnectacceptsendrecvreadwrite0x0001Server绑不上ip报错位置在bind函数[root@localhost 01]# ./server 191.168.80.151 1588191.168.80.151 : 1588Bind: Cannot assign requested addresspor...

weixin_33289151的博客 279

16、天文时间序列分类:基于人工神经网络的研究

本研究探讨了基于人工神经网络的天文时间序列分类方法,重点比较了MLP、LSTM和CNN等模型在BRITE和开普勒K2数据集上的表现。研究发现LSTM不适用于此类数据,而结合特征提取与PSO超参数优化的多层感知器(MLP)在开普勒K2数据上实现了98.55%的二分类准确率。通过精细的数据预处理和高置信度样本选择,显著提升了分类性能。研究成果为恒星变异性识别提供了高效工具,并对天文学与机器学习交叉领域具有重要参考价值。

pz8901234的博客 112

linux socket代码,Linux Socket - 基本socket链接(示例代码)

0x0000 Linux Socket 函数bindlistenconnectacceptsendrecvreadwrite0x0001Server绑不上ip报错位置在bind函数[root@localhost 01]# ./server 191.168.80.151 1588191.168.80.151 : 1588Bind: Cannot assign requested addresspor...

weixin_27734811的博客 429

深度强化学习调参技巧:以DQN、DDPG、TD3、PPO、SAC等算法为例

深度强化学习调参技巧:以D3QN、DDPG、TD3、PPO、SAC算法为例

丨汀、的博客 3443

深入理解鸿蒙输入子系统驱动:HDI接口、HAL层与内核驱动的协同机制

/ 扫描输入设备// 打开指定输入设备// 关闭指定输入设备// 获取指定设备信息// 获取所有设备列表鸿蒙输入子系统驱动采用分层架构设计,通过HDI接口层实现硬件抽象,HAL层提供统一的事件处理机制,用户空间驱动层负责设备管理和事件分发。整个系统支持多种输入设备类型,包括触摸屏、按键、鼠标、键盘等,并提供了完整的HID设备支持。分层架构:清晰的层次划分,便于维护和扩展事件驱动:基于epoll的高效事件处理机制设备管理:完善的设备生命周期管理HID支持。

m0_67505153的博客 211

Socket网络编程基础与HTTP协议实现

Socket作为网络编程的核心抽象层,通过封装TCP/IP协议栈提供类文件操作接口,是构建网络应用的基石。其双向通信特性支持数据同时收发,而家族类型(AF_INET/AF_INET6)和传输类型(SOCK_STREAM/SOCK_DGRAM)的参数选择直接影响通信模式。理解Socket工作原理后,可进一步掌握HTTP等应用层协议的本质——它们实质是通过Socket传输的格式化文本。在物联网和Web开发场景中,深入Socket层能解决自定义协议、性能调优等关键问题。现代Python生态通过asyncio和Re

weixin_34248023的博客 436

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Python TCP Socket编程实战:从基础到高并发与可靠数据传输

网络编程是构建分布式系统和网络应用的基础,其核心在于理解计算机之间如何通过协议进行可靠通信。TCP(传输控制协议)作为面向连接的可靠传输层协议,通过三次握手、确认应答和超时重传等机制,确保了数据的有序和完整送达。Socket(套接字)是操作系统提供的网络编程接口,它将复杂的协议操作封装成类似文件读写的简单API,是应用层与TCP/IP协议族通信的桥梁。掌握Socket编程对于开发聊天程序、文件传输工具乃至分布式系统都具有重要技术价值。在实际应用中,开发者常面临**消息边界**(粘包/拆包)和**高并发处理*

weixin_33744141的博客 387

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Socket编程核心:从TCP/UDP到select多路复用实战详解

网络编程是构建分布式系统和网络应用的基础,其核心在于实现不同主机间进程的数据交换。Socket(套接字)作为操作系统提供的网络编程接口,封装了底层协议细节,使应用程序能够像操作文件一样进行网络通信。从原理上看,Socket基于TCP/IP协议栈,通过IP地址标识主机、端口号标识进程,支持面向连接的TCP流式传输和无连接的UDP数据报传输。在技术价值层面,Socket编程实现了网络通信的标准化与跨平台能力,支撑了从Web服务、实时通信到物联网等广泛场景。针对高并发场景,I/O多路复用技术如select函数应运

weixin_30851867的博客 330
上一篇: c语言获取当前时间
下一篇: VC6自定义注释代码快捷键
zljjava
博客等级 码龄15年 155粉丝 15原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值