关于recv的一点困惑

2024-03-24 15:32
文章标签 困惑 一点 recv

本文主要是介绍关于recv的一点困惑,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

我用setsockopt()设置TCP_NODELAY后,让客户端连续发送10次数据,每次为1个字节。怎么才能使服务端每次都收到1个字节,而不是一次收到10个字节,就是用recv收到1个字节?尝试用select()函数,或者是WSAAsyncSelect(),都会一次收到9个或10个字节,难道客户端发送的速度很快的话,几次发送的数据都存到了服务端的缓冲区里,连这两个函数也不能准确检查出有新数据来了吗?其实我的目的就是有没有办法准确判断出服务端接收了一个字节?接到到一个字节就通知有东西来了。问题可能不清楚,我也是个菜鸟。请大侠指教。 -------------------------------------------------------------------------------- 答:使用recv(fd,buff,1,0) -------------------------------------------------------------------------------- 答:ls正解 -------------------------------------------------------------------------------- 答:首先,你一次性把10个字节数据收了和一次一次收1个字节数据有区别嘛?不会你要用TCP做定时吧。如果你一定要一次收一个字节,那剩下的也是放在接收缓冲里不取而已。 -------------------------------------------------------------------------------- 答:是这样的,你的程序里可以用一个变量作缓冲区,但是你的机器内部还有一个缓冲区,机器内部的缓冲区实际上是由tcp协议控制的,你不能操作它,实际上你的程序是用变量缓冲区从你的机器缓冲区读东西。 -------------------------------------------------------------------------------- 答:使用recv(fd,buff,1,0)应该没问题,可以达到我提问中的效果。但我的本意是如果不知道对方发的是几个字节,我还是想判断出对方每个包发的是什么?比如对方按顺序发1个,2个,3个,2个,那我就不能用recv(fd,buff,1,0)。那怎么解决了? -------------------------------------------------------------------------------- 答:客户端连续发送10次数据也不一定真发了10个数据包,客户端发送数据也是有缓存的,也许只发了1次10字节的数据包. -------------------------------------------------------------------------------- 答:TCP方式是流式传输,应该不太可能判断出对方每个发包有一种方法就是自己定义发送包的格式,比如说发送端的buf格式为:一字节或多字节标志(可以自己定)一字节发送数据长度数据接收端在收的时候,判断接收数据的标志字节的位置,找到标志位后,那么后面一个字节就是发送端发送数据的长度,以此解决问题 -------------------------------------------------------------------------------- 答:设置缓冲区大小为1个字节 -------------------------------------------------------------------------------- 答:bluepuzzle说的有道理! -------------------------------------------------------------------------------- 答:recv10次每次接收1个字节的buf就可以了..不知道你的用意 -------------------------------------------------------------------------------- 答:LZ的问题是,他不关心发送端是怎么发的,他只关心接收的时候,是按发送的情况一样(recv和send次数一样,每次recv到的数据内容,大小和每次send的数据内容,大小一样)看看这个?!http://support.microsoft.com/kb/214397/zh-cn是需要双方都设置TCP_NODELAY??? -------------------------------------------------------------------------------- 答:设置了TCP_NODELAY好像是发送时分开但是并不能保证接收的时候也能分开收正如bluepuzzle所说可以自己实现包结构 -------------------------------------------------------------------------------- 答:经过实际测试,设置了TCP_NODELAY为true,SO_SNDBUF与SO_RCVBUF为0都无法实现 -------------------------------------------------------------------------------- 答:感谢jourbin的测试,我的实际意图正如jourbin所说,看来这个问题在这个层面上无法解决,只能自己设置包结构,或者协议等了。比如先收一个几字节的数据长度,再来接收该长度的数据。 -------------------------------------------------------------------------------- 答:传统的做法是一定要定义一个包格式的,这个包头结构中必须有消息的总长度,这样在接受时,先接受头几个字节固定字节,这个固定的字节表示该包长度,然后再按长度接受即可。恰好我前段时间写过这段代码,贴上来参考一二吧。voidCMySocket::OnReceive(intnErrorCode){intiRet;intiReadLen=0;//charLength[4];char*pBuf=NULL;//第一次读固定长度的字节,这个固定长度的字节表示为包长度while(iReadLen<4){iRet=Receive(LengthiReadLen,4-iReadLen);if(iRet==0)return;if(iRet==SOCKET_ERROR){return;}iReadLen=iRet;}intiLen;memcpy(&iLen,Length,4);iLen=ntohl(iLen);//按接受包长度创建buf长度pBuf=newchar[iLen];memcpy(pBuf,Length,4);//包体部分接收while(iReadLen

这篇关于关于recv的一点困惑的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/842013

相关文章

超声波清洗机哪个品牌比较好一点的?清洁力强的超声波清洗机品牌

随着生活水平的不断提升和幸福感的增强,珠宝、饰品和眼镜等物品已成为许多家庭的常备之物。然而,这些贵重细小的物件易于积聚微尘与隐形细菌,长此以往可能悄悄影响家人的健康,毕竟细菌是肉眼难以察觉的隐患。超声波清洗机应运而生,它以高科技手段有效地解决了这一隐忧,深层清洁,守护家人免受微小污染物的潜在威胁。不过现在市面上超声波清洗机品牌挺多的,究竟有哪些品牌的超声波清洗机比较好一点呢?接下来就为大家带来四款

【ReactJS】困惑于text/babel与browser.js还是babel.js?

使用JSX   使用JSX,可以极大的简化React元素的创建,JSX抽象化了React.createElement()函数的使用,其语法风格类似于HTML语法风格。对比如下代码可以让你更好的理解这一点。 // 使用React.createElement()return React.createElement('div',null,'Hello',this.props.name);//使用J

关于证书链的一点认知

文章来源 作者:小叶与小茶 链接:https://www.jianshu.com/p/fcd0572c4765 来源:简书 顾名思义,证书链是由一串数字证书链接而成,为了弄清楚这个概念,先看看什么是数字证书。 一、数字证书的基础知识 数字证书是用来认证公钥持有者身份合法性的电子文档,以防止第三方冒充行为。数字证书由 CA(Certifacate Authority) 负责签发,关

【C++学习(28)】通俗一点讲解:std::bind 回调技术

std::bind 是 C++11 标准库中的一个功能,它允许你“绑定”某些参数到一个函数、成员函数或可调用对象上,从而生成一个新的可调用对象。这种新的可调用对象可以稍后被调用,而且其中一些参数已经被预先设置好了。这在回调函数和异步编程中特别有用。 下面我用一个通俗的例子来解释 std::bind 是如何工作的。 假设场景 假设你有一个家庭厨师,他有一个技能叫做“做饭”。做饭需要两个参数:一

2024最全自学黑客技术学习路线,带你少走一点弯路!

谈起黑客,可能各位都会想到:盗号,其实不尽然;黑客是一群喜爱研究技术的群体,在黑客圈中,一般分为三大圈:娱乐圈 技术圈 职业圈。 娱乐圈:主要是初中生和高中生较多,玩网恋,人气,空间,建站收徒玩赚钱,技术高的也是有的,只是很少见。 技术圈:这个圈子里面的黑客是为了能把黑客技术玩到极致的技术狂人,我最佩服的就是这群人,希望以后自己也能成为这样的人。 职业圈:这里面的人群主要就是玩HC为主了

sphinx里 java接口中对错误信息封装的一点记录

SphinxResult result = sphinx.Query(String queryString, String index, String comment);下面是实现:/** Connect to searchd server and run current search query. */public SphinxResult Query ( String query,

关于javaSocket中 Software caused connection abort: recv failed问题

在学习Socket中今天突然遇到了下面这样的问题 原来是网路连接出了问题,因为我测试的是远程连接所以是在学校的局域网下,结果很不稳定,开始还以为怎么了一会连上了一会又出现问题然后把IP地址改为本机的127.0.0.1之后就没有 出现过了.

关于Spring和SpringMVC的一点感悟

一年前,我们项目最开始使用的SSH(spring+springmvc+hibernate),那时候项目经理搭建好了框架就交给了我们,后来在一次配置事务的过程中,出现了大名鼎鼎的no seesion。 网上查都是说事务没配置好,我选了好几种事务配置方法,其中只有注解有效,AOP切面配置事务都报错。 说实话一开始就走歪了,那时候不理解spring和springMVC的关系,web.xml配置文件都

实习的一点回顾单元测试

多看看这个,生动 java - Spring、Spring Boot和TestNG测试指南 - 使用Mockito - 颇忒脱 - SegmentFault 思否  如何在Springboot项目中添加testng+mockito+jacoco单元测试_spring testng mockito-CSDN博客 1.介绍 TestNG 和 Mockito 是 Java 测试框架和库,用于编写