在基于Android和iOS的应用程序上工作,该应用程序需要与在同一设备中运行的服务器进行通信.目前使用TCP环回连接与App和Server通信(用户层编写的应用程序,使用Android NDK用C++编写的服务器)
我想知道是否用Unix Domain socket替换内部通信会改善性能吗?
或者一般来说是否有任何证据/理论证明Unix Domain套接字会提供比TCP环回连接更好的性能?
我意识到,由于UNIX套接字是特定于平台的,因此必须涉及一些非Java代码.具体来说,我们感兴趣的是使用JDBC连接到只启用了UNIX域套接字的MySQL实例.
它看起来不像是支持的,但是根据我的阅读,如果我们能够找到适合Java的UNIX套接字的适当实现,那么至少应该可以为基于UNIX套接字的JDBC编写SocketFactory .
有没人试过这个?有谁知道这样的实现?
我是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) 是否存在将表示端点的"文件"放置到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域套接字的一个特点就是,在创建一个侦听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域套接字都是健壮的,因为我不负责选择侦听地址.
我有一个简单的代码,如:
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()调用同步的情况下实现我的目标.
运行以下命令失败:
sudo docker run -p unix:///tmp/file.sock:44444 -d image_name
Run Code Online (Sandbox Code Playgroud)
我的端口转发语法有问题还是这样的配置不可能?
我们有HTTP服务器,我们有基于HTTP客户端的应用程序(在Linux上)正常工作.
但是现在我们需要从客户端应用程序中侦听Unix域套接字.那么是否可以从unix域套接字发送/接收httprequest,httpresponse包?
Scenerio1:连接到localhost时,需要通过将HTTP连接到unix套接字而不是HTTPS连接到本地端口来消除SSL开销.
基本上寻找在HTTP URL中编码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)
但是,这些都没有告诉我套接字连接的另一端是什么.如何判断哪个进程占据另一端?
我有一个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服务器)?