#lizard forgives
| 266 | |
| 267 | // #lizard forgives |
| 268 | int processReceive() { |
| 269 | struct sockaddr_in sender; |
| 270 | socklen_t sender_length = sizeof(struct sockaddr_in); |
| 271 | UdpPkg udpPkg; |
| 272 | const int recvRet = (int) recvfrom(m_fd, &udpPkg, sizeof(UdpPkg), 0, (struct sockaddr *) &sender, &sender_length); |
| 273 | |
| 274 | const std::string strAddr = sockaddrToString(sender); |
| 275 | pdbg("RECV ret:%d from:%s fd:%d %s", recvRet, strAddr.c_str(), m_fd, udpPkg.toString().c_str()); |
| 276 | |
| 277 | const uint32_t crc = udpPkg.datacrc; |
| 278 | udpPkg.datacrc = 0; |
| 279 | if (recvRet <= 0 || getCrc32((uint8_t *) &udpPkg, udpPkg.pkgLen()) != crc) { |
| 280 | perr("IGNORERecv FAULTPkg ret:%d datalen:%d datacrc:0x%x", recvRet, udpPkg.datalen, crc); |
| 281 | return 0; |
| 282 | } |
| 283 | |
| 284 | const int64_t iSender = sockaddrToint64(sender); |
| 285 | Receiver *rs = m_mapReceiver.count(iSender) ? m_mapReceiver[iSender] : NULL; |
| 286 | |
| 287 | if (udpPkg.type == PACKAGE_SYN) { |
| 288 | if (rs && rs->status != OPENING) { //may be new |
| 289 | pwrn("R_CLEANNewSync %s RS:%s", udpPkg.toString().c_str(), rs ? rs->toString().c_str() : "NUL_RS"); |
| 290 | cleanReceiver(rs); |
| 291 | rs = NULL; |
| 292 | } |
| 293 | if (!rs) { |
| 294 | rs = new Receiver(); |
| 295 | rs->fromaddr = sender; |
| 296 | m_mapReceiver[sockaddrToint64(sender)] = rs; |
| 297 | pwrn("R_NEW RECEIVER:%s", rs->toString().c_str()); |
| 298 | } |
| 299 | rs->status = OPENING; |
| 300 | rs->expectedSeq = udpPkg.seq + 1; |
| 301 | udpPkg.datalen = 0; |
| 302 | return sendPackage(&sender, PACKAGE_ACK, udpPkg.seq, &udpPkg); |
| 303 | } |
| 304 | |
| 305 | if (udpPkg.type == PACKAGE_DATA) { |
| 306 | |
| 307 | if ((!rs) || (rs->status != OPENING && rs->status != OPEN)) { |
| 308 | pwrn("R_IGNORERecvStat %s RS:%s", udpPkg.toString().c_str(), rs ? rs->toString().c_str() : "NUL_RS"); |
| 309 | return 0; |
| 310 | } |
| 311 | if ((udpPkg.seq < (rs->expectedSeq - CONST_WINDOW)) || (udpPkg.seq > rs->expectedSeq)) { //check in window |
| 312 | pwrn("R_IGNORERecvSEQ [%d,%d] %s RS:%s", udpPkg.seq, rs->expectedSeq, udpPkg.toString().c_str(), rs->toString().c_str()); |
| 313 | return 0; |
| 314 | } |
| 315 | |
| 316 | if (udpPkg.seq == rs->expectedSeq) { |
| 317 | if (rs->status == OPENING) rs->status = OPEN; |
| 318 | rs->expectedSeq = udpPkg.seq + 1; |
| 319 | dataRecv(&udpPkg, rs); |
| 320 | } |
| 321 | udpPkg.offset += udpPkg.datalen; // tell sender , i recv this pkg |
| 322 | udpPkg.datalen = 0; |
| 323 | return sendPackage(&sender, PACKAGE_ACK, udpPkg.seq, &udpPkg); |
| 324 | } |
| 325 |
no test coverage detected