Продолжая комментарии к сообщению Стефана:
Определенно возможно буферизовать на стороне клиента или сервера. Но обязательно подумайте, что написал Нил. Если мы просто начнем слепо буферизовывать данные и если обработка никогда не поспевает за отправкой, тогда наш буфер будет расти так, как мы, вероятно, не хотим.
Теперь я недавно внедрил простую 'NetworkPipe', которая должна была функционировать как соединение между одним клиентом / сервером, сервером / клиентом, где внешний пользователь не знает / не заботится, является ли Pipe клиентом или сервером. Я реализовал ситуацию с буферизацией, похожую на ту, о которой вы спрашиваете, как? Ну, класс был многопоточным, это был единственный способ, которым я мог придумать для чистой буферизации данных. Вот основной процесс, которому я следовал, и обратите внимание, что я установил максимальный размер для Pipes:
- Процесс 1 запускает канал, по умолчанию сервер. Теперь внутренний поток ожидает клиента.
- Процесс 2 запускает канал, уже сервер, по умолчанию - Клиент.
- Теперь мы подключены, первое, что нужно сделать, это обменяться максимальными размерами буфера.
- Процесс 1 записывает данные (он отмечает, что на другом конце есть пустой буфер [см. # 3])
- Внутренний поток процесса 2 (теперь ожидает выбора () для сокета) видит, что данные отправляются и читает их, буферизует их. Процесс 2 теперь отправляет обратно новый буферный размер P1.
Так что это действительно упрощенная версия, но в основном благодаря многопоточности я всегда могу ждать блокирующего вызова select, как только поступают данные, я могу читать и буферизировать, я отправляю обратно новый буферизованный размер. Вы можете сделать что-то подобное и слепо буферизировать данные, на самом деле это немного проще, потому что вам не нужно обмениваться размерами буфера, но, вероятно, это плохая идея. Таким образом, приведенный выше пример позволил внешним пользователям читать / записывать данные, не блокируя их поток (если буфер на другом конце не заполнен).