Сейчас на форуме: rmn, Magister Yoda, vasilevradislav, tyns777, zombi-vadim (+5 невидимых) |
eXeL@B —› Программирование —› Сокеты - определить нагрузку на сокет |
Посл.ответ | Сообщение |
|
Создано: 30 марта 2008 20:03 · Личное сообщение · #1 Доброго времени суток всем. Как всем известно при отправке данных через сокеты они не отправляются сразу, а вначале ложаться в спец буфер, так вот, можно ли каким либо образом определить загруженность этого буфера. Нужно для того, чтобы выбрать через какой лучше отправлять данные, так как программа работает через 2 выхода в интернет. PS: Определить наличие в буфере места для отправки данных может функция select, а вот как определить загруженность буфера незнаю... |
|
Создано: 30 марта 2008 20:21 · Личное сообщение · #2 |
|
Создано: 30 марта 2008 22:35 · Личное сообщение · #3 |
|
Создано: 30 марта 2008 23:25 · Личное сообщение · #4 |
|
Создано: 31 марта 2008 07:34 · Личное сообщение · #5 |
|
Создано: 31 марта 2008 07:37 · Личное сообщение · #6 |
|
Создано: 31 марта 2008 21:27 · Личное сообщение · #7 Почему нет FIONWRITE ? Достался мне код написанный под некую OS (VxWorks если это кому-то что-то говорит), использующую BSD tcp/ip стэк. И вот один ковбой написал там примерно такое: nbytes = so->so_snd.sb_cc; т.е. он напрямую обращается к структуре сокета. (и при забитости сокета на 95% шлет snmp trap, но это уже детали) Сейчас мне нужно сделать аналог этого под Linux. Знает ли уважаемый олл способ получить эту же инфу имея fd сокета? |
|
Создано: 02 апреля 2008 22:06 · Поправил: s0larian · Личное сообщение · #8 Так это ж VxWorks - там нету процессов (кроме их последней версии, но это другой разговор). В Линухе структура сокета живёт в ядре и из user mode её не прочесть. Если интересно, посмотри в исхлодник ядра. Для конфигурации из user mode посмотри manual page на getsockopt()/setsockopt() - в .h файле есть есть все опции. |
|
Создано: 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() |
|
Создано: 02 апреля 2008 22:52 · Личное сообщение · #10 |
|
Создано: 09 апреля 2008 19:37 · Личное сообщение · #11 |
|
Создано: 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 —› Программирование —› Сокеты - определить нагрузку на сокет |