1

我需要开发一个能够定期接收紧急越界数据的 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 的建议和阅读后我尝试过:

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

甚至这样:

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

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

4

1 回答 1

2

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

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

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

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

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

MSG_OOBrecvsend和公司的旗帜。

于 2012-09-12T16:21:09.813 回答