какое действие вызывает тайм-аут функции выбора, пока она обнаруживает состояние записи сокета. - PullRequest
0 голосов
/ 06 января 2012

мое приложение работает в солярисе 10. Это модель C / S. Клиентские и серверные программы на одном сервере. Я установил буфер отправки сокета клиентской программы 49512 и опцию TCP_NODELAY. интервал ожидания выбора составляет 1 с. в то время как мой клиент работает, я обнаружил, что если статическая сеть очень велика, выберите значение timeout, Я хочу знать, какое действие может вызвать сокет, не готовый к записи. Буфер отправки заполнен? или другие?

1 Ответ

1 голос
/ 06 января 2012

Вы правы: выберите () время ожидания, потому что буфер отправки заполнен.

Поскольку протокол TCP гарантирует доставку, данные не будут удалены из буфера отправки, пока отправитель не узнает , что он благополучно приземлился в буфере приема на другом конце сокета.

Это означает, что буфер отправки заполняется, например, когда принимающая сторона имеет полный приемный буфер или когда отправленные пакеты (или ACK от получателя) теряются в сети.

Даже когда select () делает не тайм-аут, буфер отправки может быть почти заполнен, и тогда ваш вызов write () не запишет все ваши данные в буфер , Всегда проверяйте возвращаемое значение вашего вызова write () или send () - это дает количество фактически записанных байтов

...