Сейчас на форуме: rmn, Magister Yoda, vasilevradislav, tyns777, zombi-vadim (+5 невидимых)

 eXeL@B —› Программирование —› Сокеты - определить нагрузку на сокет
Посл.ответ Сообщение

Ранг: 31.5 (посетитель)
Активность: 0.020
Статус: Участник

Создано: 30 марта 2008 20:03
· Личное сообщение · #1

Доброго времени суток всем.

Как всем известно при отправке данных через сокеты они не отправляются сразу, а вначале ложаться в спец буфер, так вот, можно ли каким либо образом определить загруженность этого буфера. Нужно для того, чтобы выбрать через какой лучше отправлять данные, так как программа работает через 2 выхода в интернет.

PS: Определить наличие в буфере места для отправки данных может функция select, а вот как определить загруженность буфера незнаю...



Ранг: 352.4 (мудрец), 4thx
Активность: 0.150
Статус: Участник
retired

Создано: 30 марта 2008 20:21
· Личное сообщение · #2

ты бы сказал что за операционка. в bsd стэке можно здесь это выковырять: so->so_snd.sb_cc;



Ранг: 31.5 (посетитель)
Активность: 0.020
Статус: Участник

Создано: 30 марта 2008 22:35
· Личное сообщение · #3

Не, вообще Windows, но нужна совместимость с *nix. К сожалению с bsd совсем незнаком.



Ранг: 352.4 (мудрец), 4thx
Активность: 0.150
Статус: Участник
retired

Создано: 30 марта 2008 23:25
· Личное сообщение · #4

я уже спрашивал это на форумах - везде говорят что никак. незачем нормальному приложению это знать, а если кажется что все-таки нужно - это кривой дизайн.



Ранг: 31.5 (посетитель)
Активность: 0.020
Статус: Участник

Создано: 31 марта 2008 07:34
· Личное сообщение · #5

Ну что же, все понятно, спасибо ssx - буду думать и менять дизайн.




Ранг: 387.4 (мудрец)
Активность: 0.170
Статус: Участник
системщик

Создано: 31 марта 2008 07:37
· Личное сообщение · #6

smex, сделать просто - укажи скакого размера ты хочешь иметь буфер при отправке - например 1 байт. Ну а потом дело в твоём коде - если сокет готов к отправке, то значит твой последний send() ушёл.



Ранг: 352.4 (мудрец), 4thx
Активность: 0.150
Статус: Участник
retired

Создано: 31 марта 2008 21:27
· Личное сообщение · #7

Почему нет FIONWRITE ?

Достался мне код написанный под некую OS (VxWorks если это кому-то что-то говорит), использующую BSD tcp/ip стэк. И вот один ковбой написал там примерно такое:
nbytes = so->so_snd.sb_cc;
т.е. он напрямую обращается к структуре сокета. (и при забитости сокета на 95% шлет snmp trap, но это уже детали)
Сейчас мне нужно сделать аналог этого под Linux. Знает ли уважаемый олл способ получить эту же инфу имея fd сокета?




Ранг: 387.4 (мудрец)
Активность: 0.170
Статус: Участник
системщик

Создано: 02 апреля 2008 22:06 · Поправил: s0larian
· Личное сообщение · #8

Так это ж VxWorks - там нету процессов (кроме их последней версии, но это другой разговор). В Линухе структура сокета живёт в ядре и из user mode её не прочесть. Если интересно, посмотри в исхлодник ядра. Для конфигурации из user mode посмотри manual page на getsockopt()/setsockopt() - в .h файле есть есть все опции.




Ранг: 387.4 (мудрец)
Активность: 0.170
Статус: Участник
системщик

Создано: 02 апреля 2008 22:21
· Личное сообщение · #9

Вот, нарыл тебе. Google рулит

SIOCINQ
Returns the amount of queued unread data in the receive
buffer. Argument is a pointer to an integer. The socket
must not be in LISTEN state, otherwise an error (EINVAL)
is returned.

SIOCATMARK
Returns true when the all urgent data has been already
received by the user program. This is used together with
SO_OOBINLINE .
Argument is an pointer to an integer for the test result.

SIOCOUTQ
Returns the amount of unsent data in the socket send queue
in the passed integer value pointer. The socket must not
be in LISTEN state, otherwise an error (EINVAL)
is returned.

Доступно через ioctl()



Ранг: 352.4 (мудрец), 4thx
Активность: 0.150
Статус: Участник
retired

Создано: 02 апреля 2008 22:52
· Личное сообщение · #10

спасибо, кажется, то что нужно. честное слово, я гуглил, и священную книгу (tcp/ip illustrated vol.2) перерыл - как-то умудрился мимо пройти



Ранг: 31.5 (посетитель)
Активность: 0.020
Статус: Участник

Создано: 09 апреля 2008 19:37
· Личное сообщение · #11

Я вот только не пойму поддерживает ли эту функцию Windows. Походу ioctl() в Windows соответствует ioctlsocket(), однако читая MSDN не нашел ни единого упоминания об SIOCOUTQ, SIOCATMARK и SIOCINQ. Подскажите, это я просто плохо смотрел, или реально это зделать по виндой нельзя.




Ранг: 387.4 (мудрец)
Активность: 0.170
Статус: Участник
системщик

Создано: 09 апреля 2008 20:03 · Поправил: s0larian
· Личное сообщение · #12

smex, этоти ioctl только для Linux.

Есть вот что:

FIONREAD

Determine the amount of data that can be read atomically from socket s. lpvOutBuffer points at an unsigned long in which WSAIoctl stores the result. If s is stream oriented (for example, type SOCK_STREAM), FIONREAD returns the total amount of data that can be read in a single receive operation; this is normally the same as the total amount of data queued on the socket (since data stream is byte-oriented, this is not guaranteed). If s is message oriented (for example, type SOCK_DGRAM), FIONREAD returns the size of the first datagram (message) queued on the socket.


 eXeL@B —› Программирование —› Сокеты - определить нагрузку на сокет
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати