| 489 | } |
| 490 | |
| 491 | Result ReceiveFrom(Socket socket, void* buffer, int length, int* received_bytes, |
| 492 | Address* from_addr, uint16_t* from_port) |
| 493 | { |
| 494 | int result = 0; |
| 495 | *received_bytes = 0; |
| 496 | |
| 497 | if (IsSocketIPv4(socket)) |
| 498 | { |
| 499 | struct sockaddr_in sock_addr = { 0 }; |
| 500 | socklen_t addr_len = sizeof(sock_addr); |
| 501 | |
| 502 | result = recvfrom(socket, buffer, length, 0, (struct sockaddr*) &sock_addr, &addr_len); |
| 503 | if (result >= 0) |
| 504 | { |
| 505 | from_addr->m_family = dmSocket::DOMAIN_IPV4; |
| 506 | *IPv4(from_addr) = sock_addr.sin_addr.s_addr; |
| 507 | *from_port = ntohs(sock_addr.sin_port); |
| 508 | *received_bytes = result; |
| 509 | } |
| 510 | } |
| 511 | #if !defined(DM_IPV6_UNSUPPORTED) |
| 512 | else if (IsSocketIPv6(socket)) |
| 513 | { |
| 514 | struct sockaddr_in6 sock_addr = { 0 }; |
| 515 | socklen_t addr_len = sizeof(sock_addr); |
| 516 | |
| 517 | result = recvfrom(socket, buffer, length, 0, (struct sockaddr*) &sock_addr, &addr_len); |
| 518 | if (result >= 0) |
| 519 | { |
| 520 | from_addr->m_family = dmSocket::DOMAIN_IPV6; |
| 521 | memcpy(IPv6(from_addr), &sock_addr.sin6_addr, sizeof(struct in6_addr)); |
| 522 | *from_port = ntohs(sock_addr.sin6_port); |
| 523 | *received_bytes = result; |
| 524 | } |
| 525 | } |
| 526 | #endif // no ipv6 |
| 527 | else |
| 528 | { |
| 529 | dmLogError("Failed to receive from remote host, unsupported address family!"); |
| 530 | return RESULT_AFNOSUPPORT; |
| 531 | } |
| 532 | |
| 533 | return result >= 0 ? RESULT_OK : NativeToResultCompat(DM_SOCKET_ERRNO); |
| 534 | } |
nothing calls this directly
no test coverage detected