MCPcopy Create free account
hub / github.com/Tencent/Hardcoder / processReceive

Method processReceive

libapp2sys/src/main/cpp/udp.h:268–394  ·  view source on GitHub ↗

#lizard forgives

Source from the content-addressed store, hash-verified

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

Callers 2

recvEventMethod · 0.45
recvEventMethod · 0.45

Calls 7

sockaddrToStringFunction · 0.85
getCrc32Function · 0.85
sockaddrToint64Function · 0.85
pkgLenMethod · 0.80
countMethod · 0.80
toStringMethod · 0.45
eraseMethod · 0.45

Tested by

no test coverage detected