117 int lastError = WSAStartup(MAKEWORD(2, 2), &wsaData);
119 THROWERRNO(
"WSAStartup() returned error:" << lastError);
122 struct hostent* master = gethostbyname(
span_server.c_str());
124 if (master ==
nullptr)
129 uint32_t master_ip = *((uint32_t*)master->h_addr);
132 if (send(master_sock, (
const char*)&
unique_id,
sizeof(unique_id), 0) < (
int)
sizeof(unique_id))
134 THROW(
"write unique_id=" << unique_id <<
" to span server failed");
139 cerr <<
"wrote unique_id=" << unique_id << endl;
141 if (send(master_sock, (
const char*)&
total,
sizeof(total), 0) < (
int)
sizeof(total))
143 THROW(
"write total=" << total <<
" to span server failed");
148 cerr <<
"wrote total=" << total << endl;
150 if (send(master_sock, (
char*)&
node,
sizeof(node), 0) < (
int)
sizeof(node))
152 THROW(
"write node=" << node <<
" to span server failed");
157 cerr <<
"wrote node=" << node << endl;
160 if (recv(master_sock, (
char*)&ok,
sizeof(ok), 0) < (
int)
sizeof(ok))
162 THROW(
"read ok from span server failed");
167 cerr <<
"read ok=" << ok << endl;
170 THROW(
"mapper already connected");
173 uint16_t parent_port;
176 if (recv(master_sock, (
char*)&kid_count,
sizeof(kid_count), 0) < (
int)
sizeof(kid_count))
178 THROW(
"read kid_count from span server failed");
183 cerr <<
"read kid_count=" << kid_count << endl;
187 short unsigned int netport = htons(26544);
192 address.sin_family = AF_INET;
193 address.sin_addr.s_addr = htonl(INADDR_ANY);
194 address.sin_port = netport;
196 bool listening =
false;
199 if (::bind(sock, (sockaddr*)&address,
sizeof(address)) < 0)
202 if (WSAGetLastError() == WSAEADDRINUSE)
204 if (errno == EADDRINUSE)
207 netport = htons(ntohs(netport) + 1);
208 address.sin_port = netport;
215 if (listen(sock, kid_count) < 0)
218 cerr <<
"listen: " << strerror(errno) << endl;
230 if (send(master_sock, (
const char*)&netport,
sizeof(netport), 0) < (
int)
sizeof(netport))
231 THROW(
"write netport failed!");
233 if (recv(master_sock, (
char*)&parent_ip,
sizeof(parent_ip), 0) < (
int)
sizeof(parent_ip))
235 THROW(
"read parent_ip failed!");
239 char dotted_quad[INET_ADDRSTRLEN];
240 if (
nullptr == inet_ntop(AF_INET, (
char*)&parent_ip, dotted_quad, INET_ADDRSTRLEN))
243 cerr <<
"read parent_ip=" << parent_ip <<
"(inet_ntop: " << strerror(errno) <<
")" << endl;
248 cerr <<
"read parent_ip=" << dotted_quad << endl;
251 if (recv(master_sock, (
char*)&parent_port,
sizeof(parent_port), 0) < (
int)
sizeof(parent_port))
253 THROW(
"read parent_port failed!");
258 cerr <<
"read parent_port=" << parent_port << endl;
263 if (parent_ip != (uint32_t)-1)
272 for (
int i = 0; i < kid_count; i++)
274 sockaddr_in child_address;
275 socklen_t size =
sizeof(child_address);
276 socket_t f = accept(sock, (sockaddr*)&child_address, &size);
std::string current_master
socket_t sock_connect(const uint32_t ip, const int port)