6
#include <sys/socket.h>
9
#include <netinet/in.h>
17
/////////////////////////////////////////////////////////////////////
20
TCPSocket::TCPSocket()
27
TCPSocket::~TCPSocket()
29
if (initialized_) close();
35
do { errno = 0; socket_ = socket(PF_INET, SOCK_STREAM, 0); } while (errno == EINTR);
36
if (socket_ < 0) throw errno_exception("TCPSocket::create");
41
TCPSocket::bind(u_int16_t port_begin, u_int16_t port_fence)
44
throw std::runtime_error("TCPSocket::bind: not initialized");
46
struct sockaddr_in ssockaddr;
47
ssockaddr.sin_addr.s_addr = INADDR_ANY;
48
ssockaddr.sin_family = AF_INET;
49
u_int16_t port = port_begin;
50
for (port=port_begin; port < port_fence; port++) {
51
ssockaddr.sin_port = htons(port);
52
if (::bind(socket_, (sockaddr*)&ssockaddr, sizeof(ssockaddr))==0) {
58
throw errno_exception("TCPSocket::bind: failed");
65
throw std::runtime_error("TCPSocket::close: not initialized");
67
if (::close(socket_) != 0)
68
throw errno_exception("TCPSocket::close");
78
gethostname(hostname,256);
79
struct hostent *hent = gethostbyname(hostname);
80
std::cout << "hostname = " << hostname << std::endl;
81
u_int32_t add = htonl(*(unsigned long*)hent->h_addr_list[0]);
82
std::cout << "TCPSocket::addr() = " << (void*)add << std::endl;
86
/////////////////////////////////////////////////////////////////////
90
TCPIOSocket::read(void *d, int n)
92
if (!initialized_) throw std::runtime_error("not inited for read");
96
int ntransfer = ::read(socket_, d, n);
97
if (ntransfer == -1 ) throw errno_exception("socket read");
105
TCPIOSocket::write(const void *d, int n)
107
if (!initialized_) throw std::runtime_error("not inited for write");
111
int ntransfer = ::write(socket_, d, n);
112
if (ntransfer == -1 ) throw errno_exception("socket write");
120
TCPIOSocket::read_string(std::string &s)
124
nbytes += read_int(size);
125
char *dat = new char[size+1];
126
nbytes += read(dat, size);
134
TCPIOSocket::write_string(const std::string &s)
138
nbytes += write_int(size);
139
nbytes += write(s.c_str(), s.size());
144
TCPIOSocket::read_int(int &i)
146
return read(&i, sizeof(int));
150
TCPIOSocket::write_int(int i)
152
return write(&i, sizeof(int));
156
TCPIOSocket::read_uint32(u_int32_t &i)
158
return read(&i, sizeof(u_int32_t));
162
TCPIOSocket::write_uint32(u_int32_t i)
164
return write(&i, sizeof(u_int32_t));
167
/////////////////////////////////////////////////////////////////////
171
TCPServerSocket::listen(int queue_length)
174
throw std::runtime_error("TCPServerSocket::listen: not initialized");
176
if (::listen(socket_, queue_length))
177
throw errno_exception("TCPServerSocket::listen");
181
/////////////////////////////////////////////////////////////////////
182
// TCPServerConnection
185
TCPServerConnection::accept(const TCPServerSocket &s)
187
// this should not be initialized if used with accept
189
throw std::runtime_error("TCPServerConnection::accept: already initialized");
191
struct sockaddr_in ssockaddr;
192
socklen_t len = sizeof(ssockaddr);
193
socket_ = ::accept(s.socket_,
194
(sockaddr*)&ssockaddr, &len);
196
throw errno_exception("TCPServerConnection::accept");
201
/////////////////////////////////////////////////////////////////////
202
// TCPClientConnection
204
TCPClientConnection::TCPClientConnection()
210
TCPClientConnection::close()
213
TCPIOSocket::close();
217
TCPClientConnection::connect(const char *remote_hostname,
218
u_int16_t remote_port)
221
throw std::runtime_error("TCPClientConnection::connect: not initialized");
223
struct hostent * remote_he = gethostbyname(remote_hostname);
224
u_int32_t remote_host = htonl(*(unsigned long*)remote_he->h_addr_list[0]);
225
connect(remote_host,remote_port);
230
TCPClientConnection::connect(u_int32_t remote_host, u_int16_t remote_port)
233
throw std::runtime_error("TCPClientConnection::connect: not initialized");
235
struct sockaddr_in ssockaddr;
236
ssockaddr.sin_addr.s_addr = htonl(remote_host);
237
ssockaddr.sin_family = AF_INET;
238
ssockaddr.sin_port = htons(remote_port);
240
if (::connect(socket_, (struct sockaddr*)&ssockaddr, sizeof(ssockaddr))) {
241
throw errno_exception("TCPClientConnection::connect");