| 441 | } |
| 442 | |
| 443 | int sendPackage(struct sockaddr_in *addr, uint8_t type, u_int32_t seq, UdpPkg *udpPkg) { |
| 444 | if ((!udpPkg) || (!addr)) { |
| 445 | perr("sendpackage pkg:%d || addr:%d", (uint32_t) ((uint64_t)udpPkg & 0xffffffffL) , (int) ((uint64_t)addr & 0xffffffffL) ); |
| 446 | return -1; |
| 447 | } |
| 448 | |
| 449 | udpPkg->version = CONST_VERSION; |
| 450 | udpPkg->type = type; |
| 451 | udpPkg->seq = seq; |
| 452 | udpPkg->datacrc = 0; |
| 453 | udpPkg->datacrc = getCrc32((uint8_t *) udpPkg, udpPkg->pkgLen()); |
| 454 | |
| 455 | pdbg("SEND type:%s:%d seq:%d datalen:%d datacrc:0x%x ", packageTypeStr(type), type, seq, udpPkg->datalen, udpPkg->datacrc); |
| 456 | |
| 457 | const int sendRet = (int) sendto(m_fd, udpPkg, udpPkg->pkgLen(), 0, (struct sockaddr *) addr, sizeof(struct sockaddr)); |
| 458 | |
| 459 | const std::string strAddr = sockaddrToString(*addr); |
| 460 | pdbg("SEND type:%s seq:%d addr:%s fd:%d len:%d sendRet:%d %s", packageTypeStr(udpPkg->type), udpPkg->seq, |
| 461 | strAddr.c_str(), m_fd, udpPkg->pkgLen(), sendRet, ""); |
| 462 | |
| 463 | if (udpPkg->type == PACKAGE_ACK) { |
| 464 | return sendRet; // Set a timeout event if the packet isn't an ACK |
| 465 | } |
| 466 | |
| 467 | const int64_t iSender = sockaddrToint64(*addr); |
| 468 | Sender *const ss = m_mapSender.count(iSender) ? m_mapSender[iSender] : NULL; |
| 469 | if (!ss) { |
| 470 | perr("Invalid socket. Not in the list. addr:%s fd:%d", strAddr.c_str(), m_fd); |
| 471 | return -1; |
| 472 | } |
| 473 | TimeoutEvent *pEvent = NULL; |
| 474 | if (udpPkg->type == PACKAGE_SYN) { |
| 475 | pEvent = &ss->synTimeoutEvent; |
| 476 | } else if (udpPkg->type == PACKAGE_FIN) { |
| 477 | pEvent = &ss->finTimeoutEvent; |
| 478 | } else if (udpPkg->type == PACKAGE_DATA) { |
| 479 | pEvent = getWindowBySeq(ss->dataWindow, udpPkg->seq); |
| 480 | if (!pEvent) { |
| 481 | perr("DataPkgNotFountInWin :%s win:%s", udpPkg->toString().c_str(), getWindowSeqList(ss->dataWindow).c_str()); |
| 482 | return -2; |
| 483 | } |
| 484 | } else { |
| 485 | perr("Invalid sock:%d type:%d", m_fd, udpPkg->type); |
| 486 | return -3; |
| 487 | } |
| 488 | |
| 489 | memcpy(&(pEvent->toaddr), addr, sizeof(struct sockaddr_in)); |
| 490 | pEvent->timeout = getMillisecond() + m_timeoutms; |
| 491 | addTimeoutEvent(pEvent); |
| 492 | return 0; |
| 493 | } |
| 494 | |
| 495 | Sender* getSender(sockaddr_in addr) { |
| 496 | const int64_t iSender = sockaddrToint64(addr); |
nothing calls this directly
no test coverage detected