当前位置: 首页 > 面试题库 >

确定套接字上是否还有数据并丢弃

翟奇逸
2023-03-14
问题内容

我正在Linux下编写一个从TCP套接字获取数据的接口。用户提供一个缓冲区,在其中存储接收到的数据。如果提供的缓冲区太小,我只想返回一个错误。第一个问题是确定缓冲区是否过小。recv()函数仅向我返回实际写入缓冲区的字节数。如果我使用recv()联机帮助页上所述的MSG_TRUNC标志,它仍然返回相同的内容。第二个问题是丢弃仍在套接字中排队的数据。因此,如果我确定提供的Buffer很小,我只想擦除套接字上剩余的所有内容。除了重新关闭并打开套接字,或者只是接收直到什么都没剩下,还有其他方法吗?最好的问候<

一个建议是只是recv直到什么都没剩下(我返回0)-但是这样做最终不必等待预设的超时(在这种情况下是5秒?),因为每次我调用recv时,它都会等待数据或超时?


问题答案:

在TCP级别上,不知道什么构成应用协议消息。但是,有两种最常见的方法来分隔TCP流中的消息:

  • 给消息加上大小并读取那么多字节,或者
  • 读取直到找到一定的字节序列为止。

因此,一个通用的TCP读取器应该提供两个通用的读取功能:

  • 读取N个字节,并且
  • 读取直到读取了定界符

类似于Tornado
IOStream
读取功能的设计也可以。



 类似资料:
  • 这是我的第一个Node.js和Socket.io应用程序,我没有使用express,我想在heroku上部署应用程序,我需要使用它吗?我的意思是,我刚刚在本地主机上安装了socket.io,在我的服务器文件即game.js中,我只有io=require(“socket.io”)和socket=io.listen(Number(process.env.port)),在我发送消息的其中一个文件中,我有

  • 问题内容: 我知道这个问题的变体以前经常被问过,但这 并不是 这些问题的 精确 重复。 我想检查a 是否为数字,如果是,我想将其存储为。有几种方法可以做到这一点,但是所有这些方法似乎都不适合我的目的。 一种解决方案是使用或类似方法。但是,如果存在逗号,这些解决方案将不起作用(因此,“ 1,234”将导致异常)。在使用这些技术之前,我当然可以删除所有逗号,但是这似乎在其他地区带来了很多问题。 我看了

  • 问题内容: 有没有办法检查输入流()是否有数据? 从GO的初始stdin中读取帖子?显示了如何读取数据,但是不幸的是,如果没有数据通过管道传送到stdin中,则会阻塞。 问题答案: os.Stdin与其他任何“文件”一样,因此您可以检查其大小: 我将其构建为“管道”可执行文件,其工作方式如下:

  • 问题内容: 该服务器的行为类似于回显服务器。客户端向服务器发送10个数据包(间隔为1秒) 当客户端从服务器接收数据包时,有时数据包会丢失。 因此,客户端必须等待一秒钟,直到数据包到达。如果数据包未在1秒钟内到达,则客户端应继续发送其他数据包。 我将如何使用.setSoTimeout实现此目的? } 问题答案: setSoTimeout的Javadoc说: 将此选项设置为非零超时后,对此Datagr

  • 所以我有一个问题,当我计算一个数字时,比如说15,我必须显示这个:15=3x5,但我得到的是3x5x5,我不知道如何使它变成这样,所以它只显示3x5。还有一个问题是,我输入的数字是否是素数。有办法解决这个问题吗?我只需要这些,然后再编辑其他东西。