110{
111#ifdef WIN32
112 WSADATA wsaData;
113 WORD wVersionRequested = MAKEWORD(2, 0);
114 if (WSAStartup( wVersionRequested, &wsaData ))
116#else
117 port_to_use = 0;
118#endif
119 if (port_to_use)
120 {
121
122 m_p->m_socket = socket(AF_INET, SOCK_STREAM, 0);
123 if (
m_p->m_socket < 0)
125#ifndef WIN32
126 unsigned long one = 1;
127 if (setsockopt(
m_p->m_socket, SOL_SOCKET, SO_REUSEADDR, (
char*)
128 &one, sizeof(one)) < 0)
130#endif
131
132 struct sockaddr_in add;
133 add.sin_family = AF_INET;
134 add.sin_port = htons(port_to_use);
135 add.sin_addr.s_addr = INADDR_ANY;
136 struct sockaddr *addr = ( struct sockaddr *) &add;
137
138 if (bind(
m_p->m_socket, addr,
sizeof(
struct sockaddr_in)))
140
141 if (listen(
m_p->m_socket, 3) < 0)
143
144
145 unsigned int tmpadd;
146 tmpadd = (unsigned) inet_addr("127.0.0.1");
147 if (tmpadd)
148 memcpy(&add.sin_addr.s_addr, &tmpadd, sizeof(struct in_addr));
149 else
151
152 m_p->m_fd[1] = socket(AF_INET, SOCK_STREAM, 0);
153 if (
m_p->m_fd[1] < 0)
155
156 m_p->nonblock(
m_p->m_fd[1]);
157
158 if (connect(
m_p->m_fd[1], addr,
sizeof(*addr)) < 0)
159 {
160#ifdef WIN32
161 if (WSAGetLastError() != WSAEWOULDBLOCK)
163#else
164 if (errno != EINPROGRESS)
166#endif
167 }
168
169
170 struct sockaddr caddr;
171#ifdef WIN32
172 int caddr_len = sizeof(caddr);
173#else
174 socklen_t caddr_len = sizeof(caddr);
175#endif
176 m_p->m_fd[0] = accept(
m_p->m_socket, &caddr, &caddr_len);
177 if (
m_p->m_fd[0] < 0)
179
180
181 fd_set write_set;
182 FD_ZERO(&write_set);
183 FD_SET(
m_p->m_fd[1], &write_set);
184 int r = select(
m_p->m_fd[1]+1, 0, &write_set, 0, 0);
185 if (r != 1)
187
188 m_p->close(
m_p->m_socket);
189 }
190 else
191 {
192#ifndef WIN32
195 else
196 {
197 assert(
m_p->m_fd[0] >= 0);
198 assert(
m_p->m_fd[1] >= 0);
199 }
200#endif
201 }
202}