LINUX.ORG.RU

sockets


0

0

Здравствуйте. Как можно сделать следующее - создал я сокет, соединился с сервером, послал ему запрос - но мне не нужен весь его ответ! Как получить допустим первые 10 байт, а остльаные просто сбросить ? Пусть они даже придут уже, но все равно чтобы при следующем вызове recv() их не было?

anonymous

если сокет tcp - то никак. вычитываеш при помощи recv всё а потом лишнее выбрасываеш иначе выйдет ерунда.

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

может можно это сделать и при помощи какиких-то ioctl но глючность приложения при этом гарантирована на 100%

для udp - сокетов это кажись делается автоматически

для raw - при помощи ioctl. какого - не скажу

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

Спасибо, нашел как можно обойтись без этого

anonymous
()

Я не понял. Как-то странно. Данные идут потоком, если надо первые 10 байт, можно прочитать их и закрыть сокет.. А иначе сколько именно надо сбросить? Ведь никто не может гарантировать, сколько именно данных считается при вызове recv(). Тем более пакеты могут фрагментироваться. Поправьте меня пожалуйста, если я не прав.

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

Нашел в чем проблема. Это долго здесь описывать, поэтому перейду сразу к делу: Почемуи функции send() и write() вовзаращют что послали все данные отправил - реально же данные на сервер приходят позже. Как можно заставить дождаться фактического прихода данных на сервер ?

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

Нет, не совсем так. Послал данные - жду ответа. Ответа нет - таймаут (можно попробовать еще раз подождать - то же самое), посылаю следующие данные - ответ приходит на предыдущие. К сожалению просмотреть что творится на сервер не могу :(

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

>Почемуи функции send() и write() вовзаращют что послали все данные отправил

это связано с указанными тобою опциями(возможно умалчиваемыми) при создании сокета. после создания сокета их можно изменить при помощи fcntl() && ioctl().

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

>Послал данные - жду ответа. Ответа нет - таймаут (можно попробовать еще раз подождать - то же самое), посылаю следующие данные - ответ приходит на предыдущие.

у тебя первый и вторый пакет уходят одним IP пакетом по причине настроек сокета или врапперов вокруг сокета.

лечится изменением настроек сокета при помощи ioctl() или настройкой враппера

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

> Почемуи функции send() и write() вовзаращют что послали все
> данные отправил - реально же данные на сервер приходят позже.

даже и не знаю как ответить. потому, что так и надо,
протокол такой, и такое повеление правильно и полезно.

> Как можно заставить дождаться фактического прихода
> данных на сервер ?

ioctl(SIOCOUTQ), например, вернет количество не acked байт.

но вообще-то это бессмысленно. peer host уже мог получить
данные, а приложение - нет. а о том, что приложение получило
данные никто, кроме него самого сказать не может. так что
если вам нужны гарантии получения - стройте свой простенький
протокол над tcp.

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

Спасибо большое, знаю что вопросы выглядели глупо, но просто никак не мог понять, почему работает именно так. Оказывается проблема совсем в другом месте и все с этим кодом ок :)

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