Помогите с функцией check sum

Автор: iam0x70 Дата: 05.09.2003 13:39 Написал для тренировки программку с сырыми сокетами, запустил, а tcpdump говорит, что csum не тот, не понимаю почему, думаю, что дело в ip_len, но в чем именно? Вот программа:
#include <sys/socket.h>
#include <netinet/tcp.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <stdlib.h>
#include <string.h>
#define iptcp (sizeof(struct ip)+sizeof(struct tcphdr))
unsigned short int csum (unsigned short *buf, int nwords)
{
unsigned long sum;
for(sum=0;nwords>0;nwords--)
{
sum+=*buf++;
sum=(sum>>16)+(sum&0xffff);
sum+=(sum>>16);
return ~sum;
}
}


int main(void)
{
int one=1;
long int P;
int s = socket (PF_INET,SOCK_RAW,IPPROTO_TCP);
char datagram[4096],dest[16],*data;
struct ip *iph = (struct ip*) datagram;
struct tcphdr *tcpmy= (struct tcphdr *)datagram + sizeof(struct ip);
struct sockaddr_in sin;
data = datagram+iptcp;
//in_addr_t source;
sin.sin_family= AF_INET;
//printf("%d",sizeof(struct ip)+sizeof(struct tcphdr));
printf("Enter port number>";-);
scanf("%d",&P);
printf("Enter the address>";-);
scanf("%s",&dest);
sin.sin_port=htons(P);
sin.sin_addr.s_addr=inet_addr(dest);

memset(datagram,0,4096);
iph->ip_hl=5;
iph->ip_v=4;
iph->ip_tos=0;
//iph->ip_len=iptcp;
iph->ip_id=htonl(112);
iph->ip_off=0;
iph->ip_ttl=112;
iph->ip_p=6;
iph->ip_sum=0;
//iph->ip_src.s_addr=inet_addr("1.1.1.1";-);
iph->ip_src.s_addr=rand();
iph->ip_dst.s_addr=inet_addr(dest);
tcpmy->th_sport=htons(112);
tcpmy->th_dport=htons(P);
tcpmy->th_seq=rand();
tcpmy->th_ack=0;
tcpmy->th_x2=0;
tcpmy->th_off=0;
tcpmy->th_flags=TH_SYN;
tcpmy->th_win=htonl(65535);
tcpmy->th_sum=0;
tcpmy->th_urp=0;
//iph->ip_sum=csum((unsigned short *)datagram,iph->ip_len>>1);
setsockopt(s,IPPROTO_IP,IP_HDRINCL,(char *)&one,sizeof(s));
printf("Enter number of packets>";-);
scanf("%d",&P);
strcat(data,"BANANOV.NET";-);
while(P!=0)
{
P--;
iph->ip_src.s_addr=rand();
iph->ip_len=strlen(data)+iptcp;
iph->ip_sum=csum((unsigned short *)datagram,iph->ip_len>>1);
sendto(s,datagram,strlen(data)+iptcp,0,(struct sockaddr *)&sin,sizeof(sin));
}
return 0;

}
Re: Помогите с функцией check sum 07.09.2003 22:01leXa наверное, дело в __FAVOR_BSD.
---
# ifdef __FAVOR_BSD
typedef u_int32_t tcp_seq;
/*
* TCP header.
* Per RFC 793, September, 1981.
*/
struct tcphdr
---
Попробуй так:
---
#define __FAVOR_BSD
#include <netinet/tcp.h>
---
Re: Помогите с функцией check sum 08.09.2003 16:04zakon leXa писал(а):

> наверное, дело в __FAVOR_BSD.
> ---
> # ifdef __FAVOR_BSD
> typedef u_int32_t tcp_seq;
> /*
> * TCP header.
> * Per RFC 793, September, 1981.
> */
> struct tcphdr
> ---
> Попробуй так:
> ---
> #define __FAVOR_BSD
> #include <netinet/tcp.h>
> ---
>
Это не будет работать!


По-моему здесь банальная ошибка
return в цикле:
---
unsigned short int csum (unsigned short *buf, int nwords)
{
unsigned long sum;
for(sum=0;nwords>0;nwords--)
{
sum+=*buf++;
sum=(sum>>16)+(sum&0xffff);
sum+=(sum>>16);
// return ~sum;
}
return ~sum;
}
---
Re: Помогите с функцией check sum 08.09.2003 18:18iam0x70 Спасибо. Мдаа... такой дурацкой ошибки в своем коде я не ожидал. (надо меньше пить)
Re: Помогите с функцией check sum 09.09.2003 21:08leXa Хм, с #define __FAVOR_BSD компилится без проблем, иначе поля структуры не совпадут.А вот на этом месте прога слетает:
---
int s = socket (PF_INET, SOCK_RAW, IPPROTO_TCP);
if(s == -1){
perror("socket creation FAILED!";-);
return 1;
}
---
и выдает
---
$ ./rawsockstest
socket creation FAILED!: Socket type not supported
---
Получается, в "девятке" исходное ядро 2.4.20-9asp не имеет
поддержки "сырых" сокетов? Или дело в другом?
А где они задокументированы? В libc ничего толком нет, голое упоминание.
Re: Помогите с функцией check sum 11.09.2003 16:46zakon Я прогу под рутом пускал, так как не уверен что простому юзеру позволен RAW.
RSS-материал