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 |
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; |