예제 #1
0
/**
* \brief 向套接口发送原始数据,没有打包的数据,一般发送数据的时候需要加入额外的包头
* \param pBuffer 待发送的原始数据
* \param nSize 待发送的原始数据大小
* \return 实际发送的字节数
*       返回-1,表示发送错误
*       返回0,表示发送超时
*       返回整数,表示实际发送的字节数
*/
int CSocket::sendRawData(const void *pBuffer,const int nSize)
{
	if (isset_flag(INCOMPLETE_WRITE))
	{
		clear_flag(INCOMPLETE_WRITE);
		goto do_select;
	}
	if( nSize > 10000 )
	{
		int iii = 0;
	}
	int retcode = Send(sock,(const char*)pBuffer,nSize,MSG_NOSIGNAL);
	if (retcode == -1 && (errno == EAGAIN || errno == EWOULDBLOCK))
	{
do_select:
		retcode = waitForWrite();
		if (1 == retcode)
		{
			mutex.lock();
			retcode = Send(sock,(const char*)pBuffer,nSize,MSG_NOSIGNAL);
			mutex.unlock();
		}
		else
			return retcode; 
	}

	if (retcode > 0 && retcode < nSize)
		set_flag(INCOMPLETE_WRITE);

	return retcode;
}
예제 #2
0
/**
 * \brief 向套接口发送原始数据,没有打包的数据,一般发送数据的时候需要加入额外的包头
 * \param pBuffer 待发送的原始数据
 * \param nSize 待发送的原始数据大小
 * \return 实际发送的字节数
 * 			返回-1,表示发送错误
 * 			返回0,表示发送超时
 * 			返回整数,表示实际发送的字节数
 */
int zSocket::sendRawData(const void *pBuffer, const int nSize)
{
	int retcode = 0;
	//Zebra::logger->trace("zSocket::sendRawData");
	if (isset_flag(INCOMPLETE_WRITE))
	{
		clear_flag(INCOMPLETE_WRITE);
		goto do_select;
	}

	retcode = TEMP_FAILURE_RETRY(::send(sock, pBuffer, nSize, MSG_NOSIGNAL));
	if (retcode == -1 && (errno == EAGAIN || errno == EWOULDBLOCK))
	{
do_select:
		retcode = waitForWrite();
		if (1 == retcode)
			retcode = TEMP_FAILURE_RETRY(::send(sock, pBuffer, nSize, MSG_NOSIGNAL));
		else
			return retcode;
	}

	if (retcode > 0 && retcode < nSize)
			set_flag(INCOMPLETE_WRITE);

	return retcode;
}
예제 #3
0
int GuestFile::writeDataAt(uint64_t uOffset, uint32_t uTimeoutMS,
                           void *pvData, uint32_t cbData, uint32_t *pcbWritten)
{
    AssertPtrReturn(pvData, VERR_INVALID_POINTER);
    AssertReturn(cbData, VERR_INVALID_PARAMETER);

    LogFlowThisFunc(("uOffset=%RU64, uTimeoutMS=%RU32, pvData=%p, cbData=%zu\n",
                     uOffset, uTimeoutMS, pvData, cbData));

    AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS);

    int vrc;

    GuestWaitEvent *pEvent = NULL;
    GuestEventTypes eventTypes;
    try
    {
        eventTypes.push_back(VBoxEventType_OnGuestFileStateChanged);
        eventTypes.push_back(VBoxEventType_OnGuestFileWrite);

        vrc = registerWaitEvent(eventTypes, &pEvent);
    }
    catch (std::bad_alloc)
    {
        vrc = VERR_NO_MEMORY;
    }

    if (RT_FAILURE(vrc))
        return vrc;

    /* Prepare HGCM call. */
    VBOXHGCMSVCPARM paParms[8];
    int i = 0;
    paParms[i++].setUInt32(pEvent->ContextID());
    paParms[i++].setUInt32(mData.mID /* File handle */);
    paParms[i++].setUInt64(uOffset /* Offset where to starting writing */);
    paParms[i++].setUInt32(cbData /* Size (in bytes) to write */);
    paParms[i++].setPointer(pvData, cbData);

    alock.release(); /* Drop write lock before sending. */

    uint32_t cbWritten;
    vrc = sendCommand(HOST_FILE_WRITE_AT, i, paParms);
    if (RT_SUCCESS(vrc))
        vrc = waitForWrite(pEvent, uTimeoutMS, &cbWritten);

    if (RT_SUCCESS(vrc))
    {
        LogFlowThisFunc(("cbWritten=%RU32\n", cbWritten));

        if (cbWritten)
            *pcbWritten = cbWritten;
    }

    unregisterWaitEvent(pEvent);

    LogFlowFuncLeaveRC(vrc);
    return vrc;
}
예제 #4
0
void flash25spi::clearMem() {
    enableWrite();
    _enable->write(0);
    wait_us(1);
    _spi->write(0xc7);
    wait_us(1);
    _enable->write(1);
    waitForWrite();
}
예제 #5
0
void flash25spi::clearBlock(unsigned int addr) {
    addr &= ~(_blockSize-1);
 
    enableWrite();
    _enable->write(0);
    wait_us(1);
    _spi->write(0xd8);
    _spi->write(HIGH(addr));
    _spi->write(MID(addr));
    _spi->write(LOW(addr));
    wait_us(1);
    _enable->write(1);
    waitForWrite();
}
    void PreWrite0() {
	while (1) {
	    TUint bits;
	    TInt err = poll(bits);
	    if (err != KErrNone) {
		return;
	    }
	    if ((bits & KSockSelectWrite) != 0) {
		break;
	    } else {
#if 0
		fprintf(stderr, "write with status %x\n", bits);
#endif
	    }
	    waitForWrite();
	}
	//CancelAll();
    }
예제 #7
0
void flash25spi::clearSector(unsigned int addr) {
    if (_sectorSize == 0) {
        clearBlock(addr);
        return;
    }
        
    addr &= ~(_sectorSize-1);
 
    enableWrite();
    _enable->write(0);
    wait_us(1);
    _spi->write(0x20);
    _spi->write(HIGH(addr));
    _spi->write(MID(addr));
    _spi->write(LOW(addr));
    wait_us(1);
    _enable->write(1);
    waitForWrite();
}
bool QHttpSocketEngine::waitForReadOrWrite(bool *readyToRead, bool *readyToWrite,
                                           bool checkRead, bool checkWrite,
                                           int msecs, bool *timedOut)
{
    Q_UNUSED(checkRead);

    if (!checkWrite) {
        // Not interested in writing? Then we wait for read notifications.
        bool canRead = waitForRead(msecs, timedOut);
        if (readyToRead)
            *readyToRead = canRead;
        return canRead;
    }

    // Interested in writing? Then we wait for write notifications.
    bool canWrite = waitForWrite(msecs, timedOut);
    if (readyToWrite)
        *readyToWrite = canWrite;
    return canWrite;
}
예제 #9
0
bool flash25spi::writePage(unsigned int startAdr, unsigned int len, const char* data) {
    enableWrite();
 
    _enable->write(0);
    wait_us(1);
 
    _spi->write(0x02);
    _spi->write(HIGH(startAdr));
    _spi->write(MID(startAdr));
    _spi->write(LOW(startAdr));
 
    // do real write
    for (unsigned int i=0;i<len;i++) {
        _spi->write(data[i]);
    }
    wait_us(1);
    // disable to start physical write
    _enable->write(1);
    
    waitForWrite();
 
    return true;
}
예제 #10
0
SWORD Socket::sendRawData(const void *pBuffer,const DWORD size)
{
	SWORD retcode = -1;
	if(isSetFlag(s_incompleteWrite))
	{
		clearFlag(s_incompleteWrite);
		goto do_select;
	}
	retcode = TEMP_FAILURE_RETRY(::send(m_sock,pBuffer,size,MSG_NOSIGNAL));
	//套接字出错且阻塞或者再试
	if(retcode == -1 && (errno == EAGAIN || errno == EWOULDBLOCK))
	{
		do_select:
			retcode = waitForWrite();
			CheckConditonReturn(retcode==1,retcode);
			retcode = TEMP_FAILURE_RETRY(::send(m_sock,pBuffer,size,MSG_NOSIGNAL));
	}
	//没有发送完毕
	if(retcode > 0 && retcode < size)
	{
		setFlag(s_incompleteWrite);
	}
	return retcode;
}
//! [0]
socketLayer = QNativeSocketEngine()
socketLayer.initialize(QAbstractSocket.TcpSocket, QAbstractSocket.IPv4Protocol)
socketLayer.connectToHost(QHostAddress.LocalHost, 22)
# returns False

socketLayer.waitForWrite()
socketLayer.connectToHost(QHostAddress.LocalHost, 22)
# returns True
//! [0]


//! [1]
socketLayer = QNativeSocketEngine()
socketLayer.bind(QHostAddress.Any, 4000)
socketLayer.listen()
if socketLayer.waitForRead():
    clientSocket = socketLayer.accept()
    # a client is connected

//! [1]