Решил изучать сетевое программ. Взался сразу за SOCK_ROW (захотелось утилиту пинг реалезовать). Даже вродеб как работает, но посмотрел в снифер и непонравилось что я там увидел- контрольная сума для ICMP корректная (функцию где-то здесь нашел), а вот для ip протокола забита нулями(удивился: как мне еще и ответ пришел). Насколько я понимаю ip checksum должна сама рассчитыватся,но видать я ее как-то перезатераю или еще что-то....
class Net
{
private:
unsigned short checksum(void *b, int len)
{
unsigned short *buf = (unsigned short *)b, result;
unsigned int sum=0;
for ( sum = 0 ; len > 1 ; len-=2)
{
sum += *buf;
buf++;
}
if ( len == 1 )
sum += *(unsigned char*) buf;
sum = (sum >> 16) + (sum & 0xffff);
sum += (sum >> 16);
result = ~sum;
return result;
}
public:
bool Ping(char *host)
{
int sockfd,get;
struct sockaddr_in to;
struct icmp *icmp_h;
short pingLength=1024;
char *buffer= new char [pingLength];
sockfd = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP);
icmp_h = (struct icmp*) buffer;
bzero(icmp_h, sizeof(struct icmp));
icmp_h->icmp_type = ICMP_ECHO;
icmp_h->icmp_code = 0;
icmp_h->icmp_id = rand() % 65535;
icmp_h->icmp_seq = rand() % 65535;
icmp_h->icmp_cksum=checksum(buffer,pingLength);
bzero(&to,sizeof(to));
to.sin_family=AF_INET;
to.sin_addr.s_addr=inet_addr(host);
sendto(sockfd, buffer, pingLength, 0,(struct sockaddr *) &to, sizeof(to));
get=recv(sockfd, buffer, pingLength, 0);
}
};