static void * supplier (void *) { ACE_UPIPE_Stream s_stream; ACE_UPIPE_Addr c_addr (ACE_TEXT("pattern")); ACE_Auto_Basic_Array_Ptr<char> mybuf (new char[size]); for (int i = 0; i < size; i++) mybuf[i] = 'a'; ACE_DEBUG ((LM_DEBUG, "(%t) supplier starting connect thread\n")); ACE_UPIPE_Connector con; if (con.connect (s_stream, c_addr) == -1) ACE_ERROR ((LM_ERROR, "(%t) %p\n", "ACE_UPIPE_Acceptor.connect failed")); // Test asynchronicity (the "acausal principle" ;-)). s_stream.enable (ACE_SIGIO); ACE_Message_Block *mb_p; for (int j = 0; j < iterations; j++) { ACE_NEW_RETURN (mb_p, ACE_Message_Block (size, ACE_Message_Block::MB_DATA, (ACE_Message_Block *) 0, mybuf.get ()), 0); if (s_stream.send (mb_p) == -1) ACE_ERROR_RETURN ((LM_ERROR, "(%t) %p\n", "send failed"), 0); } ACE_NEW_RETURN (mb_p, ACE_Message_Block ((size_t) 0), 0); // Insert a 0-sized message block to signal the other side to shut // down. if (s_stream.send (mb_p) == -1) ACE_ERROR_RETURN ((LM_ERROR, "(%t) %p\n", "send failed"), 0); s_stream.close (); return 0; }
void Firehose_Send(uint16_t port, size_t len, const uint8_t *src) { // auto t_begin = std::chrono::high_resolution_clock::now(); // for (int i = 1; i <= gpGlobals->maxClients; ++i) { for (int i = 1; i <= 1; ++i) { INetChannelInfo *info = engine->GetPlayerNetInfo(i); if (info == nullptr) continue; netadr_t c_addr(info->GetAddress()); if (!c_addr.IsValid()) continue; c_addr.SetPort(port); // DevMsg("Sending %u bytes to player %d: %s\n", len, i, c_addr.ToString()); int s = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); if (s < 0) { Warning("Firehose_Send: socket creation failed: %s\n", strerror(errno)); continue; } sockaddr_in addr; c_addr.ToSockadr((sockaddr *)&addr); // bool retry; // do { // retry = false; // if (sendto(s, (const char *)src, len, 0, (const sockaddr *)&addr, sizeof(addr)) < 0) { // if (errno == ENOBUFS) { // retry = true; // } else { Warning("Firehose_Send: sendto failed: %s\n", strerror(errno)); // } } // } while (retry); #if defined _WINDOWS closesocket(s); #else close(s); #endif } // auto t_end = std::chrono::high_resolution_clock::now(); // auto dt = t_end - t_begin; // DevMsg("Firehose_Send: %lld ns\n", std::chrono::duration_cast<std::chrono::nanoseconds>(dt).count()); }