LINUX.ORG.RU

получить данные сокета в ядре

 


0

1

Доброй ночи!
Интересует меня, как получить информацию о передаваемых данных из пользовательского пространства , через структуру struct sock
Тоесть, когда мы создаём сокет в пользовательском пространстве, то заполняем структуру socket (надеюсь не ошибся) где указываем ip адрес, куда будут отправлены данные. Так вот, я никак разобраться не могу, в ядре есть структура struct sock как через неё вообще возможно узнать, указанный ip адрес в структуре socket ?

Deleted

вопрос снят) всем спасибо...

Deleted ()
Ответ на: комментарий от Deleted

Рано обрадовался! вопрос всё ещё актуален) пожалуйста помогите!

Deleted ()

Я немного не понимаю для чего тебе это надо. Но раз уж есть такой вопрос, то можно посмотреть как работает netfilter, консольная утилита iptables, tcpdump, библиотека libpcap, wireshark...

Думаю, что по этим терминам уже можно чего нагуглить...

Dennis7 ()

Да и вообще, когда мы создаем сокет, т.е. сискол socket, то там еще ни о каких адресах речи еще не идет, мы просто пока указываем «тип» создаваемого сокета.

Dennis7 ()
Ответ на: комментарий от Dennis7

Как эти примочки работают , я в курсе. Сейчас уже вопрос можно сформулировать так.
каким образом, из структуры struct msghdr *msg вытянуть ip адрес, куда передаются данные??

Понял что надо вытягивать адрес из struct sockaddr * но как это сделать на практике? Вот пример кода:

struct sockaddr *addr = msg->msg_name;
printk("addr->sa_family = %i\n", addr->sa_family);

На printk выдаёт oops !
BUG: unable to handle kernel NULL pointer dereference at (null)
как быть?

Deleted ()
Ответ на: комментарий от Deleted

каким образом, из структуры struct msghdr *msg вытянуть ip адрес, куда передаются данные?

struct in_addr *get_ipv4_in_addr(struct sockaddr *sa)
{
    if (sa && sa->sa_family == AF_INET)
        return &(((struct sockaddr_in*)sa)->sin_addr);
    else
        return NULL;
}

unable to handle kernel NULL pointer dereference

Значит addr тупо NULL. Откуда он сам берётся? Если из recvmsg, то нужно его связно на стеке подготовить:

struct sockaddr addr;
struct msghdr msg;
msg.msg_name = &addr;
// ...

Если там PF_PACKET сокет, то проще сделать recv пакета и разобрать заголовок.

quasimoto ★★★★ ()
Ответ на: комментарий от quasimoto

Спасибо за ответ) я уже разобрался, структуры sock можно получить указатель на struct inet_opt а в ней, всё есть.

Deleted ()
Ответ на: комментарий от Deleted

То есть там какой-то родной ядерный сокет? А то я было подумал что ты сниффер пишешь.

quasimoto ★★★★ ()
Ответ на: комментарий от quasimoto

Не)не снифер. надо было просто в определённый момент в работу функции сетевого стека врезаться. А там бывает такое, что некторые структуры не инициализированы и приходится методом тыка, разбираться. А насчёт сниферов, они в linux очень просто делаются. Свой обрабочик в список ptype_all_list и делаем что хочешь.

Deleted ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.