| 397 | } |
| 398 | |
| 399 | Result Bind(Socket socket, Address address, int port) |
| 400 | { |
| 401 | int result = 0; |
| 402 | if (IsSocketIPv4(socket)) |
| 403 | { |
| 404 | assert(address.m_family == DOMAIN_IPV4); |
| 405 | |
| 406 | struct sockaddr_in sock_addr = { 0 }; |
| 407 | sock_addr.sin_family = AF_INET; |
| 408 | sock_addr.sin_addr.s_addr = *IPv4(&address); |
| 409 | sock_addr.sin_port = htons(port); |
| 410 | result = bind(socket, (struct sockaddr*)&sock_addr, sizeof(sock_addr)); |
| 411 | } |
| 412 | #if !defined(DM_IPV6_UNSUPPORTED) |
| 413 | else if (IsSocketIPv6(socket)) |
| 414 | { |
| 415 | assert(address.m_family == DOMAIN_IPV6); |
| 416 | |
| 417 | struct sockaddr_in6 sock_addr = { 0 }; |
| 418 | sock_addr.sin6_family = AF_INET6; |
| 419 | memcpy(&sock_addr.sin6_addr, IPv6(&address), sizeof(struct in6_addr)); |
| 420 | sock_addr.sin6_port = htons(port); |
| 421 | result = bind(socket, (struct sockaddr*)&sock_addr, sizeof(sock_addr)); |
| 422 | } |
| 423 | #endif // no ipv6 |
| 424 | else |
| 425 | { |
| 426 | dmLogError("Failed to bind socket, unsupported address family!"); |
| 427 | return RESULT_AFNOSUPPORT; |
| 428 | } |
| 429 | |
| 430 | return result == 0 ? RESULT_OK : NATIVETORESULT(DM_SOCKET_ERRNO); |
| 431 | } |