30 #include <netinet/in.h>
32 #include <arpa/inet.h>
33 #include <netinet/tcp.h>
39 #include <sys/socket.h>
42 #include <sys/select.h>
45 #include <boost/thread/thread.hpp>
46 #include <boost/thread/mutex.hpp>
47 #include <boost/thread/condition.hpp>
54 #include <yazpp/socket-observer.h>
59 namespace mp = metaproxy_1;
61 namespace metaproxy_1 {
74 void Pipe::Rep::close(
int &fd)
88 m_fd[0] = m_fd[1] = -1;
92 bool Pipe::Rep::nonblock(
int s)
95 unsigned long tru = 1;
96 if (ioctlsocket(s, FIONBIO, &tru) < 0)
99 if (fcntl(s, F_SETFL, O_NONBLOCK) < 0)
102 signal (SIGPIPE, SIG_IGN);
112 WORD wVersionRequested = MAKEWORD(2, 0);
113 if (WSAStartup( wVersionRequested, &wsaData ))
121 m_p->m_socket = socket(AF_INET, SOCK_STREAM, 0);
122 if (
m_p->m_socket < 0)
125 unsigned long one = 1;
126 if (setsockopt(
m_p->m_socket, SOL_SOCKET, SO_REUSEADDR, (
char*)
127 &one,
sizeof(one)) < 0)
131 struct sockaddr_in add;
132 add.sin_family = AF_INET;
133 add.sin_port = htons(port_to_use);
134 add.sin_addr.s_addr = INADDR_ANY;
135 struct sockaddr *addr = (
struct sockaddr *) &add;
137 if (bind(
m_p->m_socket, addr,
sizeof(
struct sockaddr_in)))
140 if (listen(
m_p->m_socket, 3) < 0)
145 tmpadd = (unsigned) inet_addr(
"127.0.0.1");
147 memcpy(&add.sin_addr.s_addr, &tmpadd,
sizeof(
struct in_addr));
151 m_p->m_fd[1] = socket(AF_INET, SOCK_STREAM, 0);
152 if (
m_p->m_fd[1] < 0)
155 m_p->nonblock(
m_p->m_fd[1]);
157 if (connect(
m_p->m_fd[1], addr,
sizeof(*addr)) < 0)
160 if (WSAGetLastError() != WSAEWOULDBLOCK)
163 if (errno != EINPROGRESS)
169 struct sockaddr caddr;
171 int caddr_len =
sizeof(caddr);
173 socklen_t caddr_len =
sizeof(caddr);
175 m_p->m_fd[0] = accept(
m_p->m_socket, &caddr, &caddr_len);
176 if (
m_p->m_fd[0] < 0)
182 FD_SET(
m_p->m_fd[1], &write_set);
183 int r = select(
m_p->m_fd[1]+1, 0, &write_set, 0, 0);
187 m_p->close(
m_p->m_socket);
196 assert(
m_p->m_fd[0] >= 0);
197 assert(
m_p->m_fd[1] >= 0);
207 m_p->close(
m_p->m_socket);