C++编程socket编程用recv函数接收,返回值为0解决方案

腾讯后端 C++一面:recv 返回值,什么错误是可接受的? 在 C/C++网络编程中,尤其是在处理 TCP 套接字时,recv函数扮演着基石般的角色。它是从连接对端读取传入数据的主要机制。recv。 阅读详情
AI摘要

本文介绍了一种在Debug模式下正常运行,但在Release模式下调用recv函数时出现返回值为0的问题。通过调整接收缓冲区长度及理解recv函数的行为,最终解决了此问题。

        先讲下背景,我需要写一个客户端,用winsock发送请求到服务器,服务器用tomcat写的,通过responseBody返回字符串作为发还给客户端的数据。

错误表现为:

        在用Visual Studio2017调试的时候,在Debug模式下,是没有任何问题的,而在Release模式下,则报错。

        错误代码如下:

    char buffer[25600];
    int resultLen = 0;
    resultLen = recv(sclient, buffer, strLen(buffer), 0);

        此时,输出resultLen,得到输出结果为 0。

         查阅资料得知,

                当recv返回值小于0时,socket报错;

                当recv返回值大于0时,成功,返回值为接收到的数据长度;

                当recv返回值等于0时,表示此时connect已经关闭,没有接收到数据。

解决:

        其实,socket在传输数据时,传递的是字节,我们在接受recv或发送send时,可以用字符串char*接受,但不能用strLen表示接受数据的长度,因为当接受的数据长度与实际长度不匹配时,socket套接字将关闭,recv返回结果自然就是0,因此我们在这里作了修改,直接使用这个缓冲区长度。

        代码如下:

	const int bufLen = 25600;
	char buffer[bufLen];
	string result = "";
	int resultLen = 0;
	resultLen = recv(sclient, buffer, bufLen, 0);

        此时,再次调试,则recv返回值为实际传输数据的长度。异常解决。

 

补充:参阅网上诸多大神的说法,在Visual Studio中,用Debug调试时,会自动帮你解决或掠过部分问题,而在Release调试时会暴露出来。

Windows C/C++ Socket 编程 作者很懒,本文没有摘要。 阅读详情

相关推荐

socket编程:recv/send 和 recv/recvfrom返回值及处理

1、recv 和 recvfrom =0 当返回值为0时,表示对端已经关闭了这个链接,我们应该自己关闭这个链接,即close(sockfd)。另外因为异步操作会用select或epoll做事件触发,所以: 1、如果使用select,应该使用FD_CLR(sockfd,fd_set)将sockfd清除掉,不再监听。 2、如果使用epoll,系统会自己将 ...

1万+

Linux网络编程:recv的返回值

recv是网络编程中用于TCP传输接收数据的接口,由于工作中一直没有接触到网络编程,虽然知道这个函数,但是没有使用经验,所有对接口细节不是很了解。 直到前阵子在项目中调试第三方的源码时,跟踪到这个函数,才发现它的返回值和我想象的不太一样。 recv函数的原型: ssize_t recv(int sockfd, void* buf, size_t len, int flags); 之前知道的是如果读取成功,会返回实际读取到的字节数,但是如果读取不到数据呢?一直想当然的认为会返回0,其实并不是,当读取不到数据

澎湖Java架构师的博客 4578

【C语言】socket编程接收问题

为客户端和服务端实现标准的健康检查API。这些API可以返回简单的状态码或更复杂的健康信息,以便监控服务可以理解被监控服务的状态。

数字人生 2397

[笔记]socket recv()函数返回0的一种情况

假设使用Socket基于TCP通信协议进行C/S通信编程,客服端已经成功与服务端建立tcp连接,并且可以正常进行收发数据。 当一段时间后,服务端的程序如果调用closesocket(sClient);WSACleanup();函数关闭socket,  那么客户端的recv()将会返回0; 如果服务端没有调用closesocket(sClient);而只调用WSACleanup();或直接关闭

zdleek的专栏 1万+

Quest 3开发第一步:搞定Meta账号登录和Oculus软件连不上设备的那些坑(2024实测)

本文详细介绍了Quest 3开发初期的关键步骤,包括Meta账号注册、Oculus软件安装与设备连接等常见问题的解决方案。针对国内开发者遇到的邮箱限制、验证码接收等难题,提供了实用的应对策略,并分享了开发环境配置和常见问题排查技巧,帮助开发者快速搭建Quest 3开发环境。

weixin_30333885的博客 501

非sudo用户如何安全使用Docker:Rootless模式实战指南

Docker Rootless模式是一种基于Linux用户命名空间(userns)的容器运行时安全机制,它通过UID/GID映射、fuse-overlayfs文件系统和slirp4netns网络栈,在不提升权限的前提下实现容器隔离。其核心原理是将容器内root身份映射为宿主机非特权用户,从而规避docker组等价root的安全风险。相比传统root模式,Rootless在权限控制、逃逸防护和多租户隔离方面具备天然优势,适用于CI/CD流水线、Kubernetes边缘节点及受限生产环境。本文聚焦无sudo权限

weixin_30274627的博客 351

recv函数返回值总结

函数原型:int recv( SOCKET s, char *buf, int len, int flags) 功能:不论是客户还是服务器应用程序都用recv函数从TCP连接的另一端接收数据。 参数一:指定接收端套接字描述符; 参数二:指明一个缓冲区,该缓冲区用来存放recv函数接收到的数据; 参数三:指明buf的长度; 参数四 :一般置为0。 阻塞与非阻塞recv返回值没有区分,都...

qinrenzhi的博客 1622

智能驾驶功能软件平台设计规范 第一部分:系统架构

智能驾驶功能软件平台设计规范 第一部分:系统架构2020-07-29 发布。

爱是与世界平行 6746

C++ Socket send recv 循环发送和接收 阻塞与缓冲区

重点:socket数据发送与接收问题 数据的发送和接收是独立的,并不是发送方执行一次send,接收方就执行以此recv。recv函数不管发送几次,都会从输入缓冲区尽可能多的获取数据。如果发送方发送了多次信息,接收方没来得及进行recv,则数据堆积在输入缓冲区中,取数据的时候会都取出来。换句话说,recv并不能判断数据包的结束位置。 send函数:  在数据进行发送的时候,需要先检查输出缓冲区的...

T的专栏 4903

Palabos User Guide中文解读 | 第五章 | Palabos编程 (跳过了第四章Palabos-Java接口)

作者的话:本人在学习palabos时,发现国内中文资料甚少,恰好网上可以直接搜到palabos user guide这种英文资料,加之时间充裕,便打算开始翻译,翻了一节后发现这可能算侵权,就比较伤脑筋,突然想到自己写中文解读即可,便有了下面的博客。 Palabos User Guide Release 1.0 r1 Copyright © 2019 University of Geneva Jul...

Yulan Fang's notes. 2298

电商智能客服Agent开发实战:从零到一构建企业级AI助手

电商智能客服Agent是下一代AI应用的核心形态,它不仅能够回答用户问题,还能自主规划任务、调用工具并执行完整工作流程。本文将深入探讨AI Agent的基本概念、技术实现方式及电商场景中的应用,提供完整的开发流程和代码示例,帮助开发者从零开始构建一个功能强大的电商智能客服系统。通过模块化设计、多轮对话记忆管理和工具集成,这个Agent能够处理订单查询、商品推荐、退换货流程等复杂任务,同时具备企业级的安全性和稳定性保障。通过本文的介绍,读者已经掌握了构建电商智能客服Agent的核心技术与实现方法。

m0_64363449的博客 1366

c++ socket、 listen、accept、recv 、send、 connect函数记录

c++ socket函数

qq_42176731的博客 3770

Halcon 3D视觉实战:5步将线激光高度数据转为可分析的深度图与点云

本文详细介绍了如何利用Halcon平台将线激光高度数据转换为深度图与点云的5步实战方法。通过具体代码示例和工业检测案例(如锂电池胶水测量),帮助工程师高效处理3D视觉数据,实现从原始数据到三维可视化的完整技术链路。

weixin_29039773的博客 361

recv函数返回值说明

recv函数 int recv( SOCKET s, char FAR *buf, int len, int flags); 不论是客户还是服务器应用程序都用recv函数从TCP连接的另一端接收数据。该函数的第一个参数指定接收端套接字描述符; 第二个参数指明一个缓冲区,该缓冲区用来存放recv函数接收到的数据; 第三个参数指明buf的长度; 第四个参数一般置0。 这里只描述同步Socket的

tiandyoin的专栏 10万+

vasp-自旋轨道耦合(SOC)计算步骤

在VASP中执行自旋轨道耦合(SOC)计算,具体的计算步骤如下: 结构优化获取CONTCAR文件 自洽计算(collinear normal VASP calculations)获取IBZKPT,CHGCAR和WAVECAR文件。 SCF+SOC计算,在此步骤中,将步骤2中的IBZKPT复制为KPOINTS,以便两个步骤具有相同的k网格,因此可以读取步骤2中的CHGCAR和WAVECAR文件。 能带结构计算,在此步骤中,将KPOINTS改为高对称点,读取步骤3中的CHGCAR和WAVECAR文件。

懒散的鱼与消失的猫 3万+

092、多sensor帧同步在环视系统中的实现——基于瑞芯微RK3588的PPS同步与曝光同步方案

摘要: 本文探讨了瑞芯微RK3588平台在360环视系统中实现多摄像头帧同步的技术方案。针对环视拼接常见的动态场景错位问题,提出了PPS同步与曝光同步相结合的解决方案。通过GPIO硬件触发实现四路摄像头同步曝光,配合I2C全局曝光控制,将时间误差控制在0.5ms内。文章详细解析了RK3588设备树配置、内核驱动实现中的关键细节,包括同步信号处理、寄存器原子写入等核心技术点,并分享了量产中遇到的温度漂移、信号完整性等实际问题及解决方法。最终通过硬件整形和电源优化,将同步抖动控制在±5μs以内,有效解决了动态拼

zzfmlxs的博客 34

recv() 的返回值

recv函数 int recv( SOCKET s, char FAR *buf, int len, int flags); 不论是客户还是服务器应用程序都用recv函数从TCP连接的另一端接收数据。该函数的第一个参数指定接收端套接字描述符; 第二个参数指明一个缓冲区,该缓冲区用来存放recv函数接收到的数据; 第三个参数指明buf的长度; 第四个参数一般置0。 这里只描述同步So

人生代码,代码人生。。。 1023

lwip-2.0.3

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

recv函数的返回值测试

在本文中, 我们来关注recv函数何时返回? 返回啥? 我们先看服务端程序: #include #include // winsock接口 #pragma comment(lib, "ws2_32.lib") // winsock实现 int main() { WORD wVersionRequested; // 双字节,winsock库的版本 WSADATA wsa

认知 行动 坚持 9500

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

Linux网络编程--recv函数返回值详解

转载地址:http://www.cnblogs.com/Genesis-007/p/5190552.html 说明: 文中红色部分是我的备注 函数原型: 1 ssize_t recv( int sockfd,? void *buf,? size_t len,? int flags); 该函数第一个参数制定接收端套接字描述符; 第二个参数指明一个缓冲区,该缓冲区用来存放recv函数接收到的数据; 第三个参数指明缓冲区buf的长度; 第四个参数一般置0; (标志位) recv函数返回其实际copy的字节数(第四

m0_67391377的博客 1337

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

send()和recv()函数详解(send返回值举例)

转载:send()和recv()函数详解_weixin_34281537的博客-优快云博客 不论是客户还是服务器应用程序都用send函数来向TCP连接的另一端发送数据。客户程序一般用send函数向服务器发送请求,而服务器则通常用send函数来向客户程序发送应答。 该函数的参数:这里只描述同步Socket的send函数的执行流程。当调用该函数时:(1) send先比较待发送数据的长度len和套接字s的发送缓冲区的长度,如果len大于s的发送缓冲区的长度,该函数返回 SOCKET_ERROR;(2) 如果

modi000的博客 5450

c++使用socket编程小demo

注意:此代码是在window平台下;linux需要自己更改部分代码,本文尽可能的使用c++标准所支持的规范来编写; 一、简单介绍socket编程所需要使用的函数 1:socket函数 int sock(int af, int type, int protocol); /* * 作用:创建一个socket * * 参数: * af: (address family)常见的一般有AF...

qq_34236354的博客 1662

C++ socket Recv()函数

int processor(SOCKET _clientSock) { //第一次接受一个缓冲数据 char szRecv[1024] = {}; //5.接收客户端数据 //第一次收了header的数据包,只剩下CMD的数据长度,指针移动到数据包包体位置 //这里szRECV被接收到了有DataHeader的长度。数据仍在recv中储存,没有改变recv的数据大小,只是从recv开头中取了dataheader的大小的数据 //如果是szRecv那就默认从szRecv【0】的位置开始储存 Dat

guanxunmeng8928的博客 5269

socket数据的发送和接收

下文对计算机socket编程的讲解通俗易懂,对我自己回顾以前的知识,以及学习很有帮助,感谢原作的分享!在此转载。 原文地址:http://c.biancheng.net/cpp/html/3037.html 在 Linux 和 Windows 平台下,使用不同的函数发送和接收 socket 数据,下面我们分别讲解。 Linux下数据的接收和发送 Linux 不区分套接字文件和普通文件,使用...

积累点滴,保持自我 4358

VC++的Socket中send函数和recv函数详解

Socket send函数和recv函数详解 send函数 int send( SOCKET s, const char FAR *buf, int len, int flags ); 不论是客户还是服务器应用程序都用send函数来向TCP连接的另一端发送数据。 客户程序一般用send函数向服务器发送请求,而服务器则通常用send...

weixin_33682719的博客 810

Socket中send()函数和recv()函数详解

1、send函数 int send( SOCKET s, const char FAR *buf, int len, int flags ); 不论是客户还是服务器应用程序都用send函数来向TCP连接的另一端发送数据。 客户程序一般用send函数向服务器发送请求,而服务器则通常用send函数来向客户程序发送应答。 (1)第一个参数指定发送端套接字描述符; (2)第二个参数指明一个存放应...

2328

Socket 中的send函数和recv函数

1.send 函数 int send( SOCKET s, const char FAR *buf, int len, int flags );       不论是客户还是服务器应用程序都用send函数来向TCP连接的另一端发送数据。客户程序一般用send函数向服务器发送请求,而服务器则通常用send函数来向客户程序发送应答。     该函数的第一个参数指定发送端套接

tkp2014的专栏 443
上一篇: Java在不同系统中的回车换行
下一篇: SSM框架(SpringMVC+spring+mybatis)原理
CCCAAAAFFFFF
博客等级 码龄10年 5粉丝 27原创
评论 6
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值