【发布时间】:2015-08-30 20:32:43
【问题描述】:
我使用 HAProxy,它每 10 秒发送一次健康检查。
它采用以下方式:
HAProxy -> server: [SYN]
server-> HAProxy : [SYN, ACK]
HAProxy->server : [RST, ACK]
我的TCP服务器是用java写的,方式如下:
while (true){
Socket socket = kaServerSocket.accept();
MyListener listener = new MyListener(socket);
listener.start(); //costly operation
}
在 Windows 7 上,accept() 在此交换后不会返回(它在常规 syn->ack->syn 握手后返回),这就是我所需要的。
但是,当应用程序在 Windows server 2012 上运行时,accept() 函数会返回从 HAProxy 发送的第一个 [SYN],并执行代价高昂的操作。
所以我有两个问题:
此行为是否可配置?
如果我不想在运行侦听器之前等待第一个比特或消息,如何在 windows 2012 上检测到来自 HAProxy 的连接?
编辑:
它可以连接到 Windows 上的 ATM TCP/IP 吗?
https://msdn.microsoft.com/en-us/library/windows/desktop/ms737526(v=vs.85).aspx
在使用accept函数时,意识到函数可能会返回 在连接建立遍历整个距离之前 发送者和接收者之间。这是因为接受函数 收到 CONNECT ACK 消息后立即返回;在 ATM 中,一个 路径中的下一个交换机尽快返回 CONNECT ACK 消息 处理 CONNECT 消息时(而不是 CONNECT ACK 被 由最终连接到的端节点发送 已确立的)。因此,应用程序应该意识到,如果数据是 在收到 CONNECT ACK 消息后立即发送,数据丢失 是可能的,因为连接可能尚未全部建立 发送者和接收者之间的方式。
【问题讨论】: