[devel] Особенности Си для x86_64

Denis Klimov =?iso-8859-1?q?zver_=CE=C1_altlinux=2Eorg?=
Ср Окт 1 13:36:35 MSD 2008


On Wed, 1 Oct 2008 12:59:44 +0400 Damir Shayhutdinov wrote:

> На x86_64 sizeof(long) = sizeof(void*) = 8 байт.
> а sizeof(int) = 4 байт.
> 
> Хотите писать кроссплатформенный код - освойте введенные в C99
> (stdint.h) типы intN_t.
> 
> То есть в вашем случае для 4-байтового знакового целого надо было
> использовать тип int32_t а не long.

Поправил. разбираться стало нормально. 
Но. возникла проблема одна.

На x86_64 вывод стал таким:
Netflow version: 5
bytes: 17408
src_addr: 113.0.168.192
dst_addr: 26.0.168.192
src_port: 1023
src_port: 65535
proto: 6

Т.е ip перевернутые.
Пробовал добавлять пару строк
                    ((struct flow *)p)->src_addr.s_addr = htonl(((struct flow *)p)->src_addr.s_addr);
                    ((struct flow *)p)->dst_addr.s_addr = htonl(((struct flow *)p)->dst_addr.s_addr);
перед выводом. Ничего не поменялось. Пробовал заменять htonl на ntohl - все равно так же.
Судя по ману на inet_ntoa ему надо network byte order. Так что htonl правильное. Но не помогает.

Так же надо заметить, что в i586 у меня правильно работает только если
нету этих строк. При их добавлении (с htonl или ntohl) - порядок
меняется на неверный.

Небольшая оговорка. i586 - это у меня контейнер. HN которого x86_64. хотя не думаю что это должно на него влиять.

Код стал таким
http://pastebin.ca/1215627

--
Denis Klimov 
zver




Подробная информация о списке рассылки Devel