为什么 setsockopt( TCP_REPAIR ) 会在进程具有根权限时返回 EPERM

Why would setsockopt( TCP_REPAIR ) return EPERM when process has root permission?

本文关键字:权限 EPERM 返回 进程 TCP setsockopt REPAIR 为什么      更新时间:2023-10-16

我有一个程序可以将套接字置于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 ));
}

此函数返回EPERM ,即使该进程具有超级用户权限。关于它的疯狂之处在于,对于来自某些客户端的套接字连接,此功能成功,而对于其他一些客户端,我无法设置TCP_REPAIR

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

是否有一些TCP_REPAIR无法使用的套接字状态?或者某种连接方式使无法设置TCP_REPAIR mode

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

"更改过程的修复模式状态需要CAP_NET_ADMIN功能;套接字也必须关闭或处于既定状态。

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

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