| 571 | } |
| 572 | |
| 573 | Result ReceiveFrom(Socket socket, void* buffer, int length, int* received_bytes, Address* from_addr, uint16_t* from_port) |
| 574 | { |
| 575 | int result = 0; |
| 576 | *received_bytes = 0; |
| 577 | |
| 578 | if (IsSocketIPv4(socket)) |
| 579 | { |
| 580 | struct sockaddr_in sock_addr = { 0 }; |
| 581 | socklen_t addr_len = sizeof(sock_addr); |
| 582 | |
| 583 | result = recvfrom(socket, (char*)buffer, length, 0, (struct sockaddr*)&sock_addr, &addr_len); |
| 584 | if (result >= 0) |
| 585 | { |
| 586 | from_addr->m_family = dmSocket::DOMAIN_IPV4; |
| 587 | *IPv4(from_addr) = sock_addr.sin_addr.s_addr; |
| 588 | *from_port = ntohs(sock_addr.sin_port); |
| 589 | *received_bytes = result; |
| 590 | } |
| 591 | } |
| 592 | #if !defined(DM_IPV6_UNSUPPORTED) |
| 593 | else if (IsSocketIPv6(socket)) |
| 594 | { |
| 595 | struct sockaddr_in6 sock_addr = { 0 }; |
| 596 | socklen_t addr_len = sizeof(sock_addr); |
| 597 | |
| 598 | result = recvfrom(socket, (char*)buffer, length, 0, (struct sockaddr*)&sock_addr, &addr_len); |
| 599 | if (result >= 0) |
| 600 | { |
| 601 | from_addr->m_family = dmSocket::DOMAIN_IPV6; |
| 602 | memcpy(IPv6(from_addr), &sock_addr.sin6_addr, sizeof(struct in6_addr)); |
| 603 | *from_port = ntohs(sock_addr.sin6_port); |
| 604 | *received_bytes = result; |
| 605 | } |
| 606 | } |
| 607 | #endif // no ipv6 |
| 608 | else |
| 609 | { |
| 610 | dmLogError("Failed to receive from remote host, unsupported address family!"); |
| 611 | return RESULT_AFNOSUPPORT; |
| 612 | } |
| 613 | |
| 614 | return result >= 0 ? RESULT_OK : NativeToResultCompat(DM_SOCKET_ERRNO); |
| 615 | } |