功能:将当前要发送的ENetProtocol信息存放在host->command中。对端为peer,数据包内容在peer中保存,这里只用到了peer的acknowledgement结构体数据。
commandCount、bufferCount等都是对端的个数,如果是一对一发送,该值为1.while循环就只循环一次。
函数:enet_protocol_send_acknowledgements
static void
enet_protocol_send_acknowledgements (ENetHost * host, ENetPeer * peer)
{
ENetProtocol * command = & host -> commands [host -> commandCount]; //最终保存目标
ENetBuffer * buffer = & host -> buffers [host -> bufferCount];
ENetAcknowledgement * acknowledgement;
ENetListIterator currentAcknowledgement;
enet_uint16 reliableSequenceNumber;
currentAcknowledgement = enet_list_begin (& peer -> acknowledgements); //将待发送的指令存入currentAcknowledgement,之后还会降currentAcknowledgement赋给acknowledgement
int circle = 0;
while (currentAcknowledgement != enet_list_end (& peer -> acknowledgements)) //只循环了一次
{
circle++;
if(circle >= 4)
{
host -> continueSending = 1;
break;
}
if (command >= & host -> commands [sizeof (host -> commands) / sizeof (ENetProtocol)»
buffer >= & host -> buffers [sizeof (host -> buffers) / sizeof (ENetBuffer)] ||
peer -> mtu - host -> packetSize < sizeof (ENetProtocolAcknowledge))
{
host -> continueSending = 1;
break;
}
acknowledgement = (ENetAcknowledgement *) currentAcknowledgement;
currentAcknowledgement = enet_list_next (currentAcknowledgement);
buffer -> data = command;
buffer -> dataLength = sizeof (ENetProtocolAcknowledge);
host -> packetSize += buffer -> dataLength; //为8*count,一对一是8
reliableSequenceNumber = ENET_HOST_TO_NET_16 (acknowledgement -> command.header.reliableSequenceNumber); //在1的基础上每次累加256
command -> header.command = ENET_PROTOCOL_COMMAND_ACKNOWLEDGE;
command -> header.channelID = acknowledgement -> command.header.channelID;
command -> header.reliableSequenceNumber = reliableSequenceNumber;
command -> acknowledge.receivedReliableSequenceNumber = reliableSequenceNumber;
command -> acknowledge.receivedSentTime = ENET_HOST_TO_NET_16 (acknowledgement -> sentTime);
if ((acknowledgement -> command.header.command & ENET_PROTOCOL_COMMAND_MASK) == ENET_PROTOCOL_COMMAND_DISCONNECT)
enet_protocol_dispatch_state (host, peer, ENET_PEER_STATE_ZOMBIE);
//销毁中转的指针
enet_list_remove (& acknowledgement -> acknowledgementList);
enet_free (acknowledgement);
++ command;
++ buffer;
}
host -> commandCount = command - host -> commands;
host -> bufferCount = buffer - host -> buffers;
}