#include "server.hpp" int server::c_server::init( ) { #if WIN64 if( WSAStartup( MAKEWORD( 2, 2 ), &m_sock_data ) ) // windows return 1; #endif m_socket = socket( AF_INET, SOCK_STREAM, 0 ); if( m_socket == INVALID_SOCKET ) return 2; sockaddr_in server_address{ }; server_address.sin_addr.s_addr = INADDR_ANY; server_address.sin_port = htons( PORT_NUM ); server_address.sin_family = AF_INET; auto result = ::bind( m_socket, ( sockaddr* )( &server_address ), sizeof( server_address ) ); return result != -1 ? 0 : 3; } void server::c_server::listen( ) { ::listen( m_socket, 5 ); sockaddr_in client_address{ }; // not needed, this is set in accept, values are input. // client_address.sin_port = htons( PORT_NUM ); int len = sizeof( client_address ); SOCKET result = accept( m_socket, ( sockaddr* )( &client_address ), &len ); if( result == INVALID_SOCKET ) { printf( "socket error accepting a connection\n" ); return; } printf( "incoming connection from: %s\n", inet_ntoa( client_address.sin_addr ) ); // connection established. auto client = std::make_shared< c_client >( result, client_address.sin_addr ); // handshake. client->send_msg( "hello" ); // surprised it even works with shared_ptr. std::thread thread{ &c_client::handle, client }; thread.detach( ); }