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(); // 注册发送缓冲区可写事件 }
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; }
//------------------------------------------------------------------------------------- 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); }
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); }