MCPcopy Create free account
hub / github.com/dfranx/SHADERed / connect

Method connect

libs/cppdap/src/socket.cpp:266–318  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

264}
265
266std::shared_ptr<ReaderWriter> Socket::connect(const char* address,
267 const char* port,
268 uint32_t timeoutMillis) {
269 auto shared = Shared::create(address, port);
270 if (!shared) {
271 return nullptr;
272 }
273
274 std::shared_ptr<ReaderWriter> out;
275 shared->lock([&](SOCKET socket, const addrinfo* info) {
276 if (socket == InvalidSocket) {
277 return;
278 }
279
280 if (timeoutMillis == 0) {
281 if (::connect(socket, info->ai_addr, (int)info->ai_addrlen) == 0) {
282 out = shared;
283 }
284 return;
285 }
286
287 if (!setBlocking(socket, false)) {
288 return;
289 }
290
291 auto res = ::connect(socket, info->ai_addr, (int)info->ai_addrlen);
292 if (res == 0) {
293 if (setBlocking(socket, true)) {
294 out = shared;
295 }
296 } else {
297 const auto microseconds = timeoutMillis * 1000;
298
299 fd_set fdset;
300 FD_ZERO(&fdset);
301 FD_SET(socket, &fdset);
302
303 timeval tv;
304 tv.tv_sec = microseconds / 1000000;
305 tv.tv_usec = microseconds - static_cast<uint32_t>(tv.tv_sec * 1000000);
306 res = select(static_cast<int>(socket + 1), nullptr, &fdset, nullptr, &tv);
307 if (res > 0 && !errored(socket) && setBlocking(socket, true)) {
308 out = shared;
309 }
310 }
311 });
312
313 if (!out) {
314 return nullptr;
315 }
316
317 return out->isOpen() ? out : nullptr;
318}
319
320} // namespace dap

Callers 1

TEST_FFunction · 0.45

Calls 6

connectFunction · 0.85
setBlockingFunction · 0.85
erroredFunction · 0.85
lockMethod · 0.80
createFunction · 0.50
isOpenMethod · 0.45

Tested by 1

TEST_FFunction · 0.36