(5)unix套接字sendmsg消息返回权限错误(EPERM)

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函数底层实际调用函数

yacas 复制代码
err = -EPERM;
if (!unix_may_send(sk, other))
    goto out_unlock;

这里有一个判断,如果不满足,直接退出,很明显,返回权限错误和这个判断有关系。

yacas 复制代码
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对象为本端才能验证通过,否则返回权限错误。

2. 结论

以上分析表明,如果unix数据报套接字要实现多对多自由发送,就必须放弃connect操作,否则发送时会遇到EPERM错误。

相关推荐
迎風吹頭髮3 天前
UNIX下C语言编程与实践48-UNIX 信号量:概念、PV 操作与进程同步互斥
服务器·c语言·unix
数智顾问4 天前
自动驾驶软件系统基石:RTOS操作系统与Framework框架的协同机制解析
服务器·unix
迎風吹頭髮5 天前
UNIX下C语言编程与实践62-UNIX UDP 编程:socket、bind、sendto、recvfrom 函数的使用
c语言·单片机·unix
迎風吹頭髮5 天前
UNIX下C语言编程与实践60-UNIX TCP 套接字关闭:close 与 shutdown 函数的区别与使用场景
c语言·网络·unix
迎風吹頭髮5 天前
UNIX下C语言编程与实践58-UNIX TCP 连接处理:accept 函数与新套接字创建
c语言·网络·unix
迎風吹頭髮6 天前
UNIX下C语言编程与实践53-UNIX 共享内存控制:shmctl 函数与共享内存管理
服务器·c语言·unix
迎風吹頭髮6 天前
UNIX下C语言编程与实践63-UNIX 并发 Socket 编程:非阻塞套接字与轮询模型
java·c语言·unix
迎風吹頭髮6 天前
UNIX下C语言编程与实践59-UNIX TCP 数据传输:send 与 recv 函数的使用与数据处理
c语言·网络·unix
迎風吹頭髮6 天前
UNIX下C语言编程与实践55-TCP 协议基础:面向连接的可靠传输机制与三次握手、四次挥手
c语言·网络·unix
迎風吹頭髮6 天前
UNIX下C语言编程与实践35-UNIX 守护进程编写:后台执行、脱离终端、清除掩码与信号处理
java·c语言·unix