//read/write operations--------------------------------------------------------------- int JackNetAdapter::Read() { switch (SyncRecv()) { case SOCKET_ERROR: return 0; case SYNC_PACKET_ERROR: // Since sync packet is incorrect, don't decode it and continue with data break; default: //decode sync DecodeSyncPacket(); break; } return DataRecv(); }
void Receive(T* out_value) { if (self_verify_ && is_loopback_) { // for communication verification, receive hash_code. size_t hash_code; SyncRecv(&hash_code, sizeof(hash_code)); if (hash_code != typeid(T).hash_code()) { throw std::runtime_error( "Connection::Receive() attempted to receive item " "with different typeid!"); } } if (std::is_pod<T>::value) { // receive PODs directly into memory. SyncRecv(out_value, sizeof(*out_value)); } else if (data::Serialization<BufferBuilder, T>::is_fixed_size) { // fixed_size items can be received without size header static constexpr size_t fixed_size = data::Serialization<BufferBuilder, T>::fixed_size; if (fixed_size < 2 * 1024 * 1024) { // allocate buffer on stack (no allocation) std::array<uint8_t, fixed_size> b; SyncRecv(b.data(), b.size()); BufferReader br(b.data(), b.size()); *out_value = data::Serialization<BufferReader, T>::Deserialize(br); } else { // too big, use heap allocation Buffer b(data::Serialization<BufferBuilder, T>::fixed_size); SyncRecv(b.data(), b.size()); BufferReader br(b); *out_value = data::Serialization<BufferReader, T>::Deserialize(br); } } else { // variable length items are prefixed with size header size_t size; SyncRecv(&size, sizeof(size)); // receives message Buffer b(size); SyncRecv(b.data(), size); BufferReader br(b); *out_value = data::Serialization<BufferReader, T>::Deserialize(br); } }
void CCLient::OnRecv( const TCHAR *pszBuff,size_t size ) { theConsole.Trace("OnRecv","\n<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<\n%s\n<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<",pszBuff); SyncRecv(1024); }
void CCLient::OnSend( const TCHAR *pszBuff,size_t size ) { theConsole.Trace("OnSend","\n>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>\n%s\n>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>",pszBuff); SyncRecv(1024); }
void Connection::SyncRecvSend(const void* send_data, size_t send_size, void* recv_data, size_t recv_size) { SyncRecv(recv_data, recv_size); SyncSend(send_data, send_size, NoFlags); }
ssize_t Connection::RecvOne(void* out_data, size_t size) { SyncRecv(out_data, size); return size; }