| 1024 | } |
| 1025 | |
| 1026 | void TUdpHost::RecvCycle() { |
| 1027 | NHPTimer::STime now; |
| 1028 | NHPTimer::GetTime(&now); |
| 1029 | S.SetRecvLagTime(now - CurrentT); |
| 1030 | for (;;) { |
| 1031 | TSockAddrPair addr; |
| 1032 | TAutoPtr<TUdpRecvPacket> recvBuf = S.Recv(&addr); |
| 1033 | if (!recvBuf.Get()) { // no more packets in socket |
| 1034 | break; |
| 1035 | } |
| 1036 | |
| 1037 | const char* payloadStart = recvBuf->Data.get() + recvBuf->DataStart; |
| 1038 | const char* payloadEnd = payloadStart + recvBuf->DataSize; |
| 1039 | |
| 1040 | const char* pktData = payloadStart; |
| 1041 | EUdpCmd cmd; |
| 1042 | ui8 originalCmd; |
| 1043 | if (!ReadBasicPacketHeader(&pktData, payloadEnd, &cmd, &originalCmd)) { |
| 1044 | Y_ASSERT(false); // do not remove this yassert - it'll help you to find problems in protocol |
| 1045 | continue; |
| 1046 | } |
| 1047 | Y_ASSERT(recvBuf->DataStart != 0 || originalCmd == (ui8) * (recvBuf->Data.get() + CMD_POS)); |
| 1048 | if (IsInConnectionCmd(cmd)) { |
| 1049 | ProcessInConnectionPacket(cmd, pktData, payloadEnd, originalCmd, addr.RemoteAddr, addr.MyAddr, recvBuf); |
| 1050 | |
| 1051 | } else if (IsSystemCmd(cmd)) { |
| 1052 | ProcessSystemPacket(cmd, pktData, payloadEnd); |
| 1053 | |
| 1054 | } else { |
| 1055 | // bug (forgotten cmd)? bad packet? |
| 1056 | Y_ASSERT(false); |
| 1057 | } |
| 1058 | } |
| 1059 | } |
| 1060 | |
| 1061 | bool TUdpHost::ProcessInConnectionPacket(const EUdpCmd cmd, const char* pktData, const char* pktEnd, const ui8 originalCmd, |
| 1062 | const sockaddr_in6& fromAddress, const sockaddr_in6& dstAddress, TAutoPtr<TUdpRecvPacket> recvBuf) { |
nothing calls this directly
no test coverage detected