bool GeneralSocket::recv(DataPacket& res) { res = DataPacket(); UINT32 dataSize; int received = 0; while(received < sizeof(dataSize)) { int tmp = ::recv(this->socket(), (char*)(&dataSize + received), sizeof(dataSize) - received, 0); if(tmp == SOCKET_ERROR) { int err = WSAGetLastError(); dbg("Failed to receive data"); return false; } received += tmp; } if(dataSize == 0) return true; received = 0; char * data = new char[dataSize]; while((UINT32)received < dataSize) { int tmp = ::recv(this->socket(), data + received, dataSize - received, 0); if(tmp == SOCKET_ERROR) { delete[] data; return false; } received += tmp; } res = DataPacket(data, dataSize, true); return true; }
void QNetworkAccessDebugPipeBackend::closeUpstreamChannel() { if (operation() == QNetworkAccessManager::PutOperation) socket.disconnectFromHost(); else if (operation() == QNetworkAccessManager::PostOperation) { send(DataPacket()); } }
//parse NdpDatagram TInt CNcmNtb16Parser::ParseNcmNtb16NdpDatagram(const TUint8* aBuf, TInt aBufLen) { TInt dataLen = aBufLen + (iQueLen==0?(0-iDataOffset):iDataLen); TInt ret = KErrNone; OstTraceExt3(TRACE_NORMAL, CNCMNTB16PARSER_PARSENCMNTB16NDPDATAGRAM, "ParseNcmNtb16NdpDatagram:iNdpState=%d, iDataLen=%d, dataLen=%d", iNdpState, iDataLen, dataLen); switch(iNdpState) { case ENcmNtb16ParseNdpStateUninitialized: { TUint datagramBound = iNdpDataOffset+ KNcmNtb16NdpDatagramLength; if (iNdpDataOffset >= iNdpBound || datagramBound > iNth.wBlockLength) { //finish this NTB. Reset(ENcmNtb16TypeResetQueue); iState = ENcmNtb16ParseStateSkipBytes; ret = Parse(aBuf, aBufLen); } else if (datagramBound <= dataLen) { iDatagramIndex = DataTUint16(iNdpDataOffset, aBuf, aBufLen); iDatagramLength = DataTUint16(iNdpDataOffset+KNcmNtb16NdpDatagramLenOffset, aBuf, aBufLen); OstTraceExt2(TRACE_NORMAL, CNCMNTB16PARSER_PARSENCMNTB16NDPDATAGRAM_DUP01, "Index=%d, Length=%d", iDatagramIndex, iDatagramLength); // NULL NDP; if (iDatagramIndex == 0 || iDatagramLength == 0) { Reset(ENcmNtb16TypeResetQueue); iState = ENcmNtb16ParseStateSkipBytes; ret = Parse(aBuf, aBufLen); } else if (iDatagramIndex + iDatagramLength <= iNth.wBlockLength) { TRAPD(err, iPacket.CreateL(iDatagramLength)); if (KErrNone == err) { iNdpState = ENcmNtb16ParseNdpStateDatagramed; ret = ParseNcmNtb16NdpDatagram(aBuf, aBufLen); } else { iPacket.Free(); iNdpDataOffset += KNcmNtb16NdpDatagramLength;//skip this ethernet frame, do nothing else. ret = ParseNcmNtb16NdpDatagram(aBuf, aBufLen); } } else { //skip this datagram because of overflow. iNdpDataOffset += KNcmNtb16NdpDatagramLength; ret = ParseNcmNtb16NdpDatagram(aBuf, aBufLen); } } else { ret = QueueBuf(aBuf, aBufLen); } } break; case ENcmNtb16ParseNdpStateDatagramed: ret = DataPacket(aBuf, aBufLen); if (KErrCompletion == ret) { iPacket.Pack(); iObserver.ProcessEtherFrame(iPacket); iNdpDataOffset += KNcmNtb16NdpDatagramLength; iNdpState = ENcmNtb16ParseNdpStateUninitialized; ret = ParseNcmNtb16NdpDatagram(aBuf, aBufLen); } break; } return ret; }