【问题标题】:Sending and receiving OOB data through a TCP connection using POCO C++使用 POCO C++ 通过 TCP 连接发送和接收 OOB 数据
【发布时间】:2012-09-12 15:09:25
【问题描述】:

我需要开发一个能够定期接收紧急越界数据的 TCP 服务器。我正在使用 POCO C++ 库来实现这一点。在StreamSocket 类的(稀缺)文档中,我看到这应该是一个非常容易实现的任务:应该通过在使用 receiveBytes() 方法时设置 SO_OOBINLINE 标志来完成,如下所示:

n = ss.receiveBytes( buffer, sizeof(buffer), SO_OOBINLINE );

为了测试这一点,我制作了一个非常简单的 TCP 客户端(也使用 POCO 库),它使用“sendUrgent()”方法发送 OOB 数据(单个字节):

ss1.sendUrgent( 0xFF );

当我发送 OOB 数据时,没有任何反应。服务器似乎没有注意到它。

另一方面,当我使用 sendBytes() 方法发送“普通”数据时,如果在 StreamSocket 上设置了 SO_OOBINLINE 标志,我会收到无限量的相同发送数据(它一直在读取相同的数据虽然没有人重新发送它)。

我错过了什么?

编辑:在@JimR 的建议和阅读this 之后,我尝试了:

n = ss.receiveBytes( buffer, sizeof(buffer), MSG_OOB );

甚至这个:

n = ss.receiveBytes( buffer, sizeof(buffer), SO_OOBINLINE | MSG_OOB );

两者都引发相同的异常:无效参数。

【问题讨论】:

  • SO_OOBINLINE 告诉套接字在常规读取中返回 OOB 数据。

标签: c++ tcpserver poco-libraries


【解决方案1】:

认为(已经很久了)你应该改变

n = ss.receiveBytes( buffer, sizeof(buffer), SO_OOBINLINE );

n = ss.receiveBytes( buffer, sizeof(buffer), MSG_OOB );

编辑:除了上述更改之外,您还需要使用 SO_OOBINLINE 标志和适当的参数调用 setsockopt,以便 OOB 数据将在正常流中看到,而不是在单独的通道。在您的情况下,如 cmets 所述,请致电 ss.setOOBInline(true);

SO_OOBINLINE 是与setsockopt 一起使用的套接字选项。

MSG_OOBrecvsend 和公司的标志。

【讨论】:

  • 感谢您的回答。如果我进行此更改,receiveBytes 方法将引发异常:“无效参数”。 sendUrgent 方法的文档说明如下:“通过套接字发送一个字节的紧急数据。数据使用 MSG_OOB 标志发送。套接字接收紧急数据的首选方式是启用SO_OOBINLINE 选项”。
  • @pparescasellas:同意SO_OOBINLINE 是首选,但是...除非POCO 改变含义,否则Linux 源代码中唯一提到SO_OOBINLINE 与调用setsockopt 和公司及其定义。您可以在这里亲自查看:kneuro.net/cgi-bin/lxr/http/ident?a=sparc64;i=SO_OOBINLINE
  • @pparescasellas:我突然想到了一些事情,我想我会提到它。在使用 MSG_OOB 之前,您是否使用 setsockopt 将 SO_OOB_INLINE 选项添加到套接字?如果没有,那可能就是您收到异常的原因...
  • 我不明白你的意思。我有两个不同的程序:一个充当服务器(在 receiveBytes 方法中具有 SO_OOBINLINE 标志),另一个充当客户端(并具有 sendUrgent 方法,该方法在内部使用 MSG_OOB 标志)。所以是的,我首先运行服务器,当它运行时,我运行客户端来建立连接并发送 OOB 数据。一旦建立连接并且服务器到达“receiveBytes”方法,就会抛出异常(如果我进行更改并在服务器端使用 MSG_OOB)。
猜你喜欢
  • 2012-03-10
  • 1970-01-01
  • 1970-01-01
  • 2014-07-25
  • 2011-06-25
  • 2012-06-24
  • 2019-10-25
  • 2014-07-01
  • 1970-01-01
相关资源
最近更新 更多