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

时间:2012-09-12 15:09:26

标签: 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 );

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

1 个答案:

答案 0 :(得分: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以及公司的标志。