И така, накратко: програмата ми получава необработен байт (u_char) буфер, който представлява мрежов пакет. Опитвам се да анализирам информацията в този пакет и го правя, като използвам дефинираните от системата структури на заглавките (ether_header, ip, ip6, tcphdr, udphdr). Приложих това както на Linux, така и на AIX и работи, но по някаква причина продължавам да получавам Bus Error, когато правя това на Solaris.
Начинът, по който получавам данните, е просто да прехвърлям всяка част от буфера като една от структурите и да чета данните. Например, ако имам
u_char buffer[] = {...some bytes...};
struct ether_header *ethdr = (struct ether_header *)buffer;
struct ip *iphdr = (struct ip *) (buffer + sizeof(struct ether_header));
etc. etc.
След това мога да получа информацията, от която се нуждая, като:
iphdr->ip_v; //to get the version
etc->etc; //to get whatever piece of data I need
Обикновено на Linux и AIX това работи добре (някои структури имат различни имена в различните системи, но това не е важно), но при опит да стартирам това на Solaris, продължавам да получавам Bus Error, когато стигне до iphdr->ip_v;
след struct ip *iphdr = (struct ip *) (buffer + sizeof(struct ether_header));
. След известно разследване открих, че това е причинено от опит за достъп до неподравнена памет. Това има смисъл, тъй като размерът на ethernet заглавието е само 14 байта, следователно IP заглавието не е подравнено по байтове в масива.
Начинът, по който се опитах да заобиколя това, беше да копирам съответните части в отделен буфер, преди да опитам да го прочета
memcpy(&buffer_copy, buffer + sizeof(struct ether_header), sizeof(struct ip));
struct ip *iphdr = &buffer_copy;
iphdr->ip_v;
etc.
Това работи, но не разбирам защо. Защо memcpy не извежда Bus Error, когато се опитва да получи достъп до същото място в паметта? Не ми харесва толкова много решението, което измислих, и се опитвам да разбера по-добре ситуацията, за да мога да измисля нещо друго. Може би пропускам част от пъзела?
struct ip *iphdr = (struct ip *) (buffer + sizeof(struct ether_header));
извежда Bus Error? Или по-скоро защо опитът за достъп до данни вътре в него извежда грешката. - person monkeygame7   schedule 31.07.2015uname -a
? - person Andrew Henle   schedule 31.07.2015