Возникла потребность создать разделяемый сокет, т.е. чтобы на одном сокете можно было держать несколько сессий и по ним можно было бы гонять разные потоки данных.
Решение в лоб...
Скажем каждой новой сессии дается свой ключ и он известен как клиенту, так и серверу. Далее... По ключу при вычитке определяем для кого предназначены данные и помещаем их во внутренний буфер той сессии. Все хорошо, но...
Проблема в том, что при таком подходе прийдется создавать безразмерные буфера сессий, а этого очень как не хочется. Если же делать один буфер для всех сессий, то в случае его заполнения данными для одной из них прийдется ждать вычитки части этих данных, а пока прекратить чтение сокета. Это приведет к тому, что одна сессия может монополизировать сокет и не давать остальным получать данные.