示例#1
0
void Connection::send(const void *data, size_t datalen)
{
    if (mFd < 0)
    {
        ErrorPrint("[send] send error! socket uninited or shuted!");
        return;
    }
    if (mConnStatus != ConnStatus_Connected)
    {
        ErrorPrint("[send] can't send data in such status(%d)", mConnStatus);
        return;
    }

    const char *ptr = (const char *)data;
    if (tryFlushRemainPacket())
    {
        int sentlen = ::send(mFd, data, datalen, 0);
        // int sentlen = -1; errno = EAGAIN;
        if ((size_t)sentlen == datalen)
            return;

        if (sentlen > 0)
        {
            ptr += sentlen;
            datalen -= sentlen;
        }
    }

    if (checkSocketErrors())
        return;

    cachePacket(ptr, datalen);
    tryRegWriteEvent(); // 注册发送缓冲区可写事件
}
示例#2
0
int Connection::handleOutputNotification(int fd)
{
    if (ConnStatus_Connecting == mConnStatus)
    {
        tryUnregWriteEvent();

        int err = 0;
        socklen_t errlen = sizeof(int);
        if (getsockopt(fd, SOL_SOCKET, SO_ERROR, &err, &errlen) < 0 || err != 0)
        {
            if (err != 0)
                errno = err;

            mConnStatus = ConnStatus_Error;
            if (mHandler)
            {
                tryUnregReadEvent();
                tryUnregWriteEvent();
                mHandler->onError(this);
            }

            return 0;
        }

        tryRegReadEvent();
        mConnStatus = ConnStatus_Connected;
        if (mHandler)
            mHandler->onConnected(this);
    }
    else if (ConnStatus_Connected == mConnStatus)
    {
        tryFlushRemainPacket();
        if (checkSocketErrors())
            return 0;
    }

    return 0;
}
示例#3
0
//-------------------------------------------------------------------------------------
Reason TCPPacketSender::processFilterPacket(Channel* pChannel, Packet * pPacket)
{
	if(pChannel->isCondemn())
	{
		return REASON_CHANNEL_CONDEMN;
	}

	EndPoint* pEndpoint = pChannel->pEndPoint();
	int len = pEndpoint->send(pPacket->data() + pPacket->sentSize, pPacket->length() - pPacket->sentSize);

	if(len > 0)
	{
		pPacket->sentSize += len;
		// DEBUG_MSG(fmt::format("TCPPacketSender::processFilterPacket: sent={}, sentTotalSize={}.\n", len, pPacket->sentSize));
	}

	bool sentCompleted = pPacket->sentSize == pPacket->length();
	pChannel->onPacketSent(len, sentCompleted);

	if (sentCompleted)
		return REASON_SUCCESS;

	return checkSocketErrors(pEndpoint);
}
示例#4
0
Reason TCPPacketSender::processSendPacket(Channel* pChannel, Packet* pPacket)
{
	if(pChannel->isCondemn())
	{
		return REASON_CHANNEL_CONDEMN;
	}

	EndPoint* pEndPoint = pChannel->getEndPoint();
	int32 len = pEndPoint->send(pPacket->data() + pPacket->m_sentSize, (int32)(pPacket->length() - pPacket->m_sentSize));

	if(len > 0)
	{
		pPacket->m_sentSize += len;
	}

	bool sentCompleted = pPacket->m_sentSize == pPacket->length();

	pChannel->onPacketSent(len, sentCompleted);

	if(sentCompleted)
		return REASON_SUCCESS;

	return checkSocketErrors(pEndPoint);
}