我使用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,a CONNECT ACK消息由路径中的下一个交换机返回 处理CONNECT消息时(而不是CONNECT ACK) 由最终连接的终端节点发送 建立)。因此,应用程序应该意识到,如果数据是 收到CONNECT ACK消息后立即发送,数据丢失 是可能的,因为可能尚未建立所有连接 发送者和接收者之间的方式。
答案 0 :(得分:1)
请参阅How does the socket API accept() function work?
来自http://soft.vub.ac.be/~tvcutsem/distsys/sockets.pdf 看起来这是预期的行为,因为HAproxy正在打开套接字到客户端,以便将它路由到另一台机器。
问题是HAproxy符合TCP标准:)
解决方法应该是在验证服务器的某些逻辑后开始执行逻辑(例如,发送了一条小消息,并通过套接字收到了ACK)。