luni, 12 decembrie 2011

Ce e defapt un pachet IP? Tehnici de programare pe socketuri c++

Toti confundam IPul cu o adresa unica a fiecarui PC intr-o retea de internet. Practic este asa, insa si mai practic IPul nu este decat un protocol de comunicatie.

El arata cam asa: Puteti vedea bitii care cum sunt aranjati. Frumusetea e ca stiind acest model, orice IP poate fi spoofat(trimiteti un pachet in numele altcuiva)
Tehnica e simpla, in c++ se foloseste functia setsockopt cu ajutorul careia se dezactiveaza optiunea ce determina kernelul sa introduca automat headerul. Tehnica se poate folosi de exemplu in redirecte(pentru a inscrie un numar nelimitat)

 http://webee.technion.ac.il/labs/comnet/netcourse/CIE/Course/Section3/7.htm


De asemenea de mentionat este faptul ca HalfLifeul foloseste pachete UDP/DGram pentru comunicare. Acestea nu pot stabilesc o legatura persistenta. Nu exista un listener care sa stie de unde trebuie sa vina urmatorul pachet, ci doar ca trebuie sa vina.

Structuri folositoare in c++ pentru socketuri

struct sockaddr_in {
uint8_t sin_len; /* length of structure (16) */
sa_family_t sin_family; /* AF_INET */
in_port_t sin_port; /* 16-bit TCP or UDP port number */
struct in_addr sin_addr; /* 32-bit IPv4 address */
char sin_zero[8];
};
struct in_addr {
in_addr_t s_addr; /* 32-bit IPv4 address */
};
struct sockaddr {
uint8_t sa_len;
sa_family_t sa_family; /* address family: AF_xxx value */
char sa_data[14]; /* protocol-specific address */
};


Functii:

All data in the network is sent as “Big Endian”
Conversion into local representation required (Intel)
(depends on the CPU architecture but should always be done
for portability)
netshort = htons (hostshort)
netlong = htonl (hostlong)
hostshort = ntohs (netshort)
hostlong = ntohl (netlong)
int createSocket(const sockaddr_in &addr)
{
int sd=socket(AF_INET,SOCK_DGRAM,0);
if (sd<0) return -1;
int yes = 1;
setsockopt(sd, SOL_SOCKET, SO_REUSEADDR, (char*)&yes, sizeof yes);
fcntl(sd,F_SETFL,O_NONBLOCK);
if (bind(sd,reinterpret_cast<const sockaddr *>(&addr),sizeof addr)<0) {
std::cerr << strerror(errno) << std::endl;
return -1;
}
return sd;
}

Mai mult:
http://www.netlab.tkk.fi/opetus/s383150/2006/slides/network-programming-c.pdf

Clase c++ si c# folositoare pentru determinarea headerului IP/UDP si a datelor. Daca va vine pachetul si voi vreti sa determinati sursa, portul, protocolul, CheckSumul ,etc.

Clasele nu sunt facute de mine, dar le-am folosit si le recomand.
http://fisierulmeu.ro/65C9FFZRZ5CO/Internet-pg-rar.html

c++:
http://www.cplusplus.com/forum/general/7109/


Surse: http://www.netlab.tkk.fi/opetus/s383150/2006/slides/network-programming-c.pdf

Niciun comentariu:

Trimiteți un comentariu