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; }
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; }
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; }