我正在Linux下编写一个接口,从TCP套接字获取数据.用户提供缓冲区,其中存储接收的数据.如果提供的Buffer很小,我只想返回一个错误.第一个问题是确定缓冲区是否很小. recv()函数只返回实际写入Buffer的字节数.如果我使用recv()联机帮助页上所述的MSG_TRUNC标志,它仍然会返回相同的内容.第二个问题是丢弃仍在套接字中排队的数据.因此,如果我确定我提供的缓冲区很小,我只想删除套接字上剩下的所有东西.有没有其他方法可以这样做,除了关闭并再次打开插座或只是接收,直到什么都没有留下?最好的问候< 一个建议是直到recv,直到什么都没有留下(我得到返回0) – 但是不必等待预设的超时(在这种情况下它是5秒?)因为每次我调用recv它等待数据或超时?
解决方法:
在TCP级别上没有关于什么构成应用程序协议消息的知识.但是,有两种最常用的方法来分隔TCP流中的消息:
>使用大小的前缀消息并读取许多字节,或
>读取直到找到某个字节序列.
有鉴于此,通用的TCP阅读器应该提供两种普遍有用的阅读功能:
>读取N个字节,和
>读取直到读取分隔符
类似于Tornado IOStream读取功能的设计可以做到.