/*! Receive a NetworkMessage. Workes like recv, but buffer and size is taken from the NetworkMessage \see Socket::recv */ int DgramSocket::recvFrom(NetworkMessage &msg,SocketAddress &from) { NetworkMessage::Header hdr; peek(&hdr,sizeof(hdr)); msg.setSize(osgntohl(hdr.size)); return recvFrom(msg.getBuffer(),msg.getSize(),from); }
void Connection::sendMessage(NetworkMessage& msg) { if(m_state != STATE_CONNECTED){ DEBUGPRINT(DEBUGPRINT_ERROR, DEBUGPRINT_LEVEL_OBLIGATORY, "Calling send when state != STATE_CONNECTED(state = %d)\n", m_state); return; } if(msg.getSize() == 0){ DEBUGPRINT(DEBUGPRINT_WARNING, DEBUGPRINT_LEVEL_OBLIGATORY, "Sending size = 0 in message\n"); return; } //add message size msg.addHeader(); //and encrypt if needed if(m_cryptoEnable && m_crypto){ m_crypto->encrypt(msg); } //and add checksum if needed if(m_checksumEnable){ msg.addChecksum(); } //wait until all bytes are sent int sendBytes = 0; do{ socketret_t b = send(m_socket, msg.getBuffer() + sendBytes, min(msg.getSize() - sendBytes, 1000), 0); if(b <= 0){ closeConnectionError(ERROR_SEND_FAIL); return; } sendBytes += b; } while(sendBytes < msg.getSize()); m_sentBytes += sendBytes; }
/*! Send a NetworkMessage to an address. Workes like send, but buffer and size is taken from the NetworkMessage. \see Socket::send */ int DgramSocket::sendTo(NetworkMessage &msg,const SocketAddress &to) { NetworkMessage::Header &hdr=msg.getHeader(); hdr.size=osghtonl(msg.getSize()); return sendTo(msg.getBuffer(),msg.getSize(),to); }