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
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