ENET(四)enet_protocol_send_acknowledgements

功能:将当前要发送的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;
}




评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值