src/Network/Socket.cc
changeset 446 e411c0799fcc
parent 399 c7295b72731a
equal deleted inserted replaced
445:94dfb47036ef 446:e411c0799fcc
    17 static std::string dump_errno (void) {
    17 static std::string dump_errno (void) {
    18     return std::string(strerror(errno));
    18     return std::string(strerror(errno));
    19 }
    19 }
    20 
    20 
    21 NetworkSocket::NetworkSocket (int family, int socktype, int protocol, NetworkReactor *reactor) :
    21 NetworkSocket::NetworkSocket (int family, int socktype, int protocol, NetworkReactor *reactor) :
    22     sock_type(family, socktype, protocol), fd(-1), type(family, socktype, protocol), registered(0), reactor(reactor ? reactor : NetworkReactor::current)
    22     sock_type(family, socktype, protocol), fd(-1), type(family, socktype, protocol),
       
    23     bound(false),
       
    24     registered(false), reactor(reactor ? reactor : NetworkReactor::current),
       
    25     want_read(false), want_write(false)
    23 {
    26 {
    24     reset();
    27 
    25 }
    28 }
    26         
    29         
    27 NetworkSocket::NetworkSocket (int fd, socket_type type, NetworkReactor *reactor) :
    30 NetworkSocket::NetworkSocket (int fd, socket_type type, NetworkReactor *reactor) :
    28     sock_type(type), fd(fd), type(type), registered(0), reactor(reactor ? reactor : NetworkReactor::current)
    31     sock_type(type), fd(fd), type(type), 
       
    32     bound(false),
       
    33     registered(false), reactor(reactor ? reactor : NetworkReactor::current),
       
    34     want_read(false), want_write(false)
    29 {
    35 {
    30     reset();
    36 
    31 }
    37 }
    32         
    38         
    33 NetworkSocket::~NetworkSocket (void) {
    39 NetworkSocket::~NetworkSocket (void) {
    34     // close any remaining socket
    40     // close any remaining socket
    35     if (fd >= 0)
    41     if (fd >= 0)
    39     if (registered)
    45     if (registered)
    40         reactor->remove_socket(this);
    46         reactor->remove_socket(this);
    41 }
    47 }
    42         
    48         
    43 void NetworkSocket::reset (void) {
    49 void NetworkSocket::reset (void) {
       
    50     fd = -1;
    44     bound = false;
    51     bound = false;
    45     want_read = false;
       
    46     want_write = false;
       
    47 }
    52 }
    48 
    53 
    49 void NetworkSocket::lazy_socket (int family, int socktype, int protocol) {
    54 void NetworkSocket::lazy_socket (int family, int socktype, int protocol) {
    50     // if we already have a socket, good
    55     // if we already have a socket, good
    51     // XXX: should we check family/socktype/protocol against sock_type?
    56     // XXX: should we check family/socktype/protocol against sock_type?
    73 void NetworkSocket::force_close (void) {
    78 void NetworkSocket::force_close (void) {
    74     // use closesocket
    79     // use closesocket
    75     if (::closesocket(fd))
    80     if (::closesocket(fd))
    76         Engine::log(WARN, "socket.force_close") << "error closing socket: " << dump_errno();
    81         Engine::log(WARN, "socket.force_close") << "error closing socket: " << dump_errno();
    77     
    82     
    78     // reset state
    83     // forget fd
    79     fd = -1;
       
    80     reset();
    84     reset();
    81 }
    85 }
    82 
    86 
    83 void NetworkSocket::bind (const NetworkEndpoint &addr) {
    87 void NetworkSocket::bind (const NetworkEndpoint &addr) {
    84     // get our addrinfo
    88     // get our addrinfo
   132 
   136 
   133     // do getsockname()
   137     // do getsockname()
   134     if (::getsockname(fd, addr.get_sockaddr(), addr.get_socklen_ptr()))
   138     if (::getsockname(fd, addr.get_sockaddr(), addr.get_socklen_ptr()))
   135         throw NetworkSocketErrno(*this, "getsockname");
   139         throw NetworkSocketErrno(*this, "getsockname");
   136 
   140 
   137     // update
   141     // updated sockaddr
   138     addr.update();
   142     addr.update();
   139 
   143 
   140     // return addr
       
   141     return addr;
   144     return addr;
   142 }
   145 }
   143 
   146 
   144 NetworkAddress NetworkSocket::get_remote_address (void) {
   147 NetworkAddress NetworkSocket::get_remote_address (void) {
   145     NetworkAddress addr;
   148     NetworkAddress addr;
   146 
   149 
   147     // do getpeername()
   150     // do getpeername()
   148     if (::getpeername(fd, addr.get_sockaddr(), addr.get_socklen_ptr()))
   151     if (::getpeername(fd, addr.get_sockaddr(), addr.get_socklen_ptr()))
   149         throw NetworkSocketErrno(*this, "getpeername");
   152         throw NetworkSocketErrno(*this, "getpeername");
   150 
   153 
   151     // update
   154     // updated sockaddr
   152     addr.update();
   155     addr.update();
   153 
   156 
   154     // return addr
       
   155     return addr;
   157     return addr;
   156 }
   158 }
   157         
   159         
   158 void NetworkSocket::set_nonblocking (bool nonblocking) {
   160 void NetworkSocket::set_nonblocking (bool nonblocking) {
   159     // linux-specific
   161     // linux-specific
   178     
   180     
   179     // update src
   181     // update src
   180     if (src)
   182     if (src)
   181         src->update();
   183         src->update();
   182 
   184 
   183     // done
       
   184     return socket;
   185     return socket;
   185 }
   186 }
   186         
   187         
   187 void NetworkSocket::connect (const NetworkEndpoint &addr) {
   188 void NetworkSocket::connect (const NetworkEndpoint &addr) {
   188     // get our addrinfo
   189     // get our addrinfo
   294 void NetworkSocket::close (void) {
   295 void NetworkSocket::close (void) {
   295     // use closesocket
   296     // use closesocket
   296     if (::closesocket(fd))
   297     if (::closesocket(fd))
   297         throw NetworkSocketErrno(*this, "close");
   298         throw NetworkSocketErrno(*this, "close");
   298     
   299     
   299     // reset
   300     // forget fd
   300     fd = -1;
       
   301     reset();
   301     reset();
   302 }
   302 }
   303 
   303 
   304 void NetworkSocket::register_poll (void) { 
   304 void NetworkSocket::register_poll (void) { 
   305     if (registered) return; 
   305     if (registered) return;