NoBufferSpaceAvailable при отправке данных в сокет - PullRequest
0 голосов
/ 07 марта 2012

Я использую в подключенном сокете на моем сервере что-то вроде этого для отправки данных клиенту:

IAsyncResult asyncRes = connectionSocket.BeginSend(data, 0, length, SocketFlags.None, 
     out error, new AsyncCallback(SendDataDone), signalWhenDataSent);

Как кажется, когда между сервером и клиентом, который я получаю, есть медленное интернет-соединениеописание исключения, подобное этому: NoBufferSpaceAvailable

Что именно означает эта ошибка?Внутренний буфер ОС для сокета connectionSocket заполнен?Каковы средства, чтобы заставить это работать.В качестве контекста, где это появляется, находится прокси-сервер http.Это может означать, Я предполагаю , что скорость, с которой данные поступают с исходного сервера, выше, чем скорость, с которой мой сервер может справиться с прокси-клиентом.Как бы вы справились с этим?

Я использую tcp.

Ответы [ 2 ]

0 голосов
/ 16 марта 2012

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

Вы используете синхронные сокеты, проблема не появляется, потому что они блокируются, пока операция еще не завершена, но это не относится к асинхронным вызовам.

0 голосов
/ 07 марта 2012

Точно, скорее всего, буфер сокета ядра, содержащий исходящие данные, заполнен.Вы отправляете слишком "быстро" для клиента.Вы можете попытаться увеличить размер буфера отправки, но это не гарантирует, что вы больше не столкнетесь с этой проблемой.

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

...