c++ - 使用 POCO C++ 通过 TCP 连接发送和接收 OOB 数据

标签 c++ tcpserver poco-libraries

我需要开发一个能够接收周期性紧急越界数据的 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 );

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

最佳答案

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

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

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

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

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

MSG_OOBrecvsend 以及公司的标志。

关于c++ - 使用 POCO C++ 通过 TCP 连接发送和接收 OOB 数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12391283/

相关文章:

java - c++ 套接字客户端继续从 Java 服务器接收某些内容,即使输出流已关闭

c++ - linux上有c++ tcp服务器吗?

delphi - TCP服务器和Error1400

c++ - CDT 上的 POCO C++ 库

c++ - 我可以将成员数据指针分配给派生类型吗?

c++ - 是使用ping命令查找服务器在cpp上的网络状态吗?

c - 使用 epoll 的 tcp 服务器给出非套接字错误

linux - 基于 Poco 的二进制文件在运行时找不到库

c++ - 在 Poco SQLite 中的表之间加入

c++ - 将持续时间值设为双倍