问题标签 [unix-socket]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
sockets - 如何知道任何进程是否绑定到 Unix 域套接字?
我正在为 Linux 编写一个 Unix 域套接字服务器。
我很快发现 Unix 域套接字的一个特点是,在创建侦听 Unix 套接字时会创建匹配的文件系统条目,关闭套接字并不会删除它。此外,在手动删除文件系统条目之前,不可能再次bind()
将套接字连接到同一路径:如果给出的路径已经存在于文件系统中,则会bind()
失败。EADDRINUSE
因此,套接字的文件系统条目需要unlink()
在服务器关闭时被 'ed 以避免EADDRINUSE
服务器重新启动。然而,这不能总是做到(即:服务器崩溃)。我发现的大多数常见问题解答、论坛帖子、问答网站都只是unlink()
在调用bind()
. 然而,在这种情况下,最好在unlink()
'ing 之前知道一个进程是否绑定到这个套接字。
实际上,unlink()
在进程仍绑定到 Unix 套接字时,然后重新创建侦听套接字不会引发任何错误。然而,结果是旧的服务器进程仍在运行但无法访问:旧的侦听套接字被新的“屏蔽”。必须避免这种行为。
理想情况下,使用 Unix 域套接字,套接字 API 应该具有与绑定 TCP 或 UDP 套接字时相同的“互斥”行为:“我想将套接字 S 绑定到地址 A;如果进程已经绑定到此地址,只是抱怨! ”不幸的是,事实并非如此......
有没有办法强制执行这种“互斥”行为?或者,给定一个文件系统路径,有没有办法通过套接字 API 知道系统上的任何进程是否有一个绑定到该路径的 Unix 域套接字?我应该使用套接字 API ( flock()
, ...) 外部的同步原语吗?还是我错过了什么?
感谢您的建议。
注意:Linux 的抽象命名空间 Unix 套接字似乎解决了这个问题,因为unlink()
. 但是,我正在编写的服务器旨在通用:它必须对两种类型的 Unix 域套接字都具有鲁棒性,因为我不负责选择侦听地址。
sockets - 在哪里放置 Unix 域 (AF_UNIX) 套接字的端点(文件)?
是否有约定将代表端点的“文件”放置到 Unix 域套接字的位置?
我倾向于把它们放在/tmp/some-application-specific-subdir-name/
,但我想知道是否有更常见的地方。
背景是,POSIX不清楚访问此类“文件”的最大路径长度:
sun_path 的大小故意未定义。这是因为不同的实现使用不同的大小。例如,4.3 BSD 使用 108 的大小,而 4.4 BSD 使用 104 的大小。由于大多数实现源自 BSD 版本,因此大小通常在 92 到 108 的范围内。
应用程序不应假定 sun_path 的特定长度或假定它可以容纳 {_POSIX_PATH_MAX} 个字节 (256)。
所以这个对路径长度的“限制”应该被排除在应用程序的文件/路径名配置之外。
linux - 识别连接到 Unix 域套接字的程序
我有一个正在监听 Unix 域套接字的程序。
当客户端连接到套接字时,我想找出连接的程序,然后决定是否允许连接(基于用户/组设置)。
这在 Linux 下是否可行,如果可以,如何实现?
linux - 磁盘上的 unix 套接字文件与 ubuntu 上的 tmpfs
如果将 unix 套接字文件放在磁盘上而不是 tmpfs/ramdisk (ubuntu) 上,速度是否存在差异(无论多么小)?
java - 使用带有选择器的非阻塞模式下的 Java NIO 和 Unix 域套接字
有没有办法在 Java NIO 中使用 Unix 域套接字?我想使用 NIO,以便可以在单个线程中使用选择器。
我查看了junixsocket,但它似乎只支持普通套接字而不是支持选择器的 NIO 通道。
ruby - 使用 Ruby 加速 IPC
我正在尝试在 Ruby 中的同一个 Linux 机器上的 2 个进程之间进行 IPC,我需要尽可能优化解决方案。
我从 TCPSocket 开始,但我发现使用 UNIXSocket 可能更快,并且可能不会将数据复制到内核缓冲区。
我一直在阅读 SO 线程,看起来 mmap 可能很有趣。但是对于 mmap,我需要 a) 安装 mmap gem 和 b) 提供锁定,因为多个客户端进程可能会尝试与服务器进程连接(都在同一个盒子上运行)。
我的问题:
- 您还会推荐哪些其他选择?
- 您如何建议使用 ruby mmap 锁定内存?
- UNIXSocket 与 mmap 的数字(如果有的话)如何叠加?
sockets - NGINX post_action 到 UNIX DOMAIN SOCKET
我正在尝试将所有 nginx 流量发送(复制)到 Unix 套接字。
这是我的 nginx.conf 中的相关代码
我应该在这个套接字中启动一个服务器吗?
如果我这样做,我看不到任何来自套接字的请求。
此外,由于配置的原因,我的 nginx 在使用 ONE 请求进行测试时占用了巨大的 CPU 50-90%。
--
编辑:
我的错误,sock 文件不能被 NGINX 工作进程写入。给予适当的权限。
CPU 使用率高的原因是因为 POST_ACTION 标记存在内部重定向。
如果其他人面临 POST_ACTION 的内部重定向问题,我通过从该位置返回 444 来解决。这在我的情况下有效。
谢谢。
c++ - 提升 asio unix 套接字重用
我想在我的程序中使用“每个工作线程的每个 io_service”设计。但我不能重用unix套接字:
因“地址已在使用中”而失败。当我打开我的 asio/basic_socket_acceptor.hpp(提升 1.46.1)时,我看到了接受器构造函数的描述:
此构造函数创建一个接受器并自动打开它以侦听指定端点上的新连接。
@param reuse_addr 构造函数是否应该设置套接字选项socket_base::reuse_address。
这是一个 boost asio 错误,我应该将它发送到 bugtracker,对吗?
sockets - UNIX Socket:一个客户端可以读取到另一个客户端的数据吗?
考虑使用 UNIX 套接字作为 IPC 机制被多个客户端进程联系的服务器进程。
每个客户端代码都在无限循环中运行,试图从/向套接字读取数据。
我的问题:客户如何知道它不是在读取打算由其他进程读取的数据?服务器进程正在将数据写入单个套接字,对吗?
对于 TCP/IP,这个问题没有意义——套接字意味着一个元组<remote host, remote port, local host, local port, protocol>
,因此在试图访问服务器的不同机器上运行的进程永远无法读取彼此的数据。
但是对于 UNIX 套接字,它只是一个文件,对吧?还是我错过了什么?
haskell - 在 Haskel 中作为客户端连接到 Unix 域套接字
我找不到有关在 Haskell 中处理 Unix 域套接字的好信息。我需要一个简单的函数来打开一个套接字并向它写入一个命令。任何人都可以帮助我提供有关在哪里阅读有关此内容的建议或举个例子吗?
基本上,我需要移植这个简单的 Ruby 函数(如果它有助于理解我的意思):
它所做的一切都是打开套接字并向其写入命令,成功后返回 true。谢谢你。