void Player::SendMsg(int seqid, a8::ReflectibleObject& msg)
{
g_gglistener->SendToClient(socket_handle_, seqid, msg.metaclass->Tag(), msg);
}
复制代码
- listener 找到对应的clientitem,并调用sendbuff
bool SendClientMsg(unsigned short sockhandle, const char *buff, int buffLen)
{
mClientsMutex.lock();
ClientSocketItem *p = GetClientSocket(sockhandle);
if (p){
p->SendBuff(buff, buffLen);
}
mClientsMutex.unlock();
}
复制代码
virtual void SendBuff(const char* buff, unsigned int bufflen)
{
if (bufflen > 0){
SendQueueNode* p = (SendQueueNode*)malloc(sizeof(SendQueueNode));
memset(p, 0, sizeof(SendQueueNode));
p->mBuff = (char*)malloc(bufflen);
memmove(p->mBuff, buff, bufflen);
p->mBuffLen = bufflen;
mSendBufferMutex.lock();
if(mWorkNode == NULL && mTopNode == NULL){
mWorkNode = p;
AsyncSend();
}else{
if (mBotNode){
mBotNode->mNext = p;
mBotNode = p;
}else{
mTopNode = p;
mBotNode = p;
}
}
mSendBufferMutex.unlock();
}
}
复制代码
void AsyncSend()
{
while(mWorkNode){
int sentbytes = ::send(mSocket,
mWorkNode->mBuff + mWorkNode->mSentBytes,
mWorkNode->mBuffLen - mWorkNode->mSentBytes,
0);
if(sentbytes <= 0){
break;
}
mWorkNode->mSentBytes += sentbytes;
if(mWorkNode->mSentBytes >= mWorkNode->mBuffLen){
......
}
}
}
复制代码
参考链接