- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
在套接字上的 accept()
之后,我正在尝试配置 TCP keepalive。
SockConnected = accept(SockListen, &RemoteAddr,
&RemoteLen);
/* A bit of checking goes here */
if (setsockopt (SockConnected , SOL_SOCKET, SO_KEEPALIVE,
(ST_CHAR *) &sockopt_on, sizeof (int) ) )
{
/* Error logging */
}
if (setsockopt(SockConnected , IPPROTO_TCP, TCP_KEEPIDLE, (char*)&(sockopt_tcp_keep_idle), sizeof(sockopt_tcp_keep_idle)))
{
/* Error logging */
}
if (setsockopt(SockConnected, IPPROTO_TCP, TCP_KEEPINTVL, (char*)&(sockopt_tcp_keep_intvl), sizeof(sockopt_tcp_keep_intvl)))
{
/* Error logging */
}
if (setsockopt(SockConnected, IPPROTO_TCP, TCP_KEEPCNT, (char*)&(sockopt_tcp_keep_cnt), sizeof(sockopt_tcp_keep_cnt)))
{
/* Error logging */
}
在为所有四个属性调用 getsockopt()
之后,一切似乎都正常。我检查了 Wireshark,没有发送任何保持事件数据包。我必须将 SOL_TCP
更改为 IPPROTO_TCP
,因为在为 TCP_KEEPIDLE
调用 setsockopt()
时,它返回错误号 92(找不到协议(protocol))。
在为传出连接调用 socket()
之后,我正在做同样的事情,而且它工作得很好。
我正在使用 C 和 Linux。
setsockopt
在接受后可能无法工作的原因是什么?
最佳答案
这是一个最小的工作示例。如果它适合您,您可以将其用作引用。
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/signal.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <netinet/tcp.h>
#define check(expr) if (!(expr)) { perror(#expr); kill(0, SIGTERM); }
void enable_keepalive(int sock) {
int yes = 1;
check(setsockopt(sock, SOL_SOCKET, SO_KEEPALIVE, &yes, sizeof(int)) != -1);
int idle = 1;
check(setsockopt(sock, IPPROTO_TCP, TCP_KEEPIDLE, &idle, sizeof(int)) != -1);
int interval = 1;
check(setsockopt(sock, IPPROTO_TCP, TCP_KEEPINTVL, &interval, sizeof(int)) != -1);
int maxpkt = 10;
check(setsockopt(sock, IPPROTO_TCP, TCP_KEEPCNT, &maxpkt, sizeof(int)) != -1);
}
int main(int argc, char** argv) {
check(argc == 2);
struct sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_port = htons(12345);
check(inet_pton(AF_INET, argv[1], &addr.sin_addr) != -1);
int server = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
check(server != -1);
int yes = 1;
check(setsockopt(server, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(int)) != -1);
check(bind(server, (struct sockaddr*)&addr, sizeof(addr)) != -1);
check(listen(server, 1) != -1);
if (fork() == 0) {
int client = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
check(client != -1);
check(connect(client, (struct sockaddr*)&addr, sizeof(addr)) != -1);
printf("connected\n");
pause();
}
else {
int client = accept(server, NULL, NULL);
check(client != -1);
enable_keepalive(client);
printf("accepted\n");
wait(NULL);
}
return 0;
}
示例输出(tcpdump
每秒报告保活数据包):
$ ./a.out 127.0.0.1 &
[1] 14010
connected
accepted
$ tcpdump -n -c4 -ilo port 12345
dropped privs to tcpdump
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on lo, link-type EN10MB (Ethernet), capture size 262144 bytes
18:00:35.173892 IP 127.0.0.1.12345 > 127.0.0.1.60998: Flags [.], ack 510307430, win 342, options [nop,nop,TS val 389745775 ecr 389745675], length 0
18:00:35.173903 IP 127.0.0.1.60998 > 127.0.0.1.12345: Flags [.], ack 1, win 342, options [nop,nop,TS val 389745775 ecr 389745075], length 0
18:00:36.173886 IP 127.0.0.1.12345 > 127.0.0.1.60998: Flags [.], ack 1, win 342, options [nop,nop,TS val 389745875 ecr 389745775], length 0
18:00:36.173898 IP 127.0.0.1.60998 > 127.0.0.1.12345: Flags [.], ack 1, win 342, options [nop,nop,TS val 389745875 ecr 389745075], length 0
4 packets captured
8 packets received by filter
0 packets dropped by kernel
关于接受后配置 TCP keepalive,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31426420/
几个月来我们遇到了一个奇怪的小问题: 我们集群上的负载(http、具有大量非常短(<100ms)请求的持久保持事件连接)分布非常不均匀。所有服务器都以相同的方式配置,但某些每秒推送数千个请求的连接最终
几个月来我们遇到了一个奇怪的小问题: 我们集群上的负载(http,具有大量非常短(<100 毫秒)请求的长期保持事件连接)分布非常不均匀。所有服务器都以相同的方式配置,但一些每秒推送数千个请求的连接最
List resultList = lists.iterator().next(); for (Iterator iterator = lists.iterator(); iterator.h
根据 PostgresSQL docs有参数 keepalives 和进一步的参数 keepalives_idle, keepalives_interval 和 keepalives_count 只有
我最近接手了一个 Android 项目。我们希望尝试加快我们拥有的同步过程。这是目前的代码: System.setProperty("http.keepAlive", "false"); 我没有写代码
我应该使用什么代码片段来配置普通的 Jersey Client 实例以“保持 Activity ”连接?谢谢! 最佳答案 假设您指的是 HTTP keep-alives,默认情况下支持它,并且可以通过
在套接字上的 accept() 之后,我正在尝试配置 TCP keepalive。 SockConnected = accept(SockListen, &RemoteAddr,
在 nginx.org 中,keepalive config 的默认值是 —,但我不太明白这是什么意思。 Syntax: keepalive connections; Default: — Co
我已经升级到 0.9.0.1,看起来很顺利,我的 meteor 网站运行良好。 但是,在对模板进行简单更改时(字面上更改跨度内的文本),我在服务器控制台中收到错误,然后服务器重新启动。 服务器控制台日
在 SignalR (1.2.2) 中,KeepAlive 和 ConnectionTimeout 之间有什么区别? 通过保持事件状态主动 ping 服务器,连接永远不会超时。那么Connection
我的 grunt 任务如下所示: grunt.registerTask "default", [ "clean:dist" # "useminPrepare" "copy:di
我管理着几个 DNN 门户,我需要一个解决方案来让它们在流量空闲时保持“活跃”。在给定的不活动时间后,IIS 将从内存中卸载 DNN 应用程序,这将影响第一个客户端请求的加载时间。 DNN 有一个“K
我正在尝试使用服务器发送事件传输查看从 Signalr 服务器发送的保持事件事件。我正在使用 Fiddler 来查看它,并且启用了“Stream”Fiddler 功能按钮......到目前为止我没有看
使用apache,当KeepAlive为Off时减少MaxClients是否合理?目前,MaxClients 设置为 150,这是 mpm-worker 的默认值。 nginx 为 apache 提供
我有一个 mediaOutput 标签,它的 createContent 属性要求支持 bean 处于某种状态。必须提供填充在 init 方法中的值列表。 因此,我为整个支持 bean 添加了一个 k
我设置了客户端和服务器之间有防火墙的设置。我连接到两个不同的服务器,即 A 和 B,数据可以在任何时间点从 A 或 B 流动,但一次只能流动一个。似乎我与服务器的连接每 2 小时 11 分 15 秒后
在 Android WebView 中创建 XMLHttpRequests 时,没有像看起来那样使用保活连接。 当请求频繁发出时,我的桌面浏览器都使用 keepalive(例如,在页面的 onload
场景如下: 有一个 http 反向代理,它有一个与应用程序服务器的持久连接池。它已经收到来自客户端的请求,并在检查连接是否打开后向后端发出相同的请求 与此同时,服务器在收到请求之前关闭了连接,代理因从
在他的article about preventing multiple instances Michael Covington 展示了一个应用程序的代码: static void Main()
当我执行 netstat -anto 时,我得到了以下输出 Proto Recv-Q Send-Q Local Address Foreign Address
我是一名优秀的程序员,十分优秀!