예제 #1
0
파일: Sockets.cpp 프로젝트: mychal/worcejbi
	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;
	}
예제 #2
0
void QNetworkAccessDebugPipeBackend::closeUpstreamChannel()
{
    if (operation() == QNetworkAccessManager::PutOperation)
        socket.disconnectFromHost();
    else if (operation() == QNetworkAccessManager::PostOperation) {
        send(DataPacket());
    }
}
예제 #3
0
//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;
    }