| 636 | } |
| 637 | |
| 638 | IConnectionPtr Net::ConnectToServer( |
| 639 | const InetAddress& address, |
| 640 | const uint16_t in_udp_port, |
| 641 | const uint16_t in_tcp_port ) |
| 642 | { |
| 643 | #ifdef _WIN32 |
| 644 | // Create and open TCP socket. |
| 645 | const SOCKET tcp_socket= ::socket( AF_INET, SOCK_STREAM, 0 ); |
| 646 | if( tcp_socket == INVALID_SOCKET ) |
| 647 | { |
| 648 | Log::Warning( FUNC_NAME, " can not create tcp socket. Error code: ", ::WSAGetLastError() ); |
| 649 | return nullptr; |
| 650 | } |
| 651 | |
| 652 | sockaddr_in tcp_address; |
| 653 | tcp_address.sin_family= AF_INET; |
| 654 | tcp_address.sin_addr.s_addr= INADDR_ANY; |
| 655 | tcp_address.sin_port= ::htons( in_tcp_port ); |
| 656 | if( ::bind( tcp_socket, (sockaddr*) &tcp_address, sizeof(tcp_address) ) != 0 ) |
| 657 | { |
| 658 | Log::Warning( FUNC_NAME, " can not bind tcp socket. Error code: ", ::WSAGetLastError() ); |
| 659 | ::closesocket( tcp_socket ); |
| 660 | return nullptr; |
| 661 | } |
| 662 | |
| 663 | // Createe and open UDP socket. |
| 664 | const SOCKET udp_socket= ::socket( AF_INET, SOCK_DGRAM, 0 ); |
| 665 | if( udp_socket == INVALID_SOCKET ) |
| 666 | { |
| 667 | Log::Warning( FUNC_NAME, " can not create udp socket. Error code: ", ::WSAGetLastError() ); |
| 668 | ::closesocket( tcp_socket ); |
| 669 | return nullptr; |
| 670 | } |
| 671 | |
| 672 | sockaddr_in udp_address; |
| 673 | udp_address.sin_family= AF_INET; |
| 674 | udp_address.sin_addr.s_addr= INADDR_ANY; |
| 675 | udp_address.sin_port= ::htons( in_udp_port ); |
| 676 | if( ::bind( udp_socket, (sockaddr*) &udp_address, sizeof(udp_address) ) != 0 ) |
| 677 | { |
| 678 | Log::Warning( FUNC_NAME, " can not bind udp socket. Error code: ", ::WSAGetLastError() ); |
| 679 | ::closesocket( tcp_socket ); |
| 680 | ::closesocket( udp_socket ); |
| 681 | return nullptr; |
| 682 | } |
| 683 | |
| 684 | // Connect to server. |
| 685 | sockaddr_in server_tcp_address; |
| 686 | std::memset( &server_tcp_address, 0, sizeof(server_tcp_address) ); |
| 687 | server_tcp_address.sin_family= AF_INET; |
| 688 | server_tcp_address.sin_addr.s_addr= ::htonl( address.ip_address ); |
| 689 | server_tcp_address.sin_port= ::htons( address.port ); |
| 690 | |
| 691 | const int connection_result= ::connect( tcp_socket, (sockaddr*) &server_tcp_address, sizeof(server_tcp_address) ); |
| 692 | if( connection_result == SOCKET_ERROR ) |
| 693 | { |
| 694 | Log::Warning( FUNC_NAME, " can not connect to server. Error code: ", ::WSAGetLastError() ); |
| 695 | ::closesocket( tcp_socket ); |
nothing calls this directly
no outgoing calls
no test coverage detected