tcp_socket::connect
This commit is contained in:
parent
c174a93ffb
commit
1de7c609fa
4 changed files with 29 additions and 13 deletions
|
|
@ -1,5 +1,4 @@
|
||||||
#ifndef _FC_IP_HPP_
|
#pragma once
|
||||||
#define _FC_IP_HPP_
|
|
||||||
#include <fc/string.hpp>
|
#include <fc/string.hpp>
|
||||||
|
|
||||||
namespace fc {
|
namespace fc {
|
||||||
|
|
@ -10,9 +9,13 @@ namespace fc {
|
||||||
address( uint32_t _ip = 0 );
|
address( uint32_t _ip = 0 );
|
||||||
address( const fc::string& s );
|
address( const fc::string& s );
|
||||||
|
|
||||||
|
|
||||||
address& operator=( const fc::string& s );
|
address& operator=( const fc::string& s );
|
||||||
operator fc::string()const;
|
operator fc::string()const;
|
||||||
|
|
||||||
|
uint32_t ip()const { return _ip; }
|
||||||
|
|
||||||
|
d
|
||||||
private:
|
private:
|
||||||
uint32_t _ip;
|
uint32_t _ip;
|
||||||
};
|
};
|
||||||
|
|
@ -23,8 +26,8 @@ namespace fc {
|
||||||
endpoint( const fc::string& i, uint16_t p );
|
endpoint( const fc::string& i, uint16_t p );
|
||||||
endpoint( const address& i, uint16_t p );
|
endpoint( const address& i, uint16_t p );
|
||||||
|
|
||||||
uint16_t port() { return _port; }
|
uint16_t port()const { return _port; }
|
||||||
ip::address get_address() { return _ip; }
|
fc::ip::address get_address()const { return _ip; }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
uint16_t _port;
|
uint16_t _port;
|
||||||
|
|
@ -32,4 +35,3 @@ namespace fc {
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif // _FC_ENDPOINT_HPP_
|
|
||||||
|
|
|
||||||
|
|
@ -29,6 +29,7 @@ namespace fc {
|
||||||
tcp_server(uint16_t port=0);
|
tcp_server(uint16_t port=0);
|
||||||
~tcp_server();
|
~tcp_server();
|
||||||
|
|
||||||
|
void close();
|
||||||
bool accept( tcp_socket& s );
|
bool accept( tcp_socket& s );
|
||||||
// void listen( uint16_t port );
|
// void listen( uint16_t port );
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -5,6 +5,7 @@
|
||||||
#include <fstream>
|
#include <fstream>
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
#include <fc/fwd_impl.hpp>
|
#include <fc/fwd_impl.hpp>
|
||||||
|
#include <fc/log.hpp>
|
||||||
|
|
||||||
namespace fc {
|
namespace fc {
|
||||||
namespace detail {
|
namespace detail {
|
||||||
|
|
@ -21,6 +22,7 @@ namespace fc {
|
||||||
|
|
||||||
std::streamsize read( char* s, std::streamsize n ) {
|
std::streamsize read( char* s, std::streamsize n ) {
|
||||||
int r = std::cin.readsome(s,n);
|
int r = std::cin.readsome(s,n);
|
||||||
|
slog( "%d", r );
|
||||||
if( std::cin && r <= 0 ) {
|
if( std::cin && r <= 0 ) {
|
||||||
std::cin.read( s, 1 );
|
std::cin.read( s, 1 );
|
||||||
if( std::cin.eof() ) return -1;
|
if( std::cin.eof() ) return -1;
|
||||||
|
|
@ -362,6 +364,16 @@ namespace fc {
|
||||||
}
|
}
|
||||||
|
|
||||||
bool getline( istream& in, fc::string& f ) {
|
bool getline( istream& in, fc::string& f ) {
|
||||||
|
std::stringstream ss;
|
||||||
|
char c;
|
||||||
|
while( in.readsome( &c, sizeof(c) ) > 0 ) {
|
||||||
|
slog( "%c", c );
|
||||||
|
if( c != '\n' ) ss << c;
|
||||||
|
else {
|
||||||
|
f = ss.str();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -3,6 +3,7 @@
|
||||||
#include <fc/fwd_impl.hpp>
|
#include <fc/fwd_impl.hpp>
|
||||||
#include <fc/log.hpp>
|
#include <fc/log.hpp>
|
||||||
#include <fc/asio.hpp>
|
#include <fc/asio.hpp>
|
||||||
|
#include <fc/ip.hpp>
|
||||||
|
|
||||||
namespace fc {
|
namespace fc {
|
||||||
|
|
||||||
|
|
@ -10,7 +11,7 @@ namespace fc {
|
||||||
public:
|
public:
|
||||||
impl():_sock( fc::asio::default_io_service() ){}
|
impl():_sock( fc::asio::default_io_service() ){}
|
||||||
~impl(){
|
~impl(){
|
||||||
_sock.close();
|
if( _sock.is_open() ) _sock.close();
|
||||||
}
|
}
|
||||||
|
|
||||||
boost::asio::ip::tcp::socket _sock;
|
boost::asio::ip::tcp::socket _sock;
|
||||||
|
|
@ -68,17 +69,22 @@ namespace fc {
|
||||||
}
|
}
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
void tcp_socket::connect_to( const fc::ip::endpoint& e ) {
|
||||||
|
fc::asio::tcp::connect(my->_sock, fc::asio::tcp::endpoint( boost::asio::ip::address_v4(e.get_address()), e.port() ) );
|
||||||
|
}
|
||||||
|
|
||||||
class tcp_server::impl {
|
class tcp_server::impl {
|
||||||
public:
|
public:
|
||||||
impl(uint16_t port):_accept( fc::asio::default_io_service(), boost::asio::ip::tcp::endpoint(boost::asio::ip::tcp::v4(), port) ){}
|
impl(uint16_t port):_accept( fc::asio::default_io_service(), boost::asio::ip::tcp::endpoint(boost::asio::ip::tcp::v4(), port) ){}
|
||||||
~impl(){
|
~impl(){
|
||||||
_accept.cancel();
|
_accept.close();
|
||||||
}
|
}
|
||||||
|
|
||||||
boost::asio::ip::tcp::acceptor _accept;
|
boost::asio::ip::tcp::acceptor _accept;
|
||||||
};
|
};
|
||||||
|
void tcp_server::close() {
|
||||||
|
if( my->_accept.is_open() ) my->_accept.close();
|
||||||
|
}
|
||||||
tcp_server::tcp_server(uint16_t port)
|
tcp_server::tcp_server(uint16_t port)
|
||||||
:my(port) {
|
:my(port) {
|
||||||
}
|
}
|
||||||
|
|
@ -87,16 +93,11 @@ namespace fc {
|
||||||
|
|
||||||
|
|
||||||
bool tcp_server::accept( tcp_socket& s ) {
|
bool tcp_server::accept( tcp_socket& s ) {
|
||||||
slog( "accept!" );
|
|
||||||
fc::promise<boost::system::error_code>::ptr p( new promise<boost::system::error_code>("mace::cmt::asio::tcp::accept") );
|
fc::promise<boost::system::error_code>::ptr p( new promise<boost::system::error_code>("mace::cmt::asio::tcp::accept") );
|
||||||
slog( "." );
|
|
||||||
my->_accept.async_accept( s.my->_sock, [=]( const boost::system::error_code& e ) {
|
my->_accept.async_accept( s.my->_sock, [=]( const boost::system::error_code& e ) {
|
||||||
slog( "\aaccept!" );
|
|
||||||
p->set_value(e);
|
p->set_value(e);
|
||||||
} );
|
} );
|
||||||
slog( "." );
|
|
||||||
auto ec = p->wait();
|
auto ec = p->wait();
|
||||||
slog( "." );
|
|
||||||
if( !ec ) s.my->_sock.non_blocking(true);
|
if( !ec ) s.my->_sock.non_blocking(true);
|
||||||
if( ec ) BOOST_THROW_EXCEPTION( boost::system::system_error(ec) );
|
if( ec ) BOOST_THROW_EXCEPTION( boost::system::system_error(ec) );
|
||||||
return true;
|
return true;
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue