
Шустрый

Профиль
Группа: Участник
Сообщений: 99
Регистрация: 7.9.2008
Где: Республика Белару сь, Борисов
Репутация: 1 Всего: 1
|
uMain.cpp: | Код | CGenPacket* packet = new CGenPacket();
if(packet->InitLib(2,2) != 0){ MessageBox(frmMain->Handle,"","",MB_ICONERROR); return; }
if(packet->CheckLibVersion(2,2) != 0){ MessageBox(frmMain->Handle,"","",MB_ICONERROR); return; }
packet->setLocalIP();
packet->createIPHdr(0, StrToInt(eId->Text), 0, atoi(eLifeTime->Text.c_str()), protocol,"192.168.139.1", eDestAddress->Text.c_str());
if(packet->createSocket() == -1){ MessageBox(frmMain->Handle,"","",MB_ICONERROR); return; }
if(packet->setRaw() == -1){ MessageBox(frmMain->Handle,"","",MB_ICONERROR); return; } packet->sendPacket();
|
CGenPacket.cpp | Код | void CGenPacket::createIPHdr(unsigned char tos, unsigned short id, unsigned short frag_off, unsigned char ttl, unsigned char protocol, char* saddr, char* daddr) { iph.ip_ihl = 5; iph.ip_version = IP_VERSION; iph.ip_tos = tos; iph.ip_tot_len = sizeof(struct IPHdr); iph.ip_id = htons(id); iph.ip_frag_off = 0; iph.ip_frag_off1 = 0; iph.ip_rf = 0; iph.ip_df = 1; iph.ip_mf = 0; iph.ip_ttl = ttl; iph.ip_protocol = protocol; iph.ip_check = 0; iph.ip_saddr = inet_addr(saddr); iph.ip_daddr = inet_addr(daddr); }
int CGenPacket::InitLib(int v_major, int v_minor) { if(WSAStartup(MAKEWORD(v_major, v_minor), &wsadata)!= 0) return -1;
return 0; }
int CGenPacket::CheckLibVersion(int v_major, int v_minor) { if (LOBYTE(wsadata.wVersion) != v_minor || HIBYTE(wsadata.wVersion) != v_major) return -1;
return 0; }
void CGenPacket::setLocalIP() { hostent *P; char s[128]; in_addr in; char *P2; gethostname(s, 128); P = gethostbyname(s); in.S_un.S_un_b.s_b1 = P->h_addr_list[0][0]; in.S_un.S_un_b.s_b2 = P->h_addr_list[0][1]; in.S_un.S_un_b.s_b3 = P->h_addr_list[0][2]; in.S_un.S_un_b.s_b4 = P->h_addr_list[0][3]; src_addr = inet_ntoa(in); }
int CGenPacket::createSocket() { if((sd = socket(AF_INET,SOCK_RAW,IPPROTO_RAW)) == INVALID_SOCKET) return -1;
return 0; }
int CGenPacket::setRaw() { bool bOpt; if(setsockopt(sd, IPPROTO_IP, 2, (char *)&bOpt, sizeof(bOpt)) < 0) return -1;
return 0; }
int CGenPacket::sendPacket() { char * buffer; int result; sockaddr_in target;
unsigned char header_length; unsigned int packet_length;
memset (&target, 0, sizeof (target));
target.sin_family = AF_INET; target.sin_addr.s_addr = iph.ip_daddr; target.sin_port = htons(0);
header_length = sizeof (struct IPHdr); // !!! If IP_OPTIONS, increase... packet_length = header_length + 0;
iph.ip_check = 0;
if (!iph.ip_tot_len) iph.ip_tot_len = htons (packet_length);
buffer =(char *) calloc (packet_length, sizeof (char));
memcpy (buffer, &iph, sizeof (struct IPHdr));
char *data = NULL; if (data) memcpy (buffer + header_length, data, 0);
iph.ip_check = getCheckSum((unsigned short *) buffer, packet_length);
memcpy (buffer, &iph, sizeof (struct IPHdr));
result = sendto (sd, buffer, packet_length, 0,(struct sockaddr *)&target, sizeof (target)); return 0;
}
unsigned short CGenPacket::getCheckSum(unsigned short *buffer, int buf_size) { unsigned long cksum=0;
while (buf_size > 1){ cksum += *buffer++; buf_size -= sizeof(unsigned short); } if (buf_size) cksum += *(unsigned short*)buffer;
cksum = (cksum >> 16) + (cksum & 0xffff); cksum += (cksum >>16);
return (unsigned short)(~cksum); }
|
|