void ServerGame::receiveFromClients() { Packet packet; if (!network) return; // go through all clients std::map<unsigned int, SOCKET>::iterator iter; for(iter = network->sessions.begin(); iter != network->sessions.end(); iter++) { int data_length = network->receiveData(iter->first, network_data); if (data_length <= 0) { //no data recieved continue; } packet.clear(); packet.append(network_data, data_length); GetDataFromPacket(packet); packet.clear(); } //sendHelloPackets(); // test hello world... }
//包的解析,目前只目前只支持EtherNet链路层格式和IP高层协议 void DecodePacket(UCHAR* pPacketContent, UINT len) { //判断是否为ARP返回包,如果是则不处理 if(!Global.mac->DecodeMac(pPacketContent)) return; //这时的包已经去掉了MAC头。判断是否为自己的包,如果不是则不处理 P_TCP_DATA_IDENTIFIER pTcpDataIdentifier = GetIdentifierFromPacket(pPacketContent); P_TCP_DATA_TAIL_IDENTIFIER pTcpDataTailIdentifier = GetTailIdentifierFromPacket(pPacketContent); if( pTcpDataIdentifier == NULL || pTcpDataIdentifier->Myself[0] != MYSELF_SIG1 || pTcpDataIdentifier->Myself[1] != MYSELF_SIG2 || pTcpDataIdentifier->Myself[2] != MYSELF_SIG3 || pTcpDataIdentifier->Myself[3] != MYSELF_SIG4 || pTcpDataTailIdentifier == NULL || pTcpDataTailIdentifier->Myself[0] != MYSELF_SIG1 || pTcpDataTailIdentifier->Myself[1] != MYSELF_SIG2 || pTcpDataTailIdentifier->Myself[2] != MYSELF_SIG3 ) { return; } //得到TcbNum并根据它来寻找处理此连接的TCB块 UINT ComingRemoteTcbNum = Lnltoh(pTcpDataIdentifier->RemoteTcbNum); //得到其他信息 UINT ComingTcbNum = Lnltoh(pTcpDataIdentifier->TcbNum); int type = Lnstoh(pTcpDataIdentifier->Comm) + 1; int curstatus = Lnstoh(pTcpDataIdentifier->CurStatus); USHORT datalen = GetDataLenFromPacket(pPacketContent); PUCHAR pdata = GetDataFromPacket(pPacketContent); PUCHAR srcip = GetSrcIpFromPacket(pPacketContent); PUCHAR subip = GetSubIPFromPacket(pPacketContent); USHORT srcport = GetSrcPortFromPacket(pPacketContent); USHORT dstport = GetDstPortFromPacket(pPacketContent); UINT filesize = GetFileSizeFromPacket(pPacketContent); //根据Srcip和Subip来判断是否存在活动连结,是则进一步判断哪个TCB处理此操作, //否则退出 CONNECTION* conn = Global.ConnList->FindByIPAndSubIP(srcip, subip); /* //用于两端均为内网地址的用户使用 if(conn == NULL || conn->m_Active == FALSE && type != CONNECT_F_COMMING && type != CONNECT_T_COMMING) { return; } */ //用于至少有一端为外部IP地址的用户使用 if(conn == NULL && type != CONNECT_F_COMMING) { return; } if(conn != NULL) { if(conn->m_Active == FALSE && type != CONNECT_F_COMMING && type != CONNECT_T_COMMING) { return; } } /* //用于两端均为内网地址的用户使用 //如果没有处理的TCB则说明是一个新的命令操作初次来到,或连接已中断 // EnterCriticalSection(&Global.cs_TcbList); TCB * tcb = conn->TcbList->Find(ComingRemoteTcbNum); */ //用于至少有一端为外部IP地址的用户使用 TCB* tcb = NULL; if(conn) { tcb = conn->TcbList->Find(ComingRemoteTcbNum); } else tcb = NULL; if(tcb == NULL) { // LeaveCriticalSection(&Global.cs_TcbList); //如果是一个新的命令操作,直接将包给FTP模块,在FTP模块中新建TCB用来处理 //最终照样发到TCB成员函数DealWithInput中处理 if(ComingRemoteTcbNum == -1) { FtpControlCenter(type, PUchTOch(pdata, datalen), datalen, NULL, NULL, filesize, srcip, subip, srcport, dstport, ComingTcbNum, curstatus); } else return; } //如果能找到处理的TCB,则如果是命令的ACK操作,将远程TCB号更新 //否则判断现在的远程TCB号和刚来的是否相同,不同则丢弃此包 else { if((type == COMM_ACK_COMMING || type == CONNECT_T_COMMING) && tcb->m_bBlockAck == FALSE) tcb->m_RemoteTcbNum = ComingTcbNum; else if(tcb->m_RemoteTcbNum != ComingTcbNum) return; //调用TCB的DealWithInput if(tcb->m_bBlockData == FALSE) tcb->DealWithInput(type, pPacketContent); // LeaveCriticalSection(&Global.cs_TcbList); } }