【发布时间】: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