>(Извините за откровенно ламерский вопрос, но это мой первый опыт программирования сокетов
>в Linux'e и как следствие первые непроходимые грабли)
>Пробовал тут посылать пакет сформированый собственноручно с помощью
>pcksck=socket(PF_PACKET,SOCK_RAW,ETH_P_ALL)
>а затем отсылать его методом
>sendmsg(psksck,hdr,0)
>но сендмсг возвращает -1 и еррно = EINVAL (22), подозреваю, что дело
>в неправильно сформированном hdr. Заполнил я его согласно man'u, хотя возникли
>вопросы относительно полей msg_control и msg_name - пробовал подставлять в них
>мак карточки и названия девайса(ака /dev/eth).Не могли бы вы мне объяснить
>для чего предназначены данные поля и как их правильно заполнять, а
>может для моей задачи они и вовсе не нужны и грабли
>лежат где-то еще? Работаю под root'ом, создание самого сокета вроде проходит
>нормально (не возвращает -1).
>Заранее благодарен за любую конструктивную помощь :)
Мне нужно было принимать/посылать только с одного интерфейса, поэтому я вначале сокет биндил к /dev/ethx, а EINVAL - это точно hdr, у меня такое было, надо проверить, заполнить ВСЕ поля, в том числе те, которые не знаешь как - поставить NULL и нули, память где надо аллоцировать. У меня было:
msg_name = NULL;
msg_namelen = 0;
msg_control = NULL;
msg_controllen = 0;
msg_iov = (struct iovec *) malloc (тратата);
msg_iov.base = malloc (сколько надо под пакет);
msg_iov.len = сколько надо под пакет;
msg_iovlen = 1;
msg_flags = 0;
После этого все работало. У меня инвал был потому что я имя не заполнял, то есть нулл не присваивал, а это надо