#include #include #include "NET.h" u32 NET_GetBitNumber(u32 n) { register unsigned int tmpA; tmpA = (n & 0x55555555) + ((n>>1) & 0x55555555); tmpA = (tmpA & 0x33333333) + ((tmpA>>2) & 0x33333333); tmpA = (tmpA & 0x0f0f0f0f) + ((tmpA>>4) & 0x0f0f0f0f); tmpA = (tmpA & 0x00ff00ff) + ((tmpA>>8) & 0x00ff00ff); tmpA = (tmpA & 0x0000ffff) + ((tmpA>>16) & 0x0000ffff); return tmpA; }//*/ int NET_GetLogUpperPO2(float Value) { u32 Local; *(float *)&Local = Value; Local &= 0x7fffffff; return (((Local-1) >> 23) - 126); } int NET_GetUpperPO2(float Value) { return 1<>= 16;Index+=16;}; if ((Mask & 0xff) == 0) {Mask >>= 8;Index+=8;}; if ((Mask & 0xf) == 0) {Mask >>= 4;Index+=4;}; if ((Mask & 0x3) == 0) {Mask >>= 2;Index+=2;}; if ((Mask & 0x1) == 0) {Mask >>= 1;Index+=1;}; return Index; } void OneBuf::SetIP(u32 IP , u16 Port ) { Sender.sin_family = AF_INET; Sender.sin_port = htons( Port ); Sender.sin_addr.s_addr = htonl( IP ); } void OneBuf::SetIP(u32 IP ) { Sender.sin_family = AF_INET; Sender.sin_addr.s_addr = htonl( IP ); } void OneBuf::SetBufPort(u32 Port ) { Sender.sin_family = AF_INET; Sender.sin_port = htons( Port ); } u32 OneBuf::GetIP() { return ( ntohl( Sender.sin_addr.s_addr ) ) ; } u16 OneBuf::GetPort() { return ( ntohs( Sender.sin_port ) ) ; } u32 NET_IO::IP_TO_H(u32 IP,u16 Port) { return ((IP & 0xff) + ((IP>>8) & 0xff) + ((IP>>16) & 0xff) + ((IP>>24) & 0xff) + ((Port>>0)&0xff) + ((Port>>8)&0xff)) & 0xff; }; void NET_IO::BuildHTable() { memset(HTable,0,sizeof(HTable)); u32 Counter; Counter = 32; ValidMask = 0; while (Counter--) { if (LinkedIP[Counter].ulIP) { ValidMask |= 1<>= 16;Index+=16;}; if ((Mask & 0xff) == 0) {Mask >>= 8;Index+=8;}; if ((Mask & 0xf) == 0) {Mask >>= 4;Index+=4;}; if ((Mask & 0x3) == 0) {Mask >>= 2;Index+=2;}; if ((Mask & 0x1) == 0) {Mask >>= 1;Index+=1;}; if ((ulIP == LinkedIP[Index].ulIP)&&(Port == LinkedIP[Index].Port)) return Index; } return -1; } void NET_IO::AddToStat(OneBuf *ToSet) { u32 Index; Index = GetIndexFromIP(ToSet->GetIP(),ToSet->GetPort()); if ((Index == -1) && (NET_GetBitNumber(ValidMask) != 32)) { /* Auto link */ LinkToIP(ToSet->GetIP(),ToSet->GetPort()); Index = GetIndexFromIP(ToSet->GetIP(),ToSet->GetPort()); } if (Index != -1) { /* if (LinkedIP[Index].ulIP != ToSet->GetIP()) { *(u32 *)0 = *(u32 *)4; }*/ LinkedIP[Index].AddPacket(ToSet,this,Owner); LinkedIP[Index].LastConnectionTime = timeGetTime(); } else { /* The sender is not in the group */ /* Thrash it */ InputData.THREAD_STACK.Add(ToSet); } } u32 NET_IO::LinkToIP(u32 IP,u16 Port) { if (IsLinked(IP,Port)) return GetIndexFromIP(IP,Port); if (ValidMask == -1) return -1; u32 Index = NET_GetFirstBit(ValidMask ^ -1); LinkedIP[Index].Reset(this); LinkedIP[Index].ulIP = IP; LinkedIP[Index].Port = Port; LinkedIP[Index].GoodPackets = 1; BuildHTable(); OneBuf ToSend; *((u32 *)ToSend.BufDATA) = 'LINK'; ToSend.SetIP(LinkedIP[Index].ulIP,MyPort); memcpy(&ToSend.BufDATA[4],MyComputerName,256); ToSend.Size = 4 + 256; NET_DataSend(&ToSend); NET_DataSend(&ToSend); NET_DataSend(&ToSend); NET_DataSend(&ToSend); return 0; } void NET_IO::UnLinkToIP(u32 IP,u16 Port) { u32 Index; Index = GetIndexFromIP(IP,Port); if (Index == -1) return; /* this->mo ConnectedMask &= ~(1<