社区
C语言
帖子详情
如何清空Socket缓冲区
OhYeah_Dragon
2010-11-23 01:27:15
有什么办法能一次性吧缓冲区的内容全部Recv下来呢?
用While循环会有这样的问题
比如
while(true)
{
int ret = recv(socket, buf, 500,0);
if(ret != 500)
{
break;
}
}
那么当我缓冲区内的消息正好是500的倍数的时候,第一次ret=500 不退出循环 下一次recv因为缓冲区内没有消息,就会堵塞!
有什么好办法能不阻塞 把缓冲区的消息都接下来么?
...全文
7356
33
打赏
收藏
如何清空Socket缓冲区
有什么办法能一次性吧缓冲区的内容全部Recv下来呢? 用While循环会有这样的问题 比如 while(true) { int ret = recv(socket, buf, 500,0); if(ret != 500) { break; } } 那么当我缓冲区内的消息正好是500的倍数的时候,第一次ret=500 不退出循环 下一次recv因为缓冲区内没有消息,就会堵塞! 有什么好办法能不阻塞 把缓冲区的消息都接下来么?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
33 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
whango
2012-08-13
打赏
举报
回复
我就是采用断开连接的方式啊。。但是不知道为什么原因程序还是运行一会儿就不触发OnReceive和Send了。。。伤不起。。。用按钮的方式也不能触发OnReveive.......
zhanshen2891
2010-11-24
打赏
举报
回复
[Quote=引用 16 楼 ohyeah_dragon 的回复:]
我现在考虑的就是故障处理
因为我做的通讯是会有外部链接进来的 我不能保证别人的报文一定就正确
我总不能他出错我就当掉吧
比如我发一个长度60的报文 但是因为鼓掌 实际上我的报文时58长度 //每个包都是有长度的~~//现在就是考虑长度出错的情况
到的长度就和发送的长度不符 如果不清空缓冲区 //长度不符合,怎么保证稳定性~~//那边的程序不是我写的,不符合也是有可能的
那么当下一个报……
[/Quote]
你没明白流式协议该如何解析。
一般都是这样解析的
你应该有一个单独组合数据包的过程,有一个数据缓冲
首先读出包头的长度,然后就“期待”读够包头,然后解析包头得出数据长度,然后在“期待”读够数据.
至于具体实现可以考虑用个队列,队尾加数据进去,从队头开始解析.
OhYeah_Dragon
2010-11-24
打赏
举报
回复
好 我知道了 那我采用断开连接的方式吧 谢谢大家
赵4老师
2010-11-24
打赏
举报
回复
[Quote=引用 8 楼 walkersfaint 的回复:]
while(RecLen > 0)
即可,为啥要用while(1)???
[/Quote]
不要使用
while (条件)
更不要使用
while (组合条件)
要使用
while (1) {
if (条件1) break;
//...
if (条件2) continue;
//...
if (条件3) return;
//...
}
因为前两种写法在语言表达意思的层面上有二义性,只有第三种才忠实反映了程序流的实际情况。
典型如:
下面两段的语义都是当文件未结束时读字符
whlie (!feof(f)) {
a=fgetc(f);
//...
b=fgetc(f);//可能此时已经feof了!
//...
}
而这样写就没有问题:
whlie (1) {
a=fgetc(f);
if (feof(f)) break;
//...
b=fgetc(f);
if (feof(f)) break;
//...
}
类似的例子还可以举很多。
赵4老师
2010-11-24
打赏
举报
回复
《TCP/IP详解卷一:协议》
audi2
2010-11-24
打赏
举报
回复
建议断开连接。你怎么知道现在的socket缓冲区中的数据哪些是肮脏的,哪些是正义的?
zhanshen2891
2010-11-24
打赏
举报
回复
[Quote=引用 27 楼 ohyeah_dragon 的回复:]
踢掉客户端是一个办法
但是感觉不太好
我还是希望能清空缓冲区
牺牲掉下一个报文 保证后续的报文不会出错 程序也不会当掉
能实现么
[/Quote]
据我所知那是不行的,你可以移动指针,不停校验新的包头,直到找到正确的包头,再开始新的解析。同样,你要是想保证数据也正确的话那就对数据也加个校验和。
但是,这种方法真的很不好,到时候出BUG你就知道有多难受了
OhYeah_Dragon
2010-11-24
打赏
举报
回复
踢掉客户端是一个办法
但是感觉不太好
我还是希望能清空缓冲区
牺牲掉下一个报文 保证后续的报文不会出错 程序也不会当掉
能实现么
zhanshen2891
2010-11-24
打赏
举报
回复
[Quote=引用 25 楼 ohyeah_dragon 的回复:]
不是底层读错
是应用层可能组包组错啊
可能我20长度的包 因为程序写错了 前面的包长度写成2了呢
[/Quote]
校验包头,在你这种情况,前1个包可以解析出来,但是下一个包头就校验不过了,这时候直接踢掉客户端
OhYeah_Dragon
2010-11-24
打赏
举报
回复
不是底层读错
是应用层可能组包组错啊
可能我20长度的包 因为程序写错了 前面的包长度写成2了呢
zhanshen2891
2010-11-24
打赏
举报
回复
[Quote=引用 18 楼 ohyeah_dragon 的回复:]
引用 17 楼 zhanshen2891 的回复:
你没明白流式协议该如何解析。
一般都是这样解析的
你应该有一个单独组合数据包的过程,有一个数据缓冲
首先读出包头的长度,然后就“期待”读够包头,然后解析包头得出数据长度,然后在“期待”读够数据.
至于具体实现可以考虑用个队列,队尾加数据进去,从队头开始解析.
我现在在做的就是异常处理啊,。。
然后就“期待”读够包……
[/Quote]
不会出现读错了和上一个包没读够而下一个包的数据就来了的情况,那是绝对不会出现的,因为你用的是TCP,它已经帮你处理过了
zlcrypto
2010-11-24
打赏
举报
回复
清空的话可以用memset做。
但是考虑到你的情况,建议你在发送的时候,把将要发送的大小发送到接受方,这样就可以很好的操作了利用循环,以及统计接收的总字节数就可以了
OhYeah_Dragon
2010-11-24
打赏
举报
回复
能不能别再纠结什么协议什么做法
我的问题是怎么清空Socket缓冲区的内容
请回答我这个问题好么 各位大大们
OhYeah_Dragon
2010-11-24
打赏
举报
回复
[Quote=引用 19 楼 bcj00000 的回复:]
自己定议个协议头不就搞定了,每个包不都有规律了
[/Quote]
为什么都不理解我的意思呢?
我定了协议!
按照协议走完全没问题!
但是我现在是在做异常处理!
我要考虑出异常的情况!
elated
2010-11-24
打赏
举报
回复
用非阻塞的IO,select轮询机制
bcj00000
2010-11-24
打赏
举报
回复
自己定议个协议头不就搞定了,每个包不都有规律了
OhYeah_Dragon
2010-11-24
打赏
举报
回复
[Quote=引用 17 楼 zhanshen2891 的回复:]
你没明白流式协议该如何解析。
一般都是这样解析的
你应该有一个单独组合数据包的过程,有一个数据缓冲
首先读出包头的长度,然后就“期待”读够包头,然后解析包头得出数据长度,然后在“期待”读够数据.
至于具体实现可以考虑用个队列,队尾加数据进去,从队头开始解析.
[/Quote]
我现在在做的就是异常处理啊,。。
然后就“期待”读够包头//读错了、不够了怎么处理
我要做的就是这个啊
不可能永远是对啊
我的程序也不能对方发一个错的报文他就当掉啊
OhYeah_Dragon
2010-11-23
打赏
举报
回复
我现在考虑的就是故障处理
因为我做的通讯是会有外部链接进来的 我不能保证别人的报文一定就正确
我总不能他出错我就当掉吧
比如我发一个长度60的报文 但是因为鼓掌 实际上我的报文时58长度 //每个包都是有长度的~~//现在就是考虑长度出错的情况
到的长度就和发送的长度不符 如果不清空缓冲区 //长度不符合,怎么保证稳定性~~//那边的程序不是我写的,不符合也是有可能的
那么当下一个报文进来的时候,就会把下一个报文的2个长度算成是前一个报文 //先判断包头不就可以了~~//都错位了,包头当然也是错的 无从判断
ak_kay
2010-11-23
打赏
举报
回复
[Quote=引用 12 楼 ohyeah_dragon 的回复:]
不是这样的
比如我发一个长度60的报文 但是因为鼓掌 实际上我的报文时58长度 //每个包都是有长度的~~
到的长度就和发送的长度不符 如果不清空缓冲区 //长度不符合,怎么保证稳定性~~
那么当下一个报文进来的时候,就会把下一个报文的2个长度算成是前一个报文 //先判断包头不就可以了~~
导致下一个报文错位
连带后面全部的报文都错位!
这是非常严重的
[/Quote]
你只需要读到你想要的东西就可以了
OhYeah_Dragon
2010-11-23
打赏
举报
回复
但是Recv要提供你要接受的长度的
recv(socket, buf, 500,0);
第三个参数是你要接受的长度
如果小了 就会一次接收不完
但是要大的话是没有上限的把
加载更多回复(13)
Linux如何
清空
Socket
缓冲区
本文介绍了一种在Linux环境下清除
Socket
缓冲区
的有效方法。利用select函数的超时特性,结合recv函数,可以在不知道
缓冲区
具体大小的情况下
清空
缓冲区
,避免了因残留数据导致的错误。
linux
socket
清空
缓存,Linux如何
清空
Socket
缓冲区
本文探讨了阻塞模式下
Socket
通讯中清除接收
缓冲区
的方法。为避免旧数据干扰新命令,提出了一种利用select函数配合超时特性的解决方案,有效解决了
缓冲区
残留问题。
java
socket
缓冲区
,:请教怎么解决JAVA
socket
通信时的
缓冲区
的
清空
有关问题
本文探讨了使用Java Servlet实现
Socket
通信时遇到的问题,即无法正确
清空
输入
缓冲区
导致数据混淆。作者尝试每次连接不同的客户端,但读取的数据总是之前的残留数据。
python
socket
清空
接收
缓冲区
_Linux下如何
清空
socket
的接收
缓冲区
的数据
本文介绍了一种使用select函数和超时设置
清空
Python
socket
接收
缓冲区
的策略,避免了不必要的close操作和阻塞问题。通过设置select的超时时间为0,可以检测到
缓冲区
何时为空,从而实现高效且不影响其他功能的
缓冲区
清理。
Python
Socket
编程中
清空
缓冲区
的问题
本文介绍了如何在Python
Socket
编程中实现服务器端主动
清空
客户端的
socket
缓冲区
,并展示了完整的服务器端和客户端代码示例,涉及JSON数据发送和numpy数组传输。
C语言
70,039
社区成员
243,246
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章