标签: unix-socket

识别连接到Unix域套接字的程序

我有一个正在侦听Unix域套接字的程序.

当客户端连接到套接字时,我想找出连接的程序,然后决定是否允许连接(基于用户/组设置).

这可能在Linux下,如果是这样,怎么样?

linux unix-socket

11
推荐指数
2
解决办法
4461
查看次数

erlang:UNIX域套接字支持?

有没有办法直接从Erlang访问UNIX域套接字(例如/ var/run/dbus/system_bus_socket)而无需诉诸第三方驱动程序?

sockets linux erlang unix-socket

10
推荐指数
2
解决办法
4665
查看次数

无法连接到Linux"抽象"unix socket

我正在尝试使用UNIX套接字进行线程间通信.该程序仅适用于在Linux上运行.为了避免创建套接字文件,我想使用"抽象"套接字,如unix(7)中所述.

但是,我似乎无法连接到这些套接字.但是,如果我使用"pathname"套接字,一切都会正常工作.

这是代码(我没有引用任何错误处理,但它已经完成):线程#1:

int log_socket = socket(AF_LOCAL, SOCK_STREAM, 0);
struct sockaddr_un logaddr;
socklen_t sun_len = sizeof(struct sockaddr_un);
logaddr.sun_family = AF_UNIX;
logaddr.sun_path[0] = 0;
strcpy(logaddr.sun_path+1, "futurama");
bind(log_socket, &logaddr, sun_len);
listen(log_socket, 5);
accept(log_socket, &logaddr, &sun_len);
... // send - receive
Run Code Online (Sandbox Code Playgroud)

线#2:

struct sockaddr_un tolog;
int sock = socket(AF_LOCAL, SOCK_STREAM, 0);
tolog.sun_family = AF_UNIX;
tolog.sun_path[0] = 0;
strcpy(tolog.sun_path+1, "futurama");
connect(sock, (struct sockaddr*)&tolog, sizeof(struct sockaddr_un));
Run Code Online (Sandbox Code Playgroud)

如果我在上面的代码中所做的只是将sun_path更改为没有前导\ 0,那么事情就完美了.

strace输出:

t1: socket(PF_FILE, SOCK_STREAM, 0)         = 0
t1: bind(0, {sa_family=AF_FILE, path=@"futurama"}, 110)
t1: listen(0, 5)
t2: socket(PF_FILE, …
Run Code Online (Sandbox Code Playgroud)

linux unix-socket

10
推荐指数
1
解决办法
9955
查看次数

如何在Go编程语言中可靠地取消链接()Unix域套接字

我有一个Go程序托管一个简单的HTTP服务,localhost:8080因此我可以nginx通过proxy_pass指令将我的公共主机连接到它,作为反向代理服务我网站的部分请求.这一切都很好,没有问题.

我想将Go程序转换为在Unix域套接字而不是本地TCP套接字上托管HTTP服务,以提高安全性并减少TCP的不必要的协议开销.

问题:问题是bind()即使在程序终止之后,Unix域套接字仍然无法重用.第二次(以及之后)我运行Go程序它会以致命错误退出"address already in use".

unlink()服务器关闭时,常见的做法是Unix域套接字(即删除文件).但是,这在Go中很棘手.我的第一次尝试是defer在我的主函数中使用该语句(见下文),但如果我用CTRL-C这样的信号中断进程,它就不会运行.我想这是可以预料的.令人失望,但并非出乎意料.

问题:unlink()当服务器进程关闭时(优雅或不正常),是否有关于套接字的最佳实践?

这是我的一部分func main(),启动服务器监听参考:

// Create the HTTP server listening on the requested socket:
l, err := net.Listen("unix", "/tmp/mysocket")
if err != nil {
    log.Fatal(err)
} else {
    // Unix sockets must be unlink()ed before being reused again.
    // Unfortunately, this defer is not run when a signal is received, e.g. CTRL-C.
    defer func() { …
Run Code Online (Sandbox Code Playgroud)

signals go unix-socket

10
推荐指数
1
解决办法
6275
查看次数

MSYS/Cygwin使用什么机制来模拟Unix域套接字?

我正在尝试编写(在C#中)一个软件,该软件与使用MSYS构建的另一个软件(MSYS仿真的)Unix域套接字进行通信.我已经了解到"套接字服务器"(我不清楚正确的术语是什么)会创建一个包含以下内容的临时文件:

!<socket >59108 282F93E1-9E2D051A-46B57EFC-64A1852F
Run Code Online (Sandbox Code Playgroud)

59108对应于TCP端口,"套接字服务器"正在环回接口上侦听.使用数据包捕获工具,我已经能够确定"套接字客户端"连接到此端口,并通过环回接口交换信息.

我在我的软件中复制了这种行为,"套接字客户端"连接到我的监听端口,但没有传输任何信息.我相信这里有另一个步骤,一个很可能涉及"套接字"文件中的GUID,但我一直无法确定它是什么.如何触发客户端的通信需要做什么?

似乎MSYS正在使用Cygwin的机制,它涉及一个命名事件,即(可能是?)由"服务器"创建,并由"服务器"发出信号(显然),但我对实现的天真尝试似乎并不工作.

我找到了一封由康拉德·斯科特写的电子邮件,该电子邮件描述了"握手"过程中的各种缺点,并提出了据称解决这些问题的补丁.在这封电子邮件中,Conrad稍微描述了所使用的过程,他指出实际上有两个事件,一个由"服务器"管理,另一个由"客户端"管理.我已经使用API Monitor来查找对CreateEvent()的调用,虽然有几个,但我找不到一个看似"吸烟枪"的东西.对CreateSemaphore()也没有任何有趣的调用,所以似乎从未应用过Conrad的补丁(或者,至少,它是在MSYS分叉Cygwin之后的某个时候应用的).

c# sockets cygwin msys unix-socket

10
推荐指数
3
解决办法
1445
查看次数

退出应用程序时如何删除UNIX域套接字文件?

我有一个服务器应用程序,在特定的路径中创建一个UNIX域套接字,其名称和bind()s.

我只需要在应用程序代码中故意关闭/停止应用程序时删除套接字; 否则它需要开放.我该怎么做呢?

谢谢!

编辑:考虑我从终端内部启动并运行我的应用程序.

c sockets unix-socket

10
推荐指数
2
解决办法
1万
查看次数

Node Express Unix域套接字权限

我正在运行一个nginx服务器和一个节点表达web服务器,使用daemontools,setup通过Unix Domain Sockets进行通信.只有一些问题:

  1. 套接字文件在关闭时保持存在,因此我必须在重新启动服务器时将其删除,否则我将收到EADDRINUSE错误.
  2. nginx服务器作为nginx用户运行,节点服务器作为节点用户运行.
  3. 当服务器启动时,套接字文件由Express创建,umask将套接字文件的权限设置为755.
  4. setuidgid应用程序将组设置为用户的默认组,在这种情况下都是节点用户名.
  5. 应用程序和daemontools运行脚本的部署脚本在节点服务器实例启动之前执行,因此无法设置文件的权限,因为必须在启动过程中重新创建它.

如果我chgrp和chmod g + w套接字文件,一切正常.有没有办法设置它,以便生成节点应用程序的套接字文件,并使用正确的权限让nginx能够在不损害一个应用程序或另一个应用程序的安全独立性的情况下写入它?如果还有一种方法可以设置套接字文件的权限,那么我甚至可以将nginx添加到节点用户的组中,以便它可以组写.

file-permissions nginx unix-socket node.js express

9
推荐指数
2
解决办法
4353
查看次数

Unix套接字:AF_LOCAL与AF_INET

我刚刚开始在UNIX中使用套接字编程,我正在阅读套接字系统调用的手册页.我对AF_LOCAL参数及其使用时有点困惑.手册只是说当地的沟通.AF_INET格式不适用于本地通信吗?

c unix unix-socket

9
推荐指数
1
解决办法
7120
查看次数

Warp:绑定到Unix域套接字

此处列出的示例代码显示了如何仅在特定主机上进行warp侦听.

此外,这篇文章展示了一些关于如何在Haskell中使用unix域套接字的基础知识.

我如何结合这两种方法,以使warp监听(即绑定)特定的unix域套接字(比方说warp.sock)?

注意:这个问题故意没有研究,因为它回答了Q&A-Style.

haskell unix-socket haskell-warp

9
推荐指数
1
解决办法
670
查看次数

尝试连接到Docker守护程序套接字时权限被拒绝

在Ubuntu 16.04 LTS上,每当尝试使用docker login命令时,将显示以下交战消息:

docker login
Warning: failed to get default registry endpoint from daemon (Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get http://%2Fvar%2Frun%2Fdocker.sock/v1.30/info: dial unix /var/run/docker.sock: connect: permission denied). Using system default: https://index.docker.io/v1/
Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one.
Username: csomethingr
Password: 
Got permission denied while trying to connect to the …
Run Code Online (Sandbox Code Playgroud)

ubuntu unix-socket docker

9
推荐指数
3
解决办法
2万
查看次数