int TaoClientTask::sendRequest(TaoMessage& rMsg, OsMutex* pMutex, const OsTime& rTimeout) { if (mpTaoServerTask) { rMsg.setMsgQueueHandle((TaoObjHandle) this); mpTaoServerTask->postMessage(rMsg); return 1; } else { osPrintf("\n++++++ TaoClientTask::sendRequest mpTaoServerTask = 0x%p +++++\n", mpTaoServerTask); osPrintf("\n++++++ %d %d +++++\n", rMsg.getMsgSubType(), rMsg.getCmd()); } osPrintf("\n++++++ TaoClientTask::sendRequest %p %s : %d+++++\n", mpConnectionSocket, mRemoteHost.data(), mRemotePort); if (!mpConnectionSocket) { mMutex.acquireWrite(); mpConnectionSocket = new OsConnectionSocket(mRemotePort, mRemoteHost); if (mpAgent) { delete mpAgent; } mpAgent = new TaoTransportAgent(mpConnectionSocket, this); mpAgent->start(); mMutex.releaseWrite(); } int recvd = 0; if (mpConnectionSocket && mpConnectionSocket->isOk()) { unsigned int sent; mMutex.acquireWrite(); UtlString buffer; ssize_t bufferLen; rMsg.getBytes(&buffer, &bufferLen); size_t iSendSize = bufferLen + (sizeof(uint32_t)*2) ; char* pBuf = new char[iSendSize] ; uint32_t cookie = 0x1234ABCD ; uint32_t length = bufferLen ; memcpy(&pBuf[0], &cookie, sizeof(uint32_t)) ; memcpy(&pBuf[sizeof(uint32_t)], &length, sizeof(uint32_t)) ; memcpy(&pBuf[sizeof(uint32_t)*2], buffer.data(), bufferLen) ; sent = mpConnectionSocket->write(pBuf, iSendSize) ; delete pBuf ; if (sent > sizeof(uint32_t)*2) sent -= sizeof(uint32_t)*2 ; mMutex.releaseWrite(); } return recvd; }
int TaoTransportAgent::send(TaoMessage& rMsg) { UtlString buffer; ssize_t bufferLen; rMsg.getBytes(&buffer, &bufferLen); // send the msg to the transport, receive the response size_t sent = 0; if (mpSocket->isOk() && (bufferLen > 0)) { mWriteSem.acquire() ; size_t iSendSize = bufferLen + (sizeof(uint32_t)*2) ; char* pBuf = new char[iSendSize] ; uint32_t cookie = 0x1234ABCD ; uint32_t length = bufferLen ; memcpy(&pBuf[0], &cookie, sizeof(uint32_t)) ; memcpy(&pBuf[sizeof(uint32_t)], &length, sizeof(uint32_t)) ; memcpy(&pBuf[sizeof(uint32_t)*2], buffer.data(), bufferLen) ; sent = mpSocket->write(pBuf, iSendSize) ; delete pBuf ; if (sent > (sizeof(uint32_t)*2)) sent -= sizeof(uint32_t)*2 ; mWriteSem.release() ; if (sent != length) { osPrintf("<<**>> TaoTransportAgent WRITE MISMATCH %zu != %u\n", sent, length) ; sent = 0 ; } } return sent; }