bool FFriendsMessageManager::Tick( float Delta )
{
	PingMcpCountdown -= Delta;

	if ( bPollForMessages && ManagerState == EFriendsMessageManagerState::Idle )
	{
		// Countdown and ping if necessary
		if ( MessagesToRead.Num() > 0 )
		{
			SetState( EFriendsMessageManagerState::ReadingMessages );
		}
		else if ( MessagesToDelete.Num() > 0 )
		{
			SetState( EFriendsMessageManagerState::DeletingMessages );
		}
		else if ( GameInvitesToSend.Num() > 0 )
		{
			SetState( EFriendsMessageManagerState::SendingGameInvite );
		}
		else if ( ChatMessagesToSend.Num() > 0 )
		{
			SetState( EFriendsMessageManagerState::SendingMessages );
		}
		else if ( GameJoingRequestsToSend.Num() > 0 )
		{
			SetState( EFriendsMessageManagerState::SendingJoinGameRequest );
		}
		else if ( PingMcpCountdown < 0.f )
		{
			if ( UnhandledNetID.IsValid() )
			{
				ResendMessage();
			}
			SetState( EFriendsMessageManagerState::EnumeratingMessages );
			PingMcpCountdown = PingMcpInterval;
		}
	}
	return true;
}
Ejemplo n.º 2
0
void TimerInt(int SigNo, siginfo_t* SigInfo , void* Arg){
    if(!SigNo)   perror("SigNo");
    if(!SigInfo) perror("SigInfo");
    if(!Arg)     perror("Arg");
    PackageListNode *PackNode   = NULL;                             //  缓冲区链表节点指针
    SocketListNode  *Node       = List->StartNode;                  //  赋值为开始节点

    while(Node){                                                    //  循环直到当前节点为空
        if(Node->Socket->ErrorMessage != NULL){                     //  如果错误信息不为空
            LinkC_Debug(Node->Socket->ErrorMessage,LINKC_FAILURE);
            free(Node->Socket->ErrorMessage);                       //  释放内存
            Node->Socket->ErrorMessage = NULL;                      //  挂空指针
        }
        if(Node->Socket->SendList->TotalNode != 0){                 //  如果发送链表中还有剩余[也就是收到确认没有到达]
            pthread_mutex_lock(Node->Socket->SendList->MutexLock);  //  给链表上锁上锁
            PackNode = Node->Socket->SendList->StartNode;           //  设置为链表开始节点
            while(PackNode){
                if(PackNode->ResendTime > MAX_RESEND_TIME){         //  如果大于最大重发次数
                    LinkC_Debug("TimerInt: Disconnected",LINKC_WARNING);
                    //  执行断线操作
                }else if(PackNode->TimeToLive == 0){                //  在没有断线的情况下如果当前数据剩迟迟没有收到收到确认
                    LinkC_Debug("TimerInt: Data Resent",LINKC_DEBUG);
                    ResendMessage(Node->Socket,PackNode->Package ,MSG_DONTWAIT);    //  重发消息
                    PackNode->TimeToLive = MAX_TIME_TO_LIVE;        //  重设剩余生存时间
                    PackNode->ResendTime ++;                        //  重发次数自增加一
                }else{
                    PackNode->TimeToLive --;                        //  剩余生存时间减一
                }
                PackNode = PackNode->Next;                          //  跳转到下一个节点
            }
            pthread_mutex_unlock(Node->Socket->SendList->MutexLock);//  给链表解锁
            PackNode = NULL;                                        //  挂空指针
        }
        Node = Node->Next;
    }
    alarm(1);           //  1秒后发射信号
    return;
}
Ejemplo n.º 3
0
int __LinkC_Recv(LinkC_Socket *Socket, void *Message, size_t size, int Flag){
    if(List != NULL){                                               //  如果链表为空
        LinkC_Debug("__LinkC_Recv: LinkC Socket Environment Not Initialized",LINKC_FAILURE);
        return LINKC_FAILURE;                                       //  返回错误
    }
    int Byte;
    if(size < 8){
        LinkC_Debug("__LinkC_Recv: Receive Buffer Too Small",LINKC_FAILURE);
        return LINKC_FAILURE;
    }
    Byte = ___LinkC_Recv(Socket,Message,8,MSG_PEEK);
    if(Byte < 8){                                                               //  recvfrom返回收到数据长度小于8[出错或者无数据]
        if(Byte == 0){                                                          //  recvfrom返回收到数据长度为0[断开链接或者无数据]
            LinkC_Debug("__LinkC_Recv: No Data Received",LINKC_WARNING);
            return 0;                                                           //  返回0
        }else if(Byte < 0){                                                     //  recvfrom返回负数[出错]
            LinkC_Debug("__LinkC_Recv: Error",LINKC_FAILURE);
            perror("__LinkC_Recv");                                             //  打印错误细信息
            return -1;                                                          //  返回错误
        }else{                                                                  //  recvfrom返回收到数据长度介于0到8之间[残缺数据包,舍弃]
            LinkC_Debug("__LinkC_Recv: No Correct Data Received",LINKC_WARNING);
            return -1;                                                          //  返回错误
        }
    }else{                                                                      //  recvfrom返回收到数据长度为8[可能为一个消息头]
        uint16_t Length = ((PackageHeader*)Message)->MessageLength + 8;
        if(((PackageHeader*)Message)->ProtocolVersion != PROTOCOL_VERSION){     //  如果协议版本号不一致
            printf("Version = %d\nMy Version = %d\n",((PackageHeader*)Message)->ProtocolVersion,PROTOCOL_VERSION);
            LinkC_Debug("Protocol Version Mismatch",LINKC_WARNING);
            return -1;                                                          //  返回错误
        }
        if(((PackageHeader*)Message)->MessageType == HEART_BEATS){              //  若是心跳包
            return 0;                                                           //  直接返回[忽略]
        }else if(((PackageHeader*)Message)->MessageType == RESEND_MESSAGE){     //  若是重发的数据包
            if(___LinkC_Recv(Socket,(char *)Message,Length,Flag) < 0){          // 如果接收剩余数据失败
                LinkC_Debug("__LinkC_Recv",LINKC_FAILURE);
                AskForResend(Socket,((PackageHeader*)Message)->MessageCounts);  //  请求重发
                return -1;                                                      //  返回无数据
            }
            ConfirmRecved(Socket,((PackageHeader*)Message)->MessageCounts);     //  发送确认收到消息
            InsertPackageListNode(Socket->SendList,Message,((PackageHeader*)Message)->MessageCounts);       //  插入已经收到的消息
            
        }else if(((PackageHeader*)Message)->MessageType == SSL_KEY_MESSAGE){    //  如果是SSL密钥
            if(___LinkC_Recv(Socket,(char *)Message,Length,Flag) < 0){          // 如果接收剩余数据失败
                LinkC_Debug("__LinkC_Recv: Error",LINKC_FAILURE);
                AskForResend(Socket,((PackageHeader*)Message)->MessageCounts);  //  请求重发
                return 0;                                                       //  返回无数据
            }
            ConfirmRecved(Socket,((PackageHeader*)Message)->MessageCounts);     //  发送确认收到消息
            //      保存密钥
        }else if(((PackageHeader*)Message)->MessageType == CONFIRMATION_MESSAGE){
            if(___LinkC_Recv(Socket,Message,Length,Flag) < 0){                    // 如果接收剩余数据失败
                LinkC_Debug("__LinkC_Recv: Error",LINKC_FAILURE);
                AskForResend(Socket,((PackageHeader*)Message)->MessageCounts);  //  请求重发
                return 0;                                                       //  返回无数据
            }
            if(((ConfirmationMessage*)(((char *)Message)+8))->isRecved == 0){       //  如果说对面没有收到指定数据包
                PackageListNode *Node = Socket->SendList->StartNode;
                while(Node){
                    if(Node->Count == ((ConfirmationMessage*)((char*)Message)+8)->Count){
                        int result = ResendMessage(Socket,Node->Package,MSG_DONTWAIT);
                        if(result != 0){
                            Node = NULL;
                            return -1;
                        }else{
                            Node->TimeToLive = MAX_TIME_TO_LIVE;
                            Node->ResendTime++;
                            Node = NULL;
                            return 0;
                        }
                    }
                    Node = Node->Next;
                }
                LinkC_Debug("__LinkC_Recv: Resent Data",LINKC_FAILURE);
                Node = NULL;
                return -1;
            }else{                                                              //  如果对面收到了这个数据包
                pthread_mutex_lock(Socket->RecvList->MutexLock);
                RemovePackageListNode(Socket->SendList,((ConfirmationMessage*)(((char *)Message)+8))->Count);
                pthread_mutex_unlock(Socket->RecvList->MutexLock);
                return 0;
            }
        }else if(((PackageHeader*)Message)->MessageType == NORMAL_MESSAGE){     //  如果是普通数据
            if(___LinkC_Recv(Socket,(char *)Message,Length,Flag) <= 0){         // 如果接收剩余数据失败
                LinkC_Debug("__LinkC_Recv",LINKC_FAILURE);
                AskForResend(Socket,((PackageHeader*)Message)->MessageCounts);  //  请求重发
               return 0;                                                        //  返回无数据
            }
            ConfirmRecved(Socket,((PackageHeader*)Message)->MessageCounts);     //  发送确认收到消息
            InsertPackageListNode(Socket->RecvList,Message,((PackageHeader*)Message)->MessageCounts);       //  插入已经收到的消息
        }else if(((PackageHeader*)Message)->MessageType == CONNECTION_MESSAGE){
            if(___LinkC_Recv(Socket,(char *)Message,Length,Flag) <= 0){         // 如果接收剩余数据失败
                LinkC_Debug("__LinkC_Recv",LINKC_FAILURE);
                AskForResend(Socket,((PackageHeader*)Message)->MessageCounts);  //  请求重发
               return 0;                                                        //  返回无数据
            }
            ConfirmRecved(Socket,((PackageHeader*)Message)->MessageCounts);     //  发送确认收到消息
            InsertPackageListNode(Socket->RecvList,Message,((PackageHeader*)Message)->MessageCounts);       //  插入已经收到的消息
        }else{
            LinkC_Debug("__LinkC_Recv: Cannot Identify Message Head",LINKC_WARNING);
            return 0;
        }
    }
    return Byte;
}