我有一个程序可以将套接字放入TCP_REPAIR模式,如下所示:

int aux = 1;
if ( setsockopt( mSocket, SOL_TCP, TCP_REPAIR, &aux, sizeof( aux )) < 0 )
{
   showError( "could not turn on repair mode",
              (( errno == EPERM ) ? ( geteuid() ?
                       ": operation not permitted (not root)" :
                       ": operation not permitted (...yet running as root)" ) : NULL ));
}

即使该进程具有 super 用户权限,此函数也会返回EPERM。疯狂的是,对于来自某些客户端的套接字连接,此功能成功,而对于某些其他客户端,我无法设置TCP_REPAIR

好像有些客户端以某种方式将套接字置于不允许TCP_REPAIR模式的模式。

是否存在某些不能使用TCP_REPAIR的套接字状态?还是某种无法设置TCP_REPAIR mode的连接方式?

最佳答案

我做了一些研究,找到了答案。这里:http://lwn.net/Articles/495304/

“更改进程的修复模式状态需要CAP_NET_ADMIN功能;套接字也必须关闭或处于已建立状态。”

我编写了一个测试程序来模拟该问题。如果套接字打开,写入数据,然后在另一端有机会将其置于修复模式之前再次关闭,则它将返回EPERM。

这不是处理它的好方法。确实应该有其他解释性错误。但是相反,他们只是重新使用了EPERM错误代码。

关于c++ - 当进程具有root权限时,为什么setsockopt(TCP_REPAIR)返回EPERM?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27024654/

10-12 21:42