LINUX.ORG.RU

[Сетевой стек Kernel] Получить указатель на данные


0

1

Добрый день, хочу узнать, как получить указатель на отправляемые данные (которые отправляет пользователь в сеть) через структуру sock.

Deleted

Последнее исправление: Deleted (всего исправлений: 1)

Разрешаю. Узнай.

anonymous
()

не очень понял вопрос (особенно про указатель).

но данные, ессно, в sock->sk_write_queue

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

idle Как работать с этим указателем? Пытаюсь прочитать через printk(«sock->sk_write_queue %s \n», sock->sk_write_queue) внутри функции tcp_sendmsg . И получаю один только мусор. Как происходит передача больших данных из пользовательского пространства в ядро ( не большой объём данных передаётся через struct msg и через неё можно получить к ним доступ, однако если передаётся большой объём данных через сокет, то я хз как и где хранятся указатели на передаваемые данные. )

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

сорри. без обид, но после

printk(«sock->sk_write_queue %s \n», sock->sk_write_queue)


вам чуток подучиться нужно ;)

И получаю один только мусор


вот, прежде чем задавать такие вопросы, вы бы хоть
посмотрели какого типа ->sk_write_queue.

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

Вы правы¸моя ошибка) Но посмотрев struct sk_buff_head sk_write_queue , и узнав что это sk_buff_head , я не узнал ничего нового, кроме как что не стоило printk использовать) Как помню, struct sk_buff_head это буферы сокетов(или правельнее указатели на головы буферов сокетов, используемых и не используемых), в нашем контексте наверное они даже заполнены данными (но sk_buff->data будет показывать хрен знает куда.) И я так и не понял как получить доступ к отправляемым данным. Может я просто ни черта не понятно вопрос задал. Сейчас его отпишу повторно, но с деталями.

Когда пользователь передаёт данные через сокет, они передаются через struct msg (далее рассматриваем только действия в ядре). Через структуру msg мы можем посмотреть передаваемые данные в структурах iov и через iov->base посмотреть данные отсылаемые пользователем через сокет. К сожалению, такое прокатывает только с маленькими объёмами данных, предположительно тех, которые могут уместиться в тело одного tcp пакета. Если передаваемые данные имеют большой размер, то через iov->base мы их уже не увидим.

Теперь пристально рассмотрим функцию tcp_sendmsg , через неё проходят все tcp пакеты ( предположительно что все... а решил я так, как в этой функции заполняется структура, описывающая tcp соединение ).

Раз так, то полагаю, что внутри этой функции, можно получить любые передаваемые данные, которые отправляются по протоколу tcp. Вот аргументы функции tcp_sendmsg(struct kiocb *iocb, struct socket *sock, struct msghdr *msg, size_t size)

Так как передача данных через «struct msghdr *msg» по моей теории отпадает (через неё передаётся только маленький объём данных). Остаются две структуры «struct kiocb *iocb, struct socket *sock» т.к. с struct kiocb я никогда не работал, предположил, что получить указатель на отправляемые данные можно через «struct socket *sock».... вот и думаю, как это сделать.

Если я жестоко туплю, заранее извиняюсь. И прошу пояснить в каких своих рассуждениях я не прав. А если вы знаете как сделать то что мне нужно, буду КРАЙНЕ БЛАГОДАРЕН за пример кода. Спасибо.

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

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

ну так разбирайтесь дальше ;)

Если передаваемые данные имеют большой размер, то через

iov->base мы их уже не увидим.



с чего бы это?

tcp_sendmsg , через неё проходят все tcp


вообще-то нет, я думаю. хотя бы tcp_sendpage() взять.

«struct msghdr *msg» по моей теории отпадает (через неё

передаётся только маленький объём данных).



еще раз, это вы что-то странное говорите.

А если вы знаете как сделать то что мне нужно,


нет, не знаю. начнем с того, что я даже отдаленно не
понимаю, что вы пытаетесь сделать.

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