为什么 setsockopt( TCP_REPAIR ) 会在进程具有根权限时返回 EPERM
Why would setsockopt( TCP_REPAIR ) return EPERM when process has root permission?
我有一个程序可以将套接字置于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 错误代码。
相关文章:
- Termux权限被拒绝
- AWS Lambda C++运行时权限被拒绝
- 为什么 KMS drmModeSetCrtc() 在 X11 会话中运行时会失败并被拒绝权限?
- 编写一个函数来删除单链表中的节点(尾部除外),仅授予对该节点的访问权限
- 在没有管理员权限的情况下连接到同一网络中的命名管道
- 为什么我在空指针错误(链表)中获取成员访问权限
- Q没有管理权限的 exe 无法启动维护工具
- 在没有管理员权限的情况下,在 c++ 中以编程方式将程序添加到启动
- 如何使用Windows API C++更改已创建的文件夹/目录安全权限
- 如何修复无效的API密钥,IP或操作权限错误?
- 使用崇高文本 3 进行C++拒绝授予权限?
- 为什么"delete"操作员给我访问权限冲突
- 从根权限进程创建可访问的文件
- Android因为权限问题而杀死Qt应用程序
- 具有管理员权限的外壳执行不会结束
- 父级的子属性 - 访问权限
- 从C++获得对在python中创建的C++类的访问权限
- 安卓inotify_add_watch失败:权限被拒绝?
- 威纳派读取自定义文件或文件夹的所有访问权限
- 为什么 setsockopt( TCP_REPAIR ) 会在进程具有根权限时返回 EPERM