是的,在异步套接字之上实现握手是完全正常的。
考虑伪代码:
socket = accept() # or connect()
// now socket is connected
socket.write(logon_request)
logon_response = socket.read()
assert(logon_response ok)
// now socket is logged in
socket.write(more_handshake);
handshake_response = socket.read()
assert(handshake_response ok)
// now socket is ready to go
while data = socket.read()
{ process data ... }
您可以将其建模为状态机,然后很容易与异步套接字一起使用。看看下面的代码如何与上面的代码相似,但分解为多个回调:
# state Idle -> LoggingOn
handle_connection_event(socket)
state = LoggingOn
socket.write(logon_request)
# state LoggingOn -> Handshaking
handle_login_response(socket)
logon_response = socket.read()
assert(logon_response ok)
state = Handshaking
socket.write(more_handshake);
# state Handshaking -> Ready
handle_handshake_response(socket)
handshake_response = socket.read()
assert(handshake_response ok)
state = Ready
并且所有读取都进入这里,并根据状态机进行调度
handle_read(socket)
switch(state) {
case LoggingOn: handle_logon_response(socket)
case Handshaking: handle_handshake_response(socket)
case Ready: process(socket.read())
}
PS。由于某种原因,我在这里遇到了严重的格式化失败,希望它是可读的