int CUdpServer::SendItem(TUdpSocketObj* pSocketObj) { int result = NO_ERROR; while(pSocketObj->sndBuff.Size() > 0) { ::InterlockedIncrement(&pSocketObj->sndCount); TItemPtr itPtr(m_itPool, pSocketObj->sndBuff.PopFront()); int iBufferSize = itPtr->Size(); ASSERT(iBufferSize > 0 && iBufferSize <= (int)m_dwMaxDatagramSize); pSocketObj->pending -= iBufferSize; TUdpBufferObj* pBufferObj = GetFreeBufferObj(iBufferSize); memcpy(&pBufferObj->remoteAddr, &pSocketObj->remoteAddr, sizeof(SOCKADDR_IN)); memcpy(pBufferObj->buff.buf, itPtr->Ptr(), iBufferSize); int result = ::PostSendToNotCheck(m_soListen, pBufferObj); if(result != NO_ERROR) { if(result != WSA_IO_PENDING) AddFreeBufferObj(pBufferObj);; break; } } return result; }
int CTcpAgent::SendItem(TSocketObj* pSocketObj) { int result = NO_ERROR; while(pSocketObj->sndBuff.Size() > 0) { ::InterlockedIncrement(&pSocketObj->sndCount); TItemPtr itPtr(m_itPool, pSocketObj->sndBuff.PopFront()); int iBufferSize = itPtr->Size(); ASSERT(iBufferSize > 0 && iBufferSize <= (int)m_dwSocketBufferSize); pSocketObj->pending -= iBufferSize; TBufferObj* pBufferObj = GetFreeBufferObj(iBufferSize); memcpy(pBufferObj->buff.buf, itPtr->Ptr(), iBufferSize); result = ::PostSendNotCheck(pSocketObj, pBufferObj); if(result != NO_ERROR) { if(result != WSA_IO_PENDING) AddFreeBufferObj(pBufferObj); break; } } return result; }
BOOL CUdpClient::SendData() { while(TRUE) { TItemPtr itPtr(m_itPool, GetSendBuffer()); if(itPtr.IsValid()) { ASSERT(!itPtr->IsEmpty()); int rc = 0; { CCriSecLock locallock(m_csSend); rc = send(m_soClient, (char*)itPtr->Ptr(), itPtr->Size(), 0); if(rc > 0) m_iPending -= rc; } if(rc > 0) { ASSERT(rc == itPtr->Size()); if(FireSend(this, itPtr->Ptr(), rc) == HR_ERROR) { TRACE("<C-CNNID: %Iu> OnSend() event should not return 'HR_ERROR' !!\n", m_dwConnID); ASSERT(FALSE); } } else if(rc == SOCKET_ERROR) { int iCode = ::WSAGetLastError(); if(iCode == WSAEWOULDBLOCK) { CCriSecLock locallock(m_csSend); m_lsSend.PushFront(itPtr.Detach()); break; } else { SetLastError(SE_NETWORK, __FUNCTION__, iCode); FireError(this, SO_SEND, iCode); return FALSE; } } else ASSERT(FALSE); } else break; } return TRUE; }
BOOL CUdpCast::SendData() { while(TRUE) { TItemPtr itPtr(m_itPool, GetSendBuffer()); if(itPtr.IsValid()) { ASSERT(!itPtr->IsEmpty()); int rc = 0; { CCriSecLock locallock(m_csSend); rc = sendto(m_soClient, (char*)itPtr->Ptr(), itPtr->Size(), 0, (sockaddr*)&m_castAddr, sizeof(SOCKADDR_IN)); if(rc > 0) m_iPending -= rc; } if(rc > 0) { ASSERT(rc == itPtr->Size()); if(FireSend(itPtr->Ptr(), rc) == HR_ERROR) { TRACE("<C-CNNID: %Iu> OnSend() event should not return 'HR_ERROR' !!\n", m_dwConnID); ASSERT(FALSE); } } else if(rc == SOCKET_ERROR) { int iCode = ::WSAGetLastError(); if(iCode == WSAEWOULDBLOCK) { CCriSecLock locallock(m_csSend); m_lsSend.PushFront(itPtr.Detach()); break; } else { m_ccContext.Reset(TRUE, SO_SEND, iCode); return FALSE; } } else ASSERT(FALSE); } else break; } return TRUE; }
BOOL CUdpClient::SendPackets(const WSABUF pBuffers[], int iCount) { int result = NO_ERROR; EnSocketError enCode = SE_OK; ASSERT(pBuffers && iCount > 0); if(pBuffers && iCount > 0) { int iLength = 0; int iMaxLen = (int)m_dwMaxDatagramSize; TItemPtr itPtr(m_itPool, m_itPool.PickFreeItem()); for(int i = 0; i < iCount; i++) { int iBufLen = pBuffers[i].len; if(iBufLen > 0) { BYTE* pBuffer = (BYTE*)pBuffers[i].buf; ASSERT(pBuffer); iLength += iBufLen; if(iLength <= iMaxLen) itPtr->Cat(pBuffer, iBufLen); else break; } } if(iLength > 0 && iLength <= iMaxLen) result = SendInternal(itPtr->Ptr(), iLength, enCode); else { result = ERROR_INCORRECT_SIZE; enCode = SE_INVALID_PARAM; } } else { result = ERROR_INVALID_PARAMETER; enCode = SE_INVALID_PARAM; } if(result != NO_ERROR) SetLastError(enCode, __FUNCTION__, result); return (result == NO_ERROR); }
BOOL CUdpServer::DoSend(TUdpSocketObj* pSocketObj) { BOOL isOK = TRUE; int result = NO_ERROR; if(TUdpSocketObj::IsPending(pSocketObj)) { CCriSecLock locallock(pSocketObj->crisec); TItemList& sndBuff = pSocketObj->sndBuff; while(sndBuff.Size() > 0) { TItemPtr itPtr(m_itPool, sndBuff.PopFront()); int iBufferSize = itPtr->Size(); ASSERT(iBufferSize > 0 && iBufferSize <= (int)m_dwMaxDatagramSize); TUdpBufferObj* pBufferObj = GetFreeBufferObj(iBufferSize); memcpy(&pBufferObj->remoteAddr, &pSocketObj->remoteAddr, sizeof(SOCKADDR_IN)); memcpy(pBufferObj->buff.buf, itPtr->Ptr(), iBufferSize); ::InterlockedIncrement(&pSocketObj->sndCount); pSocketObj->pending -= iBufferSize; result = ::PostSendToNotCheck(m_soListen, pBufferObj); if(result != NO_ERROR) { if(result != WSA_IO_PENDING) { AddFreeBufferObj(pBufferObj); isOK = FALSE; } break; } } } return isOK; }