gpt4 book ai didi

c++ - 为什么 setsockopt( TCP_REPAIR ) 在进程具有 root 权限时返回 EPERM?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:54:52 26 4
gpt4 key购买 nike

我有一个程序可以像这样将套接字置于 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,即使该进程具有 super 用户权限。疯狂的是,对于来自某些客户端的套接字连接,此函数成功,而对于其他一些客户端,我无法设置 TCP_REPAIR

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

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

最佳答案

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

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

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

这不是一个很好的处理方式。确实应该有其他一些更具解释性的错误。但是他们只是重新使用 EPERM 错误代码。

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com