コード例 #1
0
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...
}
コード例 #2
0
//包的解析,目前只目前只支持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);
	}
	
}