热门标签 | HotTags
当前位置:  开发笔记 > 程序员 > 正文

epoll+socket接收数据长度问题

Hi,我现在使用epoll+sockek实现一个RPC的调用,发送和接收都是用一个while循环来实现的。想要实现的是:发送端发送数据时,在包头里加上数据包长度,接收端可以先解析出来包头,知道
Hi,我现在使用epoll + sockek实现一个RPC的调用,发送和接收都是用一个while循环来实现的。
想要实现的是:发送端发送数据时,在包头里加上数据包长度,接收端可以先解析出来包头,知道具体要接收的数据大小,申请空间,供后面接收数据使用。
现在的问题是,我可以把包头+数据作为一个包发送出去,接收端要怎么接收解析包头呢?比如接收端每次接收的长度为1024*4字节,接受一次后可能包头和数据都接收到了,怎么才能只接收包头呢?
本人刚接触socket,希望各位大侠多多指点,谢谢!

6 个解决方案

#1


socket程序
应用层buff必不可少

#2


能请说的详细一点吗?

#3


应用层准备一个可以动态伸展的缓冲区,来的数据往缓冲区末尾追加,然后再解析缓冲区里的数据。

#4


我现在是这么实现的,但是每次接受到数据都要用realloc重新申请空间,比较费时。
现在的想法是,如果一开始就能获取到消息长度,一次性申请一段空间,后面收到数据就往空间里面拷贝就行了,是不是效率上会要一些呢?

#5


发送端把包头+数据一次性发送,接收端仍然可以分多次接收,第一次收包头,根据包头中数据大小收数据
至于缓冲区,可以用很多办法,比如可以在一个连接中使用同一个缓冲区,接收数据大于该缓冲区的时候就realloc缓冲区;更进一步就可以不释放这些缓冲区,而是在连接结束的时候放入缓冲区池,需要缓冲区的时候先从缓冲区池获取。。。

#6


查一下MSG_PEEK。

推荐阅读
author-avatar
隐姓埋名er
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有