永发信息网

如何清空socket缓冲区

答案:2  悬赏:60  手机版
解决时间 2021-01-31 15:10
如何清空socket缓冲区
最佳答案
如果是在客户端,当你close一个socket的时候,就连带的将此socket的接收和发送buffer都撤销了,自然也就清空了。
如果在服务器端,一般你不需要担心客户端会读入遗留数据
全部回答
由于socket是以数据流的形式发送数据,接收方不知道对方一次性发送了多少数据,也能保证对方一次性发送的数据能在同一刻接收到,所以receive方法是这么工作的: 接受一个byye[]类型的参数作为缓冲区,在经过一定的时间后把接收到的数据填充到这个缓冲区里面,并且返回实际接收到数据的长度,这个实际接收到的数据长度有可能为0(没有接收到数据)、大于0小于缓冲区的长度(接收到数据,但是没有我们预期的多)、等于缓冲区的长度(说明接收到的数据大于等于我们预期的长度)。 每次接收缓冲区都用同一个byte[] bytemessage,并且你没有检查接收到的数据长度,所以第一次你接收到的数据是123456,第二次你只接收到了8,但是缓冲区里面还有23456,所以加起来就是823456了。 socket接收缓冲区的大小有讲究,设置大了接收起来慢,因为它要等尽可能多的数据接收到了再返回;设置小了需要重复多次调用接收方法才能把数据接收完,socket有个属性,标识了系统默认的接收缓冲区大小,可以参考这个! 还有就是用recv读取,但是由于不知道缓存里有多少数据,如果是阻塞模式,到最后必然等到超时才知道数据已经读取完毕,这是个问题。 另一个是用fgetc,通过返回判断是否是feof: whlie (1) { a=fgetc(f);if (feof(f)) break;//… b=fgetc(f);if (feof(f)) break;//… } 当然,我不知道读取完毕后最后一次调用fgetc会不会堵塞,需要测试。 在非阻塞模式下,我们用recv就可以轻松搞定了,但是阻塞模式下,由于我们不知道缓冲区有多少数据,不能直接调用recv尝试清除。 使用一个小小的技巧,利用select函数,我们可以轻松搞定这个问题: select函数用于监视一个文件描述符集合,如果集合中的描述符没有变化,则一直阻塞在这里,直到超时时间到达;在超时时间内,一旦某个描述符触发了你所关心的事件,select立即返回,通过检索文件描述符集合处理相应事件;select函数出错则返回小于零的值,如果有事件触发,则返回触发事件的描述符个数;如果超时,返回0,即没有数据可读。 重点在于:我们可以用select的超时特性,将超时时间设置为0,通过检测select的返回值,就可以判断缓冲是否被清空。通过这个技巧,使一个阻塞的socket成了‘非阻塞’socket. 现在就可以得出解决方案了:使用select函数来监视要清空的socket描述符,并把超时时间设置为0,每次读取一个字节然后丢弃(或者按照业务需要进行处理,随你便了),一旦select返回0,说明缓冲区没数据了(“超时”了)。 struct timeval tmout;tmout.tv_sec = 0;tmout.tv_usec = 0;fd_set fds;fd_zeros(&fds);fd_set(skt, &fds); int nret; char tmp[2]; memset(tmp, 0, sizeof(tmp)); while(1) { nret= select(fd_setsize, &fds, null, null, &tmout);if(nret== 0) break;recv(skt, tmp, 1,0);} 这种方式的好处是,不再需要用recv、recvfrom等阻塞函数直接去读取,而是使用select,利用其超时特性检测缓冲区是否为空来判断是否有数据,有数据时才调用recv进行清除。 有人说同样可以用recv和socket的超时设置去清空啊,这个没错,但是你需要直接对socket描述符设置超时时间,而为了清空数据而直接修改socket描述符的属性,可能会影响到其他地方的使用,造成系统奇奇怪怪的问题,所以,不推荐使用。
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
卡盟为什么下单的时候说请联系管理员,下不了
我女朋友天蝎座,异地恋两个月,吵了两次架,
好习惯学习方法指导中心地址在什么地方,想过
一键启动的车子启动哒哒响,要几秒钟才能启动
简单学习网(临朐服务站)地址有知道的么?有点
我今年16岁,身高162厘米,体重52Kg,能抓到
胆固醇生物合成的限速步骤是在A.乙酰CoA→乙
lg g4港版刷了国行的,怎么升级
长安cs75手动座椅想换一套电动的多少钱
奇正会计培训(临朐分校)地址在哪,我要去那里
【housework造句】
保险行业和会计行业,哪个更有前途
推荐一本学3dmax的书
启明星托辅(南苑校区)地址在什么地方,我要处
香水百合多少钱一支
推荐资讯
电视剧好先生彭海是谁演的
上环快3月了老是有血丝正常吗?
深圳罗湖眼科医院
鹿寨县人民检察院怎么去啊,我要去那办事
(山羊胡子的有无由常染色体上等位基因A(a)决
明德小学(齐齐哈尔克东)地址在哪,我要去那里
古语中一根木棍截成两段周而复始最后成一质点
45岁的人还能学拉二胡吗?我对二胡很喜欢,很
天顺大药房路口店地址在哪,我要去那里办事
抗日英雄的词kuai
中石油凤城东加油站地址在哪,我要去那里办事
魅蓝meta|和魅蓝2性能上有什么区别
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?