标签: unix-socket

TCP环回连接与Unix域套接字性能

在基于Android和iOS的应用程序上工作,该应用程序需要与在同一设备中运行的服务器进行通信.目前使用TCP环回连接与App和Server通信(用户层编写的应用程序,使用Android NDK用C++编写的服务器)

我想知道是否用Unix Domain socket替换内部通信会改善性能吗?

或者一般来说是否有任何证据/理论证明Unix Domain套接字会提供比TCP环回连接更好的性能?

unix sockets tcp loopback unix-socket

97
推荐指数
5
解决办法
6万
查看次数

Java的UNIX套接字实现?

我意识到,由于UNIX套接字是特定于平台的,因此必须涉及一些非Java代码.具体来说,我们感兴趣的是使用JDBC连接到只启用了UNIX域套接字的MySQL实例.

它看起来不像是支持的,但是根据我的阅读,如果我们能够找到适合Java的UNIX套接字的适当实现,那么至少应该可以为基于UNIX套接字的JDBC编写SocketFactory .

有没人试过这个?有谁知道这样的实现?

java unix jdbc unix-socket

48
推荐指数
3
解决办法
4万
查看次数

套接字编程中的htons()函数

我是socket编程的新手,我正在努力了解它的操作htons().我已经在互联网上一样阅读一些教程一个实例.但我无法理解究竟htons()是什么.我尝试了以下代码:

#include <stdio.h>
#include <sys/types.h> 
#include <sys/socket.h>
#include <netinet/in.h>

int main( int argc, char *argv[] )
{
    int sockfd, newsockfd, portno, clilen;
    char buffer[256];
    struct sockaddr_in serv_addr, cli_addr;
    int  n;

    /* First call to socket() function */
    sockfd = socket(AF_INET, SOCK_STREAM, 0);
    if (sockfd < 0) 
    {
        perror("ERROR opening socket");
        exit(1);
    }
    /* Initialize socket structure */
    bzero((char *) &serv_addr, sizeof(serv_addr));
    portno = 5001;
    serv_addr.sin_family = AF_INET;
    serv_addr.sin_addr.s_addr = INADDR_ANY;
    serv_addr.sin_port = …
Run Code Online (Sandbox Code Playgroud)

c sockets unix-socket

44
推荐指数
4
解决办法
11万
查看次数

在哪里放置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).

因此,路径长度上的"限制"应该保留在应用程序的文件/路径名配置之外.

unix sockets posix unix-socket fhs

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

如何知道任何进程是否绑定到Unix域套接字?

我正在为Linux编写一个Unix域套接字服务器.

我很快发现Unix域套接字的一个特点就是,在创建一个侦听Unix套接字创建匹配的文件系统条目时,关闭套接字不会删除它.此外,在手动删除文件系统条目之前,不可能再次bind()将套接字转到同一路径:如果文件系统中已存在已给出的路径,则bind()失败EADDRINUSE.

因此,套接字的文件系统条目需要unlink()在服务器关闭时进行,以避免EADDRINUSE服务器重启.但是,这不能总是这样做(即:服务器崩溃).我发现大多数常见问题解答,论坛帖子,问答网站只是unlink()在致电之前建议套接字bind().然而,在这种情况下,需要知道进程是否在该套接字之前绑定到该套接字unlink().

实际上,unlink()当进程仍然绑定到它然后重新创建侦听套接字时,使用Unix套接字不会引发任何错误.但是,结果是,旧的服务器进程仍在运行但无法访问:旧的侦听套接字被新的监听套接字"屏蔽".必须避免这种行为.

理想情况下,使用Unix域套接字时,套接字API应该暴露出绑定TCP或UDP套接字时暴露的相同"互斥"行为:" 我想将套接字S绑定到地址A;如果进程已绑定到此地址,只是抱怨! "不幸的是,事实并非如此......

有没有办法强制执行这种"互斥"行为?或者,给定一个文件系统路径,有没有办法通过套接字API 知道系统上的任何进程是否有绑定到此路径的Unix域套接字?我应该使用套接字API(flock(),...)外部的同步原语吗?或者我错过了什么?

谢谢你的建议.

注意:Linux的抽象命名空间Unix套接字似乎解决了这个问题,因为没有文件系统条目unlink().但是,我正在编写的服务器旨在通用:它必须对两种类型的Unix域套接字都是健壮的,因为我不负责选择侦听地址.

sockets unix-socket

34
推荐指数
2
解决办法
8217
查看次数

如何在C中创建具有特定权限的Unix Domain Socket?

我有一个简单的代码,如:

sockaddr_un address;
address.sun_family = AF_UNIX;
strcpy(address.sun_path, path);
unlink(path);

int fd = socket(AF_UNIX, SOCK_STREAM, 0);
bind(fd, (sockaddr*)(&address), sizeof(address));
listen(fd, 100);
Run Code Online (Sandbox Code Playgroud)

我想以原子方式创建具有特定权限的Unix Domain Socket文件,例如:0777.手册没有说明有关套接字文件权限的umask任何内容.甚至,如果umask确实影响了套接字文件,那么它不是一种原子方式 - 在多线程程序中.

我希望,有一种方法可以在不使用umask()调用同步的情况下实现我的目标.

c unix sockets umask unix-socket

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

docker port可以转发到主机容器上的unix文件套接字吗?

运行以下命令失败:

sudo docker run -p unix:///tmp/file.sock:44444 -d image_name
Run Code Online (Sandbox Code Playgroud)

我的端口转发语法有问题还是这样的配置不可能?

unix-socket docker

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

AF over AF_UNIX:与unix套接字的HTTP连接

我们有HTTP服务器,我们有基于HTTP客户端的应用程序(在Linux上)正常工作.

但是现在我们需要从客户端应用程序中侦听Unix域套接字.那么是否可以从unix域套接字发送/接收httprequest,httpresponse包?

Scenerio1:连接到localhost时,需要通过将HTTP连接到unix套接字而不是HTTPS连接到本地端口来消除SSL开销.

基本上寻找在HTTP URL中编码unix套接字路径的标准.

提前谢谢了.

sockets webserver client-server http unix-socket

19
推荐指数
1
解决办法
9202
查看次数

识别unix域套接字连接的另一端

我正在试图弄清楚哪个进程占据了unix域套接字的另一端.在某些strace输出中,我已经确定了一个给定的文件描述符,它涉及我正在调试的问题,而且我想知道哪一个进程在另一端.由于与该套接字有多个连接,因此只需按路径名进行操作即可.

lsof 向我提供以下信息:

dbus-daem  4175  mvg   10u  unix 0xffff8803e256d9c0      0t0  12828 @/tmp/dbus-LyGToFzlcG
Run Code Online (Sandbox Code Playgroud)

所以我知道一些地址("内核地址"?),我知道一些套接字号,我知道路径.我可以在其他地方找到相同的信息:

$ netstat -n | grep 12828
unix  3      [ ]         STREAM     CONNECTED     12828    @/tmp/dbus-LyGToFzlcG
$ grep -E '12828|ffff8803e256d9c0' /proc/net/unix
ffff8803e256d9c0: 00000003 00000000 00000000 0001 03 12828 @/tmp/dbus-LyGToFzlcG
$ ls -l /proc/*/fd/* 2>/dev/null | grep 12828
lrwx------ 1 mvg users 64 10. Aug 09:08 /proc/4175/fd/10 -> socket:[12828]
Run Code Online (Sandbox Code Playgroud)

但是,这些都没有告诉我套接字连接的另一端是什么.如何判断哪个进程占据另一端?

linux kernel unix-socket

18
推荐指数
2
解决办法
5354
查看次数

在Forever下运行的NodeJS上正常关闭UNIX套接字服务器

我有一个NodeJS应用程序,它设置一个UNIX套接字来公开一些进程间通信通道(某种监视的东西).UNIX套接字文件放在os.tmpdir()文件夹中(即/tmp/app-monitor.sock).

var net = require('net');
var server = net.createServer(...);
server.listen('/tmp/app-monitor.sock', ...);
Run Code Online (Sandbox Code Playgroud)

我使用信号处理(SIGINT,SITERM等...)来正常关闭我的服务器并删除套接字文件.

function shutdown() {
    server.close(); // socket file is automatically removed here
    process.exit();
}

process.on('SIGINT', shutdown);
// and so on
Run Code Online (Sandbox Code Playgroud)

我的应用程序正在运行forever start ...以监视它的生命周期.

我的forever restartall命令有问题.当永远这样做时restartall,使用a SIGKILL来终止所有子进程.SIGKILL无法通过进程处理,因此我的应用程序在没有任何关闭过程的情况下死亡

问题是套接字文件在SIGKILL使用时不会被删除.重新启动子进程后,无法启动新服务器导致' listen调用将导致EADDRINUSE错误.

我无法在应用启动过程中删除现有的套接字文件导致'我不知道它是真正的工作套接字还是先前不干净关闭的痕迹.

所以,问题是......处理这种情况的更好方法是什么(SIGKILL和UNIX-socket服务器)?

unix-socket node.js forever

18
推荐指数
1
解决办法
8744
查看次数

标签 统计

unix-socket ×10

sockets ×6

unix ×4

c ×2

client-server ×1

docker ×1

fhs ×1

forever ×1

http ×1

java ×1

jdbc ×1

kernel ×1

linux ×1

loopback ×1

node.js ×1

posix ×1

tcp ×1

umask ×1

webserver ×1