在enet_host_service函数中首先调用的是enet_protocol_dispatch_incoming_commands函数。这个函数服务端和客户端都会调用,只是:
服务端每次接受包时都会调用,但由于每次list都是空的,并不进入while。直到send函数和receive结束后list中接收到了包,才会
客户端只在连接服务端前调用,连接成功后就不再调用,因为event为null
static int
enet_protocol_dispatch_incoming_commands (ENetHost * host, ENetEvent * event)
{
while (! enet_list_empty (& host -> dispatchQueue))
{
ENetPeer * peer = (ENetPeer *) enet_list_remove (enet_list_begin (& host -> dispatc»
peer -> needsDispatch = 0;
switch (peer -> state)
{
case ENET_PEER_STATE_CONNECTION_PENDING:
case ENET_PEER_STATE_CONNECTION_SUCCEEDED:
enet_protocol_change_state (host, peer, ENET_PEER_STATE_CONNECTED);
event -> type = ENET_EVENT_TYPE_CONNECT;
event -> peer = peer;
event -> data = peer -> eventData;
return 1;
case ENET_PEER_STATE_ZOMBIE:
host -> recalculateBandwidthLimits = 1;
event -> type = ENET_EVENT_TYPE_DISCONNECT;
event -> peer = peer;
event -> data = peer -> eventData;
enet_peer_reset (peer);
return 1;
case ENET_PEER_STATE_CONNECTED:
if (enet_list_empty (& peer -> dispatchedCommands))
continue;
event -> packet = enet_peer_receive (peer, & event -> channelID);
if (event -> packet == NULL)
continue;
event -> type = ENET_EVENT_TYPE_RECEIVE;
event -> peer = peer;
if (! enet_list_empty (& peer -> dispatchedCommands))
{
peer -> needsDispatch = 1;
enet_list_insert (enet_list_end (& host -> dispatchQueue), & peer -> dispatc»
}
return 1;
default:
break;
}
}
return 0;
}