相关疑难解决方法(0)

如何在进行多个连接时在C中设置套接字超时?

我正在写一个简单的程序,它可以与不同的服务器建立多个连接以进行状态检查.所有这些连接都是按需构建的; 最多可同时创建10个连接.我不喜欢单线程每插槽的想法,所以我将所有这些客户端套接字非阻塞,并将它们扔进select()池.

它工作得很好,直到我的客户抱怨等待时间太久才能在目标服务器停止响应时获得错误报告.

我已在论坛中查看了几个主题.有人建议可以使用alarm()信号或在select()函数调用中设置超时.但我正在处理多个连接,而不是一个连接.当进程范围超时信号发生时,我无法区分所有其他连接之间的超时连接.

无论如何都要更改系统默认超时持续时间?

c sockets linux

61
推荐指数
4
解决办法
17万
查看次数

有没有办法检测远程对等体已关闭TCP套接字,而不读取它?

首先,一些背景来解释动机:我正在研究一个非常简单的基于select()的TCP"镜像代理",它允许两个防火墙的客户端间接地相互通信.两个客户端都连接到此服务器,并且只要两个客户端都连接,客户端A发送到服务器的任何TCP字节都将转发到客户端B,反之亦然.

这或多或少都有效,只有一个小问题:如果客户端A连接到服务器并在客户端B连接之前开始发送数据,则服务器没有任何地方可以放置数据.我不想在RAM中缓冲它,因为这可能最终使用大量的RAM; 我也不想丢弃数据,因为客户端B可能需要它.所以我选择了第三个选项,即在客户端B连接之前,不要在客户端A的套接字上选择() - for-read-ready.这样客户端A就会阻塞,直到一切准备就绪.

这或多或少也有效,但是在客户端A的套接字上没有选择准备就绪的副作用是,如果客户端A决定关闭他与服务器的TCP连接,则服务器不会收到有关该事实的通知 - - 至少,直到客户端B出现并且服务器最终在客户端A的套接字上选择for-ready-ready,读取任何未决数据,然后获得套接字关闭通知(即recv()返回0).

如果服务器有某种方式知道(及时)客户端A关闭他的TCP连接,我更喜欢它.有没有办法知道这个?在这种情况下轮询是可以接受的(例如,我可以让select()每分钟唤醒一次并在所有套接字上调用IsSocketStillConnected(sock),如果存在这样的函数).

c select tcp

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

TCP 死链接检测

如何检测 TCP 连接中的死链接?当有人拉扯网线、关闭网络接口、打开 WiFi 或者像我这样......拔掉电源时,就会发生死链接。

Keep-alive 只对客户端有效,对服务器无效。

服务器只是接收数据,从不发送,因此使用 TCP_USER_TIMEOUT 将不起作用,因为发送 q 将始终为空。

我不想实现速度损失的应用层协议原因。(不再是零拷贝)

有效的一件事是发送 oob 数据,但因为你不应该再使用它了......

在下面编写的测试之后,您将看到客户端连接将在预期的短时间内关闭。 但是服务器会认为它已连接,永远......到目前为止等了3小时......

到目前为止,我在 3.13(Kubuntu) 和 3.18(OpenWrt) Linux 内核上对此进行了测试。这是一个错误吗?到目前为止,我已经阅读了很多 tcp/socket 编程书籍......根本没有帮助。请伙计们我需要你的帮助:)

我正在使用异步/非阻塞 io (epoll),因此发送和 rcv 超时也不起作用。

UPDATE2:现在有 x64/x86 的剪切源

添加:我以为我可以通过 epoll 事件捕获错误。

但是如果发生错误,我是否需要询问套接字?

到目前为止我尝试过的:

#define MAX_EVENTS      64
#define CON_RETRY_TIMEOUT   10      /* time to wait in sec until next connect attempt */
#define CON_TIMEOUT     10      /* time in sec after which stop trying to connect */
#define CON_IDLE        10      /* time in sec after which …
Run Code Online (Sandbox Code Playgroud)

c linux posix network-programming tcp

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

标签 统计

c ×3

linux ×2

tcp ×2

network-programming ×1

posix ×1

select ×1

sockets ×1