问题标签 [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.
c - 如何检查套接字的另一端是否已被接受?
我有一个客户端/服务器设置,我希望我的客户端知道服务器是否接受了连接。否则我的客户不知道它仍在等待被接受。我不能依靠进一步的通信(协议规范)来验证这一点。因此,例如,从服务器向客户端发送“Good to go”字符串不是一种选择。是否有标志或其他东西可以检查服务器是否确实在接收?一些示例代码如下:
perl - 如何从 perl 中的 IO::Async::Loop 事件中删除 IO::Async::Listener (或其通知程序)对象
我有一段代码使用 IO::Socket::UNIX 创建一个 UNIX 域套接字,并将其提供给 IO::Async::Listener 的一个实例,以处理监听套接字并通知接收数据。然后,将 IO::Async::Listener 添加到 IO::Async::Loop 事件循环实例中。当然,套接字是在受控管理器中动态创建的。
在某种情况下,我想从事件循环中删除套接字(完全删除它,或者如果可能的话在其他情况下暂时禁用它)但我不知道如何。
IO::Async::Loop 提供通过 $loop->remove( $notifier ) 从事件循环中删除 IO::Async::Notifier 对象,但创建通知器由 IO::Async::Listener 内部处理(通过 IO ::Async::Stream,我猜?)。即使在我的脚本的 Ctrl-C 上,套接字文件也没有被删除,我只需要手动close $socket and unlink( $path )
处理套接字文件吗?
这是所需行为的抽象代码:
sql - 异步服务器,在等待回调时处理断开连接
根据异步服务器管理,我有一个问题。我正在使用libevent2和(出于我自己的学习经验)普通的 ANSI C。我使用 apache2 utils 中的 ab 进行压力测试。主要是-n 10000
和-c 400
。我的数据库是本地网络中 debian 计算机上的 sql 服务器。所以连接速度非常快。--leak-check=full --show-reachable=yes
我还使用 valgrind ( )来分析我的应用程序
我现在有一个问题。当我对 sql 数据库进行同步调用时,一切正常。但这一切都是在主线程上完成的,因此新客户端接收数据需要一些时间(在压力运行时)。当我对 sql 数据库进行异步调用时,只要在 sql 调用返回之前没有客户端断开连接,一切正常。一旦 sql 调用返回并且客户端已经断开连接,我会得到很多无效的读取错误(当然),因为它的缓冲区已经被释放,套接字已关闭等。我已经尝试了很多不同的东西但不能t 得到适当的解决方案。
我只是想问一下你一般是如何处理这样的事情的?例如,您是否保留了一个 BST,其中包括所有连接的客户端,并且当异步调用返回时,您会在其中搜索它?如果它仍然在那里,你执行回调,否则丢弃它?我认为这可能会严重影响性能。我还尝试检查套接字是否仍然打开,但这有点奇怪。
recv(fd, buffer, 1, MSG_PEEK)
总是returned -1
(在打开和关闭的非阻塞套接字上)..
好吧,很难解释我已经做了什么,所以我只是等待你们会回答:-)
问候马库斯
更新:我只是有一个疯狂的想法,为每个连接使用互斥锁。当我进入异步调用时,我将其锁定,并在它返回后将其释放.. :-) 但我不相信这种方法.. 听起来不对.. 任何人都可以推荐这种方法吗?
更新 2:我尝试了我的想法,效果很好。正确处理有点棘手,但锁定做到了
c++ - 在 C / Unix 中侦听 IP 子网的套接字
我正在尝试用 C 编写服务器-客户端套接字程序。目的是让服务器在特定端口上侦听,但跨越属于同一 IP 子网的 IP 地址范围。此 IP 子网属于127.xxx范围(当然不是 127.0.0.1)。
需要注意的几点:
- 这是一个基于流的套接字,而不是数据报套接字。
- 这不是广播地址。
- 仅在 Unix/Linux 平台上以 C/C++ 实现
我不想在服务器上为范围内的每个 IP 地址打开多个套接字。这是不可扩展的。
任何帮助将不胜感激。这甚至可行吗?
javascript - 使用 Node.js 实时读取文件
我需要找出使用 node.js 实时读取写入文件的数据的最佳方法。麻烦的是,Node 是一艘快速移动的船,这使得找到解决问题的最佳方法变得困难。
我想要做什么
我有一个 java 进程正在做某事,然后将它所做的事情的结果写入一个文本文件。它通常需要 5 分钟到 5 小时来运行,数据一直在写入,并且可以达到相当高的吞吐率(大约 1000 行/秒)。
我想实时读取这个文件,然后使用节点聚合数据并将其写入可以在客户端上绘制图形的套接字。
客户端、图形、套接字和聚合逻辑都已完成,但我对读取文件的最佳方法感到困惑。
我尝试过(或至少玩过)
FIFO
- 我可以告诉我的 Java 进程写入 fifo 并使用节点读取它,这实际上是我们目前使用 Perl 实现的方式,但是因为其他一切都在节点中运行将代码移植过来是有意义的。
Unix Sockets
- 如上。
fs.watchFile
- 这能满足我们的需要吗?
fs.createReadStream
- 这比 watchFile 好吗?
fs
& tail -f
- 似乎是一个黑客。
实际上,我
倾向于使用 Unix 套接字的问题是什么,这似乎是最快的选择。但是 node 是否有更好的内置功能来实时从 fs 读取文件?
c - unix 套接字上的连接数
给定一个任意的 unix 套接字地址,我是否能够通过 POSIX api 调用获取其上的连接数?
还是我必须通过 /proc 文件系统?
c - 发送文件描述符时 sendmsg 不起作用
我正在使用 unix 域套接字在不同进程之间发送打开的文件描述符。Unix 域套接字工作正常,但是当我用来sendmsg
发送文件描述符时发生了一些奇怪的事情。该函数在之后返回,sendmsg
并且 sendmsg 不返回任何内容。然后 recvmsg 给出Invalid Argument
错误。这是我的代码。
客户端(发送文件描述符):
服务器(接收文件描述符):
客户端输出:
甚至没有inside sendmsg condition
和after sendmsg
打印?
c - 将套接字绑定到计算机的地址以进行侦听
我创建了旨在将新套接字绑定到计算机地址的代码,以侦听特定端口上的传入连接。我正在使用 getaddrinfo。这是最好的方法吗?将端口整数转换为字符串似乎毫无意义。有没有不需要 sprintf 的方法来做到这一点?
c++ - Unix域:connect():没有这样的文件或目录
如标题中所述,我对具有相应地址的 unix 域类型套接字的connect()调用导致错误ENOENT: no such file or directory。
正确初始化了两个套接字,并相应地创建和绑定了套接字文件。服务器和客户端套接字在不同的进程中运行,尽管客户端进程是 fork()-ed 和 execl()-ed。这也是我解析客户端和服务器套接字地址的方式,我用它来设置客户端套接字。服务器进程正在使用 pthreads。
这是我的connect()尝试:
我尝试了不同的大小值,例如:
令人惊讶的是,除了最后一个之外的所有初始化都会导致EINVAL: connect()的参数无效错误,我得到ENOENT: no such file or directory只有最后一个。我什至从互联网上尝试了整个示例,但没有成功。显然,用 size_t 或int交换 socklen_t不会改变任何东西。
我已经检查过了:
- address.sun_path 包含从根目录开始的正确套接字文件路径
- address.sun_path 的长度为 61 个字符
- address.sun_family 设置为 AF_UNIX/AF_LOCAL
- address.sun_family 的大小为 2 个字节
- 创建和绑定两个套接字时没有错误
- 服务器套接字处于监听状态
- sizeof(address) 返回 110,因为它应该是
现在我想知道为什么手册页示例不起作用以及是否有未在linux.die.net或www.kernel.org更新的更改。如果相关的话,我的操作系统是 Debian Squeeze。
任何想法我做错了什么?以及如何解决?如果您需要更多代码或有疑问,请随时问我(虽然我可能不需要说明这一点,但这是我在这里的第一篇文章>.<)。
顺便说一句,对不起我的英语不好
更新 2
解决了。为了清楚起见,我将在下面的额外答案中发布它。
linux - 无法连接到 Linux“抽象”unix 套接字
我正在尝试使用 UNIX 套接字进行线程间通信。该程序仅用于在 Linux 上运行。为了避免创建套接字文件,我想使用“抽象”套接字,如 unix(7) 中所述。
但是,我似乎无法连接到这些套接字。不过,如果我使用“路径名”套接字,一切正常。
这是代码(我没有引用任何错误处理,但已经完成):thread#1:
线程#2:
如果我在上面的代码中所做的只是将 sun_path 更改为没有前导 \0,则一切正常。
strace 输出:
我知道connect在accept之前,这不是问题(我尝试确保在connect()之前调用accept(),结果相同。此外,如果套接字是“路径名”,一切都很好)。