对于 TCP/IP 连接,如果有单个目标端口,则两台主机之间最多有 64k 连接(来源:现代 Linux 机器可以拥有的理论最大打开 TCP 连接数是多少)。Unix 域套接字是否有连接限制,或者仅受文件描述符数量的限制?
我看到一种奇怪的情况,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 …
可以在客户端通过一个UNIX域套接字(AF_UNIX型)推送数据用信号发送忙,如果接收端无法与负载应付?
要么
必须在套接字顶部有一个Client-Server协议来处理流量控制吗?
我正在尝试编写一个简单的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套接字有一个根本的误解?谢谢!
如果将unix套接字文件放在磁盘而不是tmpfs/ramdisk(ubuntu)上,速度是否有差异(无论多么微小)?
我尝试使用 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() 函数?
任何帮助都受到高度赞赏。
我正在尝试创建一个绑定到 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) 我必须修补一些代码,但无法弄清楚具体如何.所以基本上,我有一个机架服务器绑定到主机名和端口.我喜欢它绑定到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)
但是这会绑定到默认端口.我怎样才能做到这一点?
我正在开发一个简单的客户端服务器程序,目的是创建一个聊天程序.我不熟悉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) 在Linux中,有没有使用AF_LOCAL(unix域套接字)在不使用文件的情况下在进程(IPC)之间进行通信的示例?(在只读文件系统上)
我必须使用Unix Domain套接字,但我没有在系统上创建文件创建/写入权限.
先感谢您.