标签: unix-socket

Unix 域套接字有最大连接数吗?

对于 TCP/IP 连接,如果有单个目标端口,则两台主机之间最多有 64k 连接(来源:现代 Linux 机器可以拥有的理论最大打开 TCP 连接数是多少)。Unix 域套接字是否有连接限制,或者仅受文件描述符数量的限制?

unix sockets ulimit unix-socket

5
推荐指数
1
解决办法
5266
查看次数

Nginx 正在向 uWSGI 发出非常旧的请求?

我看到一种奇怪的情况,Nginx 或 uwsgi 似乎正在建立一个很长的传入请求队列,并在客户端连接超时后很长时间内尝试处理它们。我想理解并停止这种行为。以下是更多信息:

我的设置

我的服务器使用 Nginx 通过 Unix 文件套接字将 HTTPS POST 请求传递给 uWSGI 和 Flask。我基本上对所有内容都有默认配置。

我有一个 Python 客户端每秒向该服务器发送 3 个请求。

问题

运行客户端大约 4 小时后,客户端计算机开始报告所有连接超时。(它使用具有 7 秒超时的 Python 请求库。)大约 10 分钟后,行为发生了变化:连接开始失败,并显示 502 Bad Gateway。

我关闭了客户端。但是在关闭客户端电源后大约 10 分钟,服务器端 uWSGI 日志显示 uWSGI 尝试应答来自该客户端的请求!并top显示 uWSGI 使用 100% CPU(每个工作线程 25%)。

在这 10 分钟内,每个uwsgi.log条目都是这样的:

Thu May 25 07:36:37 2017 - SIGPIPE: writing to a closed pipe/socket/fd (probably the client disconnected) on request /api/polldata (ip 98.210.18.212) !!! Thu May 25 07:36:37 2017 …

nginx unix-socket flask uwsgi

5
推荐指数
1
解决办法
1543
查看次数

UNIX域套接字:是否存在"忙"信号?

可以在客户端通过一个UNIX域套接字(AF_UNIX型)推送数据用信号发送,如果接收端无法与负载应付?

要么

必须在套接字顶部有一个Client-Server协议来处理流量控制吗?

sockets unix-socket

4
推荐指数
2
解决办法
2522
查看次数

如何使用SOCK_DGRAM制作双向unix域套接字?

我正在尝试编写一个简单的Unix数据报服务器/客户端,并且遇到了一些问题.我想要的是一个服务器,它监听数据报套接字并将收到的每条消息的回复发送给原始发送者.我决定首先尝试使用socat"服务器"并在C中编写客户端.我正在运行这样的socat:

socat UNIX-DGRAM:/tmp/test.socket,fork EXEC:echo
Run Code Online (Sandbox Code Playgroud)

根据我的理解,这应该监听/tmp/test.socket并回复使用相同字符串收到的所有内容?然后我有一个看起来像这样的客户端程序(为清楚起见,删除了错误检查):

int s = socket(AF_UNIX, SOCK_DGRAM, 0);
struct sockaddr_un sa;
sa.sun_family = AF_UNIX;
strcpy(sa.sun_path, "/tmp/test.socket");

const char *data = "Testing data";
int err = sendto(s, data, strlen(data), 0, (struct sockaddr *)(&sa), sizeof(struct sockaddr_un));

printf("Sent!\n");

unsigned char *buffer = malloc(BUFFER_LENGTH);
struct sockaddr_storage recv_sa;
int recv_sa_len = 0;
int recv_len = recvfrom(s, buffer, BUFFER_LENGTH, 0, (struct sockaddr *)&recv_sa, &recv_sa_len);

for (int i = 0; i < recv_len; i++) {
    putc(buffer[i], stdout);
}
printf("\n");
Run Code Online (Sandbox Code Playgroud)

它应该发送数据包(有效),接收数据包,然后将其打印出来,但程序似乎无法接收数据包.我在这里做错了什么,或者我对Unix套接字有一个根本的误解?谢谢!

c network-programming datagram socat unix-socket

4
推荐指数
1
解决办法
9400
查看次数

磁盘上的unix套接字文件和ubuntu上的tmpfs

如果将unix套接字文件放在磁盘而不是tmpfs/ramdisk(ubuntu)上,速度是否有差异(无论多么微小)?

linux optimization ramdisk unix-socket

4
推荐指数
1
解决办法
1212
查看次数

socket_read() 中 $type 参数的含义

我尝试使用 PHP 套接字创建从 ac# app 到 PHP 5.3 脚本的 tcp/ip 套接字连接。c# 应用程序应将 JSON 字符串发送到 PHP 脚本。

我关于socket_read 手册的问题:它们是什么意思:

"PHP_BINARY_READ (Default) - use the system recv() function.
Safe for reading binary data."
Run Code Online (Sandbox Code Playgroud)

PHP_BINARY_READ 到底是什么,为什么在使用这个参数时我应该使用 recv() 函数?

任何帮助都受到高度赞赏。

php sockets unix-socket php-5.3

4
推荐指数
1
解决办法
339
查看次数

python - 将 BaseHTTPRequestHandler 与 UnixStreamServer 一起使用会导致异常

我正在尝试创建一个绑定到 Unix 域套接字的基本 HTTP 服务器,但是将 BaseHTTPRequestHandler 子类与 UnixStreamServer 一起使用会创建一个异常,表明它们不能一起工作。

玩具服务器.py:

from SocketServer import UnixStreamServer
from BaseHTTPServer import BaseHTTPRequestHandler

class MyHandler(BaseHTTPRequestHandler):
  def do_GET(self):
    self.send_response(200)
    self.send_header("Content-Type", "text/plain")
    self.end_headers()
    self.wfile.write("Hi!")

server = UnixStreamServer('./mysocket.sock', MyHandler)
server.serve_forever()
Run Code Online (Sandbox Code Playgroud)

然后我发送一个带有 的请求curl --unix-socket ./mysocket.sock http:/hello,这会导致服务器上出现以下异常(使用 Python 2.7.11):

Exception happened during processing of request from 
Traceback (most recent call last):
  File "/usr/lib/python2.7/SocketServer.py", line 290, in _handle_request_noblock
    self.process_request(request, client_address)
  File "/usr/lib/python2.7/SocketServer.py", line 318, in process_request
    self.finish_request(request, client_address)
  File "/usr/lib/python2.7/SocketServer.py", line 331, in finish_request
    self.RequestHandlerClass(request, client_address, self)
  File "/usr/lib/python2.7/SocketServer.py", …
Run Code Online (Sandbox Code Playgroud)

python sockets unix-socket basehttprequesthandler

4
推荐指数
1
解决办法
1575
查看次数

如何初始化机架服务器监听套接字

我必须修补一些代码,但无法弄清楚具体如何.所以基本上,我有一个机架服务器绑定到主机名和端口.我喜欢它绑定到unix socket.问题是,我无法弄清楚我必须给出的确切选项.

Rack::Server.new(:app => @app, :port => 3000).start 
Run Code Online (Sandbox Code Playgroud)

做了什么预期.我以为会是这样的:

Rack::Server.new(:app => @app, :socket => "path/to/file").start
Run Code Online (Sandbox Code Playgroud)

但是这会绑定到默认端口.我怎样才能做到这一点?

rack ruby-on-rails unix-socket

3
推荐指数
1
解决办法
1498
查看次数

为什么我们需要为C中的并发服务器中的每个客户端创建不同的进程?

我正在开发一个简单的客户端服务器程序,目的是创建一个聊天程序.我不熟悉C语言中的套接字编程.我了解到,为了服务多个客户端,服务器需要在每次客户端连接时分叉一个新进程.每次客户端请求连接时,该accept()函数返回描述符ID,并在fork()父节点关闭id之后.

相反,我没有关闭ID,这样当调用accept()时,每个新客户端都会获得一个newid.

nsockfd = accept(lsockfd, (struct sockaddr *) &cli_addr, &cli_len);
Run Code Online (Sandbox Code Playgroud)

现在这存储在2个变量中:

    if (client1 < 0)
    {   client1 = nsockfd;
        printf("if loop %d\n",nsockfd);
    }
    else 
    {   client2 = nsockfd;
        printf("else loop %d\n",nsockfd);
    }
Run Code Online (Sandbox Code Playgroud)

现在其余的代码是

        snprintf(buf, sizeof(buf), "Hi client1 Nice to meet you.",inet_ntoa(cli_addr.sin_addr));

        ret = send(client1, buf, strlen(buf), 0);
        if (ret == -1) {
            perror("Error sending message");
            exit(1);
                }
        printf("SRV - %s\n", buf);
        strcpy(buf,"");
        snprintf(buf, sizeof(buf), "Hi client2 Nice to meet you.",inet_ntoa(cli_addr.sin_addr));
        if(client2 > 0)     
        {ret = send(client2, …
Run Code Online (Sandbox Code Playgroud)

c unix sockets networking unix-socket

3
推荐指数
1
解决办法
823
查看次数

如何在不创建套接字文件的情况下使用unix域套接字

在Linux中,有没有使用AF_LOCAL(unix域套接字)在不使用文件的情况下在进程(IPC)之间进行通信的示例?(在只读文件系统上)

我必须使用Unix Domain套接字,但我没有在系统上创建文件创建/写入权限.

先感谢您.

sockets linux unix-socket

3
推荐指数
1
解决办法
1868
查看次数