SO_PEERCRED是获取连接的AF_UNIX流套接字的pid/uid/gid的简单方法,SCM_CREDENTIALS或多或少相同,但更复杂(各种辅助消息).指向两种方式的示例链接.
我该怎么用?
奇怪的是我没有通过谷歌搜索找到这个信息.使用Unix Domain套接字与TCP套接字建立连接的成本是多少?
现在我必须使用TCP套接字进行连接池,因为重新连接非常昂贵.我想知道我是否可以通过简单地切换到Unix域套接字并摆脱连接池来简化我的客户端.
我有Android应用程序,需要与我们的C++库建立unix域套接字连接(使用Android NDK)
public static String SOCKET_ADDRESS = "your.local.socket.address"; // STRING
Run Code Online (Sandbox Code Playgroud)
java中有LocalSocket接受"string"(your.local.socket.address)
#define ADDRESS "/tmp/unix.str" /* ABSOLUTE PATH */
struct sockaddr_un saun, fsaun;
if ((s = socket(AF_UNIX, SOCK_STREAM, 0)) < 0) {
perror("server: socket");
exit(1);
}
saun.sun_family = AF_UNIX;
strcpy(saun.sun_path, ADDRESS);
Run Code Online (Sandbox Code Playgroud)
但是在本机层的unix域套接字接受"绝对路径".那么这两方如何相互沟通呢?
如果可能,请分享任何示例
我正在研究Unix域套接字.特别是关于它是如何工作的.我用许多关键字搜索了很多次,但结果都是关于API,系统调用,如何使用它,示例.... 我也读过有关Pipe和FIFO的内容,因为据说Unix Domain套接字与Pipe和FIFO相同,但我仍然想知道更多关于Unix Domain Socket的概念/原理.它是如何工作的?(也许在内核级别,因为Wiki说:"这允许两个进程打开同一个套接字以进行通信.但是,通信完全发生在操作系统内核中."
我仍然想知道为什么Unix域Socket纪录片少于Pipe或FIFO?也许是因为它出生在很多年前?
任何人都可以向我展示任何想法或阅读哪些书籍/链接?
提前致谢!
我正在开发一个node.js应用程序,它将连接到UNIX套接字(在Linux机器上),并促进网页和该套接字之间的通信.到目前为止,我已经能够在我的主app.js中创建套接字并与此代码来回通信:
var net = require('net');
var fs = require('fs');
var socketPath = '/tmp/mysocket';
fs.stat(socketPath, function(err) {
if (!err) fs.unlinkSync(socketPath);
var unixServer = net.createServer(function(localSerialConnection) {
localSerialConnection.on('data', function(data) {
// data is a buffer from the socket
});
// write to socket with localSerialConnection.write()
});
unixServer.listen(socketPath);
});
Run Code Online (Sandbox Code Playgroud)
此代码使node.js创建一个UNIX套接字,/tmp/mysocket并通过nc -U /tmp/mysocket在命令行上进行测试来获得良好的通信.然而...
我想从我的node.js应用程序建立与现有UNIX套接字的连接.使用我当前的代码,如果我从命令行创建套接字(nc -Ul /tmp/mysocket),然后运行我的node.js应用程序,套接字和我的应用程序之间没有通信('connect'事件不是从node.js服务器对象触发的).
有关如何完成此任务的任何提示?我使用node.js函数的实验net.createSocket而不是net.createServer迄今为止失败了,我不确定这是否是正确的轨道.
我正在尝试找到一种在Android浏览器中使用开发者工具的方法,例如Chrome和Firefox.它们似乎没有附带构建版本,以避免使用我认为不到1%的用户使用的功能而使它们混乱.
我的背景:我现在使用我的Android手机作为功能开发环境,在最近的一个桌面Android界面(+键盘和桌面显示器)上使用Termux和Vim.但是,我不能在本地进行Web开发,因为它需要使用浏览器开发工具(至少是控制台,检查器和调试器).Firefox和Chrome的远程调试不会这样做,因为重点是避免使用笔记本电脑.
鉴于它们现在是独立的HTML/React应用程序(chrome和firefox),
在Play商店中提供这些浏览器的"开发者版本"有多难?
是否有可能将它们集成为Web扩展(至少对于Firefox,因为Chrome for Android会将它们停用)?
或者,由于两个浏览器都可以远程调试,这意味着它们会公开API.两个浏览器都通过unix套接字与主机通信.
我可以看到它们正在运行(cat/proc/net/unix | grep devtool),但我无法将其转发到localhost:9222,这是chrome dev工具前端需要的.
应该在Android设备上重现的是简单的命令:
adb -s <device> forward tcp:9222 localabstract:@chrome_devtools_remote.
我天真地尝试的是:socat -d tcp-listen:9222,fork abstract-connect:chrome_devtools_remote.
不幸的是,它不起作用:"由同行重置连接".我是否错过了从Unix套接字到JS开发工具前端可以理解的某种翻译步骤?
android unix-socket google-chrome-devtools firefox-developer-tools
使用Unix本地套接字编写下面的C源我得到了一个关于已经使用的地址的错误.在检查man 7 Unix了进一步的信息后,我试图创建一个子文件夹来执行我的程序(显然修改sun_path当前文件夹中的字段),但错误是一样的.
有人能帮助我吗?
源代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <sys/un.h>
#include <unistd.h>
#include <errno.h>
#define MAXLEN 128
int main (int argc, char *argv[]){
struct sockaddr_un server;
int serverfd, clientfd;
socklen_t addrsize = sizeof(struct sockaddr_un);
char buff[MAXLEN], *path;
if (argc < 2){
printf("Error: %s [MESSAGE]\n", argv[0]);
return 1;
}
if ((serverfd = socket(AF_UNIX, SOCK_STREAM, 0)) < 0){
printf("Error \"%s\" in socket()\n", strerror(errno));
exit(1);
}
puts("socket()");
server.sun_family = AF_UNIX;
path = …Run Code Online (Sandbox Code Playgroud) 我的系统用户是milosz,它映射到project_great中的PostgreSQL 用户pg_ident.conf。我正在使用对等身份验证通过 unix 域套接字连接到 PostgreSQL 数据库。此连接方法在使用 时有效,但在使用 Python 脚本中的相同参数psql时则失败。py-postgresql
在这里,我使用以下命令成功连接到数据库psql:
$ psql -U project_great \
> -d project_great \
> -h /var/run/postgresql
psql (9.3.4)
Type "help" for help.
project_great=>
Run Code Online (Sandbox Code Playgroud)
这是database_test.py:
#!/usr/bin/env python3
import postgresql
params = {
'user': 'project_great',
'database': 'project_great',
'unix': '/var/run/postgresql',
}
connection = postgresql.open(**params)
Run Code Online (Sandbox Code Playgroud)
在这里,我尝试通过运行连接到数据库./database_test.py:
$ ./database_test.py
Traceback (most recent call last):
File "./database_test.py", line 11, in <module>
sys.exit(main(sys.argv))
File "./database_test.py", …Run Code Online (Sandbox Code Playgroud) 在 .NET Core 中,我可以通过 unix 域套接字发送原始 HTTP,但我想使用库中的 HTTP 处理类,而不是组合我自己的 HTTP 处理。
这是我当前的工作但丑陋的代码:
const string HTTP_REQUEST = "POST /containers/foo/kill?signal=SIGHUP HTTP/1.0\r\n" +
"Host: localhost\r\n" +
"Accept: */*\r\n\r\n";
socket = new Socket(AddressFamily.Unix, SocketType.Stream, ProtocolType.IP);
socket.ReceiveTimeout = 2000; // 2 seconds
var endpoint = new UnixDomainSocketEndPoint("/var/run/docker.sock");
socket.Connect(endpoint);
byte[] requestBytes = Encoding.ASCII.GetBytes(HTTP_REQUEST);
socket.Send(requestBytes);
byte[] recvBytes = new byte[1024];
int numBytes = socket.Receive(recvBytes, 1024, SocketFlags.None);
socket.Disconnect(false);
Console.WriteLine( Encoding.ASCII.GetString(recvBytes));
Run Code Online (Sandbox Code Playgroud)
有没有办法使用 .NET Core 库中的类来处理 unix 域套接字上的 HTTP 请求和响应?
[编辑] 我知道在这个特定的用例中,有 Docker.DotNet 库可以实现我想要的,但总的来说,这个问题仍然值得问。
我读过Can Anybodyterpret docker.sock来了解/var/run/docker.sock它的作用,但它在 GitLab CI 的Use Docker socket binding中的使用让我感到困惑。
这是他们的注册命令示例gitlab-runner:
sudo gitlab-runner register -n \
--url https://gitlab.com/ \
--registration-token REGISTRATION_TOKEN \
--executor docker \
--description "My Docker Runner" \
--docker-image "docker:19.03.12" \
--docker-volumes /var/run/docker.sock:/var/run/docker.sock
Run Code Online (Sandbox Code Playgroud)
我看到可以从两个地方获取生成的容器docker。
/var/run/docker.sock。docker包含在基础映像中的二进制文件docker:19.03.12。这不是PATH冲突吗?我认为应该是其中之一,我可以docker从主机的 unix 套接字或基本映像中获得使用的能力。
我认为--docker-image应该是ubuntu:latest或者不带有 的东西docker,因为已经来自主机套接字PATH。docker或者,可以移除 docker 套接字安装座。
关于 的双重包含,实际上发生了什么docker?
unix-socket docker gitlab-ci gitlab-ci-runner docker-in-docker
unix-socket ×10
sockets ×4
android ×2
linux ×2
.net-core ×1
android-ndk ×1
c ×1
c# ×1
credentials ×1
docker ×1
gitlab-ci ×1
http ×1
javascript ×1
node.js ×1
postgresql ×1
python-3.x ×1
tcp ×1
unix ×1