recv返回值----任意长度的可读的数据

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

一、客户端代码

#include <sys/types.h>

#include <sys/socket.h>
#include <stdio.h>
#include <sys/un.h>
#include <unistd.h>
#include <stdlib.h>
#include <iostream>

using namespace std;

int main (int argc, char *argv[])
{
        struct sockaddr_un address;
        int sockfd;
        int len;
        int result;
        char buffer[5000] = {0};
        int rc = 0;


        if ((sockfd = socket(AF_UNIX, SOCK_STREAM, 0)) == -1) {
                perror ("socket");
                exit (EXIT_FAILURE);
        }

        address.sun_family = AF_UNIX;
        strcpy (address.sun_path, "server_socket");
        len = sizeof (address);


        result = connect (sockfd, (struct sockaddr *)&address, len);
        if (result == -1) {
                printf ("ensure the server is up\n");
                perror ("connect");
                exit (EXIT_FAILURE);
        }

        unsigned int sum = 0;
        while(1) {
                rc = recv(sockfd, buffer, 4096, 0);
                if (0 >= rc) {
                    cout << "rc is less than or equal to 0" << endl;
                    cout << "sum is : " << sum << endl;
                    return 0;
                }

                sum += rc;
                if (rc < 4096) {
                        cout << "rc is : " << rc << endl;
                }
        }

        return 0;
}


二、服务端代码

#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <sys/un.h>
#include <unistd.h>
#include <stdlib.h>
#include <iostream>

using namespace std;

#define COUNT 5000000

int main (int argc, char *argv[])
{
        int server_sockfd, client_sockfd;
        int server_len, client_len;
        struct sockaddr_un server_address;
        struct sockaddr_un client_address;
        int i, bytes;
        char ch_send, ch_recv;
        unlink ("server_socket");

        server_sockfd = socket (AF_UNIX, SOCK_STREAM, 0);

        server_address.sun_family = AF_UNIX;

        strcpy (server_address.sun_path, "server_socket");

        server_len = sizeof (server_address);

        bind (server_sockfd, (struct sockaddr *)&server_address, server_len);

        listen (server_sockfd, 5);
        printf ("Server is waiting for client connect...\n");
        client_len = sizeof (client_address);


        client_sockfd = accept (server_sockfd, (struct sockaddr *)&server_address, (socklen_t *)&client_len);
        if (client_sockfd == -1) {
                perror ("accept");
                exit (EXIT_FAILURE);
        }

        char buffer[COUNT] = {0};
        memset(buffer, 'a', COUNT);

        if ((bytes = write (client_sockfd, buffer, COUNT)) == -1) {
                printf ("Failed to write data...\n");

        }
        cout << "written bytes is : " << bytes << endl;

        close (client_sockfd);
        unlink ("server socket");
}

三、执行测试

先执行server程序,然后再启动客户端程序,结果如下:
#./server
Server is waiting for client connect...
written bytes is : 5000000

# ./client
rc is : 4032
rc is : 4032
rc is : 4032
rc is : 4032
rc is : 4032
rc is : 4032
rc is : 4032
rc is : 4032
rc is : 4032
rc is : 4032
rc is : 4032
rc is : 4032
rc is : 4032
rc is : 4032
rc is : 4032
rc is : 3776
rc is : 3776
rc is : 3776
rc is : 3776
rc is : 3776
rc is : 3776
rc is : 3776
rc is : 3776
rc is : 3776
rc is : 3776
rc is : 4032
rc is : 4032
rc is : 4032
rc is : 4032
rc is : 4032
rc is : 4032
rc is : 4032
rc is : 4032
rc is : 3456
rc is less than or equal to 0
sum is : 5000000


可见,server端发送一次数据后,client在recv时指定期望长度4096,则循环接收数据的时候,绝大多数recv返回值是4096,但是可能间或收到的小于4096,即出现返回值为4096和小于4096的值交替的情况。故而验证了,recv确实是返回当前任意长度的可读的数据。

The receive calls normally return any  data  available,up to the requested amount, rather than waiting for receipt of the full amount requested.

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

相关推荐

recv函数是Linux网络编程中的“数据接收员“

recv函数:Linux网络编程的数据接收核心 recv是Linux网络编程中从已连接套接字读取数据的关键函数,其工作模式类似邮递员取信: 基本功能:从指定套接字接收数据到缓冲区,返回实际读取的字节数(>0)、连接关闭状态(=0)或错误(-1) 工作模式: 阻塞模式(默认):等待数据到达 非阻塞模式(MSG_DONTWAIT):立即返回检查结果 预览模式(MSG_PEEK):查看但不移除数据 核心参数:套接字描述符、接收缓冲区、缓冲区长度及控制标志。需配合错误处理(errno)使用,常见错误包括EAG

weixin_42108533的博客 1156

[进阶] --- Python3 异步编程详解(史上最全篇)

[进阶] - Python3 异步编程详解:https://blog.youkuaiyun.com/lu8000/article/details/45025987 参考:http://aosabook.org/en/500L/a-web-crawler-with-asyncio-coroutines.html 木风卜雨:https://blog.youkuaiyun.com...

墨鱼菜鸡 3582

ARM双核锁步DCLS Lockstep技术研究(FPGA实现)

基于《Applying Dual-Core Lockstep in Embedded Processors to Mitigate Radiation-induced Soft Errors》文章总结 RISC-V双核锁步DCLS Lockstep技术参考之前文章: RISC-V双核锁步DCLS Lockstep技术总结_远古架构师alanwu的博客-优快云博客https://blog.youkuaiyun.com/heyuming20062007/article/details/123329537ARM+RIS

heyuming20062007的博客 8726

tcp socket 的 recv 如何接收指定长度消息?

有时候,tcp socket一定要接收到指定的字节数才算符合预期,那怎么实现呢?在很多网络编程的书中都有介绍,一起来看看(一直循环接受,达标为止):

认知 行动 坚持 2016

带你一分钟了解电感与磁珠的区别

在电路设计中会经常使用到电感和磁珠,虽然在电路中的作用有所不同,但它们都属于磁性电子元器件,本文简单介绍下电感和磁珠的区别电感和磁珠电感和磁珠的结构主要由磁性材料金属线圈和外壳组成,具体结构如下图所示:电感磁珠结构图电感其实是金属线圈缠绕在磁芯上,而磁珠是在内部折叠后外围包裹着铁氧体磁性材料。电感器(Inductor)又称扼流器、电抗器、动态电抗器是储能器件,能够把电能转化为磁能而存储起来的元件。磁珠则是能量转换(消耗)器件,将流过他的高频信号以热能的形式消耗掉。

攻城狮鹏哥 1408

VESC电调高级调参指南:电机校准与性能优化实战解析

本文详细解析了VESC电调的高级调参方法,包括电机校准与性能优化实战技巧。从基础参数设置到高级机械参数优化,再到动态性能调优,提供了全面的调参指南。特别针对电机类型、功率设置、电池参数配置等关键环节给出实用建议,帮助用户充分发挥VESC电调的性能潜力。

weixin_30772105的博客 196

socket函数send和recv函数

原文地址 在发送端,一次发送4092个字节, 在接收端,一次接收4092个字节, 但是在接收端,偶尔会出现 socket.receive 接收不全的情况 , ret = sock.recv(bBuffer,iBufferLen,0); //也有可能无法收到全部数据! 必须要考虑0  ret  iBufferLen的情况:继续接收iBufferLen - ret字节,然后合并

PersonFly_小逗 1485

从零搭建《火影忍者》手游服务端:Linux环境部署与全流程实战

游戏服务器后端开发是构建大型多人在线体验的核心技术,其原理涉及高并发网络通信、分布式系统架构与数据一致性保障。在技术价值上,一套稳定高效的服务端不仅能支撑海量玩家实时交互,更是游戏业务逻辑、经济系统和安全防线的基石。典型的应用场景包括MMORPG、回合制卡牌、SLG等中重度手游。本文以《火影忍者》IP的横版卡牌回合制手游为例,聚焦于**手工服务端**的完整搭建过程,详细拆解从Linux系统初始化、MySQL与**Redis**缓存部署、核心服务编译、到代理后台联调的全链路实践,为开发者深入理解游戏后端架构提

weixin_30800615的博客 336

Socket的Send,Recv的长度问题

一个包没有固定长度,以太网限制在46-1500字节,1500就是以太网的MTU,超过这个量,TCP会为IP数据报设置偏移量进行分片传输,现在一般可允许应用层设置8k(NTFS系统)的缓冲区,8k的数据由底层分片,而应用层看来只是一次发送。windows的缓冲区经验值是4k。Socket本身分为两种,流(TCP)和数据报(UDP),你的问题针对这两种不同使用而结论不一...

~鹏鹏在努力~ 1万+

【华为OD机试真题】6、数组去重和排序 | 机试真题+思路参考+代码解析(C++、Java、Py、C语言、JS)

题目描述 >给定一个乱序的数组,删除所有的重复元素,使得每个元素只出现一次,并且按照出现的次数从高到低进行排序,相同出现次数按照第一次出现顺序进行先后排序

KJ.JK 3887

贝叶斯(Bayes)决策理论

在博文【模式识别PR和模式的概念】介绍了相关的模式识别与模式的概念。在本节描述所要讨论的问题之前,再提一下对于待识别的物理对象的描述问题。假设一个待识别的物理对象用其d个属性观察值描述,称之为d个特征,这组成一个d维的特征向量,而这d维待征所有可能的取值范围则组成了一个d维的特征空间。一般地,机器实现自动分类有两大类方法:一种是模板匹配方法,另一种是对特征空间划分为子空间(每类的势力范围)的方法。

松子茶的专栏 3万+

Socket 错误:由于套接字没有连接并且(当使用一个 sendto 调用发送数据报套接字时)没有提供地址,发送或接收数据的请求没有被接受。

今晚在学习Socket编程的时候,遇到了一个错误。在服务端接受数据的时候总是出现一个错误:OSError: [WinError 10057] 由于套接字没有连接并且(当使用一个 sendto 调用发送数据报套接字时)没有提供地址,发送或接收数据的请求没有被接受。 解决方案: conn, addr = s.accept() print('Connected with ' + addr[0] + ':' + str(addr[1])) #接受数据 data = s.recv(4096) print(data)

qq_44419614的博客 1万+

图解ADAS电源系统架构:看懂这张图,搞懂前装摄像头的供电秘密!

别以为ADAS系统就是“摄像头 + SoC”,其实最难搞的是供电系统,尤其是要满足车规级ASIL-D安全等级时。供电时序、电压稳定性、电源监控、冗余通信链路,一个都不能少。😤一旦电源选型不对,轻则系统卡顿,重则全车失控,不是闹着玩的。

weixin_43199439的博客 671

recv( )函数返回值说明

recv函数 int recv( SOCKET s, char FAR *buf, int len, int flags); 参数说明 第一个参数指定接收端套接字描述符;  第二个参数指明一个缓冲区,该缓冲区用来存放recv函数接收到的数据;  第三个参数指明buf的长度; 第四个参数一般置0。 同步Socket的recv函数的执行流程 当应用程序调用recv函数时: rec...

mercy_ps的博客 3万+

14、网络切片技术:原理、应用与挑战

本文详细探讨了网络切片技术的原理、应用场景及其在5G网络中的重要性。网络切片作为一种关键的网络架构技术,能够在同一物理网络上创建多个独立的逻辑网络,以满足不同应用对安全性、可靠性和性能的多样化需求。文章深入分析了网络切片在5G、SDN/NFV等技术背景下的发展与挑战,并探讨了其在制造业、交通运输、零售等多个行业的实际应用。此外,还介绍了网络切片的部署流程、未来发展趋势以及相关技术难点,为读者全面了解网络切片技术提供了有价值的参考。

palm99的专栏 253

VC中sqlite的使用

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

【Socket网络编程】17. recv() 函数详解

recv函数 int recv( SOCKET s, char *buf, int len, int flags); 参数说明 第一个参数指定接收端套接字描述符; 第二个参数指明一个缓冲区,该缓冲区用来存放recv函数接收到的数据; 第三个参数指明buf的长度;第四个参数一般置0。 同步Socket的recv函数的执行流程 当应用程序调用recv函数时: recv先等待 SOCKE...

u011754972的博客 3万+

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

recv 返回值大于0,但是缓冲区中无数据的问题

这段数据被recv后,poll应该阻塞(因为缓冲区中已经没有数据),直到收到"第一个这是第2个超级女生,编号002"才停止阻塞;没有数据poll没有阻塞,没有数据recv也没有退出,客户的接收的buffer输出为空,长度为0,但是recv返回值却为10>0,服务端运行结果: 出现clients(client=4)disconnect的原因是我在客户端使用了crtl+c终止了客户端。缓冲区如果没有数据可读,返回值应该小于0,错误代码除了errno==EAGAIN的情况,其余错误都应该退出;

qq_51141456的博客 974

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

非阻塞模式下,send和recv返回值的各种处理

send/recv write/read 函数返回值大于 0,表示成功发送或成功接收了多少字节,但是发送或者接收的字节数可能是部分字节数,比如你需要发送buf_length长度的数据,但是send/write返回的n有可能 < buf_length,这是因为发送缓冲区可能已经满了。EINTR:当进程在一个慢系统调用中阻塞时,如果捕获到某个信号且相应信号处理函数返回时,这个系统调用不再阻塞而是被中断,就会调用返回错误(一般为-1)并设置 errno 为 EINTR。返回值小于0,需要区分errno。

SWX230162的博客 1613

TCP协议下的recv函数

recv函数 函数原型:int recv( SOCKET s, char *buf, int len, int flags) 功能:不论是客户还是服务器应用程序都用recv函数从TCP连接的另一端接收数据。 参数一:指定接收端套接字描述符; 参数二:指明一个缓冲区,该缓冲区用来存放recv函数接收到的数据; 参数三:指明buf的长度; 参数四 :一般置为0。 同步Socket的recv函数的执行流程:当应用程序调用recv函数时,recv先等待s的发送缓冲中的数据被协议传送完毕。 如果协

顺其自然~专栏 4752

socket send和recv正确用法

socket 非阻塞模式下的 recv 行为 非阻塞模式下如果当前无数据可读,recv 函数将立即返回,返回值为-1,错误码为EWOULDBLOCK。将客户端代码修成一下: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38...

XiaoWhy的专栏 3597

Linux网络编程之recv函数

返回值为-1,并且 (errno == EINTR || errno == EWOULDBLOCK || errno == EAGAIN) 的情况下认为连接是正常的,继续接收。

有理论,有实验,有结论,可为一篇文章 3228

关于recv函数

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

qq_32290055的博客 1804

python socket recv不断接收到指定长度空数据

python不断收到空数据

CHNIM的博客 1320

【win网络编程】socket中的recv阻塞和select的用法

转载请注明出处:作者 kikilizhm在编写ftp客户端程序时,在联通后使用recv函数进行接收欢迎信息时,需要申请内存进行接收数据保存,一次读取成功,但是由于一个随机的ftp服务端在说,欢迎信息的大小是不知道的,所以在尝试使用死循环,在阅读recv的说明时讲到返回值即是接收到的字节数,那么返回0的时候就代表结束了,实践发现recv是个阻塞函数,在连接不断开的情况下,会一直处于阻塞状态,也不会返回0.也就是说程序不能这么一直读,如果对端连接没有关闭,则在没有数据的情况下,调用recv会阻塞,如果对端关闭连

modi000的博客 2605
上一篇: 高性能网络编程3----TCP消息的接收
下一篇: C++标准库与STL的关系
nodeathphoenix
博客等级 码龄16年 97粉丝 99原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值