metaproxy  1.3.55
Classes | Public Member Functions | Private Attributes | List of all members
metaproxy_1::Pipe Class Reference

#include <pipe.hpp>

Collaboration diagram for metaproxy_1::Pipe:
Collaboration graph

Classes

class  Error
class  Rep

Public Member Functions

 Pipe (int port_to_use)
 ~Pipe ()
int & read_fd () const
int & write_fd () const

Private Attributes

boost::scoped_ptr< Repm_p

Detailed Description

Definition at line 29 of file pipe.hpp.

Constructor & Destructor Documentation

Pipe::Pipe ( int  port_to_use)

Definition at line 108 of file pipe.cpp.

References m_p.

: m_p(new Rep)
{
#ifdef WIN32
WSADATA wsaData;
WORD wVersionRequested = MAKEWORD(2, 0);
if (WSAStartup( wVersionRequested, &wsaData ))
throw Pipe::Error("WSAStartup failed");
#else
port_to_use = 0; // we'll just use pipe on Unix
#endif
if (port_to_use)
{
// create server socket
m_p->m_socket = socket(AF_INET, SOCK_STREAM, 0);
if (m_p->m_socket < 0)
throw Pipe::Error("could not create socket");
#ifndef WIN32
unsigned long one = 1;
if (setsockopt(m_p->m_socket, SOL_SOCKET, SO_REUSEADDR, (char*)
&one, sizeof(one)) < 0)
throw Pipe::Error("setsockopt error");
#endif
// bind server socket
struct sockaddr_in add;
add.sin_family = AF_INET;
add.sin_port = htons(port_to_use);
add.sin_addr.s_addr = INADDR_ANY;
struct sockaddr *addr = ( struct sockaddr *) &add;
if (bind(m_p->m_socket, addr, sizeof(struct sockaddr_in)))
throw Pipe::Error("could not bind on socket");
if (listen(m_p->m_socket, 3) < 0)
throw Pipe::Error("could not listen on socket");
// client socket
unsigned int tmpadd;
tmpadd = (unsigned) inet_addr("127.0.0.1");
if (tmpadd)
memcpy(&add.sin_addr.s_addr, &tmpadd, sizeof(struct in_addr));
else
throw Pipe::Error("inet_addr failed");
m_p->m_fd[1] = socket(AF_INET, SOCK_STREAM, 0);
if (m_p->m_fd[1] < 0)
throw Pipe::Error("could not create socket");
m_p->nonblock(m_p->m_fd[1]);
if (connect(m_p->m_fd[1], addr, sizeof(*addr)) < 0)
{
#ifdef WIN32
if (WSAGetLastError() != WSAEWOULDBLOCK)
throw Pipe::Error("could not connect to socket");
#else
if (errno != EINPROGRESS)
throw Pipe::Error("could not connect to socket");
#endif
}
// server accept
struct sockaddr caddr;
#ifdef WIN32
int caddr_len = sizeof(caddr);
#else
socklen_t caddr_len = sizeof(caddr);
#endif
m_p->m_fd[0] = accept(m_p->m_socket, &caddr, &caddr_len);
if (m_p->m_fd[0] < 0)
throw Pipe::Error("could not accept on socket");
// complete connect
fd_set write_set;
FD_ZERO(&write_set);
FD_SET(m_p->m_fd[1], &write_set);
int r = select(m_p->m_fd[1]+1, 0, &write_set, 0, 0);
if (r != 1)
throw Pipe::Error("could not complete connect");
m_p->close(m_p->m_socket);
}
else
{
#ifndef WIN32
if (pipe(m_p->m_fd))
throw Pipe::Error("pipe failed");
else
{
assert(m_p->m_fd[0] >= 0);
assert(m_p->m_fd[1] >= 0);
}
#endif
}
}
Pipe::~Pipe ( )

Definition at line 203 of file pipe.cpp.

References m_p.

{
m_p->close(m_p->m_fd[0]);
m_p->close(m_p->m_fd[1]);
m_p->close(m_p->m_socket);
#ifdef WIN32
WSACleanup();
#endif
}

Member Function Documentation

int & Pipe::read_fd ( ) const

Definition at line 213 of file pipe.cpp.

References m_p.

{
return m_p->m_fd[0];
}
int & Pipe::write_fd ( ) const

Definition at line 218 of file pipe.cpp.

References m_p.

{
return m_p->m_fd[1];
}

Member Data Documentation

boost::scoped_ptr<Rep> metaproxy_1::Pipe::m_p
private

Definition at line 42 of file pipe.hpp.

Referenced by Pipe(), read_fd(), write_fd(), and ~Pipe().


The documentation for this class was generated from the following files: