| 436 | } |
| 437 | |
| 438 | Result SendTo(Socket socket, const void* buffer, int length, int* sent_bytes, Address to_addr, uint16_t to_port) |
| 439 | { |
| 440 | int result = 0; |
| 441 | if (IsSocketIPv4(socket)) |
| 442 | { |
| 443 | assert(to_addr.m_family == DOMAIN_IPV4); |
| 444 | |
| 445 | struct sockaddr_in sock_addr = { 0 }; |
| 446 | sock_addr.sin_family = AF_INET; |
| 447 | sock_addr.sin_addr.s_addr = *IPv4(&to_addr); |
| 448 | sock_addr.sin_port = htons(to_port); |
| 449 | |
| 450 | result = (int) sendto(socket, buffer, length, 0, (const sockaddr*) &sock_addr, sizeof(sock_addr)); |
| 451 | } |
| 452 | #if !defined(DM_IPV6_UNSUPPORTED) |
| 453 | else if (IsSocketIPv6(socket)) |
| 454 | { |
| 455 | assert(to_addr.m_family == DOMAIN_IPV6); |
| 456 | |
| 457 | struct sockaddr_in6 sock_addr = { 0 }; |
| 458 | sock_addr.sin6_family = AF_INET6; |
| 459 | memcpy(&sock_addr.sin6_addr, IPv6(&to_addr), sizeof(struct in6_addr)); |
| 460 | sock_addr.sin6_port = htons(to_port); |
| 461 | |
| 462 | result = (int) sendto(socket, buffer, length, 0, (const sockaddr*) &sock_addr, sizeof(sock_addr)); |
| 463 | } |
| 464 | #endif // no ipv6 |
| 465 | else |
| 466 | { |
| 467 | dmLogError("Failed to send to remote host, unsupported address family!"); |
| 468 | return RESULT_AFNOSUPPORT; |
| 469 | } |
| 470 | |
| 471 | *sent_bytes = result >= 0 ? result : 0; |
| 472 | return result >= 0 ? RESULT_OK : NativeToResultCompat(DM_SOCKET_ERRNO); |
nothing calls this directly
no test coverage detected