Unix套接字sendmsg消息返回权限错误
Author:onceday date:2023年8月16日
解决linux设备上unix套接字sendmsg的一种错误情景。
1. 问题
unix套接字有一种udp类传输,即数据报服务。这个套接字可以设置对端,也可以不设置对端。如下:
-
socket()
,创建套接字,这是所有套接字操作的基础。 -
bind()
,对于unix套接字,这会绑定一个字符串地址。 -
connect()
,对于unix数据报套接字,也可以绑定对端。
一般对于数据报类的套接字,只需要前两步就行了, 因为数据报是无状态连接,各报文之间独立,没有额外的状态维护过程。
如果此时我们用sendmsg发送一个消息,但返回权限不允许错误(1),而且收到的消息是正确的,即对端可以给本套接字发送消息,但我们没办法回复消息,那么有很大可能是对端套接字进行了connect操作。
下面是af_unix.c
源码中unix_dgram_sendmsg
函数中的部分代码,即sendmsg函数底层实际调用函数:
err = -EPERM;
if (!unix_may_send(sk, other))
goto out_unlock;
这里有一个判断,如果不满足,直接退出,很明显,返回权限错误和这个判断有关系。
static inline int unix_our_peer(struct sock *sk, struct sock *osk)
{
return unix_peer(osk) == sk;
}
static inline int unix_may_send(struct sock *sk, struct sock *osk)
{
return unix_peer(osk) == NULL || unix_our_peer(sk, osk);
}
如上,从这个函数可以看出,其判断发送的目的套接字是否具有对端,以及目的套接字的对端是否是本端套接字。只有目的套接字无对端地址(无connect
操作)或者connect
对象为本端才能验证通过,否则返回权限错误。文章来源:https://www.toymoban.com/news/detail-664681.html
2. 结论
以上分析表明,如果unix数据报套接字要实现多对多自由发送,就必须放弃connect操作,否则发送时会遇到EPERM
错误。文章来源地址https://www.toymoban.com/news/detail-664681.html
到了这里,关于(5)unix套接字sendmsg消息返回权限错误(EPERM)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!