Сколько сокетов создать на стороне клиента?

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

Я работаю над приложением чата IOCP, и я запутался в этой схеме. Если я хочу обрабатывать соединения, я делаю 1 сокет для каждого клиента, но если клиент отправляет файл, мой сервер не может выделить память для загрузки файла, потому что я делаю это после обработки вновь принятого соединения, поэтому становится сложно хранить память, необходимая для файлов в пуле памяти, особенно для очистки и освобождения памяти. Нужно ли мне перераспределять память на основе команд, если я использую 1 сокет только на стороне клиента, чтобы другие буферы не были перезаписаны? или самый простой способ - использовать 1 сокет для каждой операции, которая занимает много памяти, например, отправка файлов, изображения и т. д., чтобы мой сервер автоматически выделял уникальный буфер для каждого нового соединения?

И когда я должен использовать КРИТИЧЕСКИЕ СЕКЦИИ в IOCP? в рабочем потоке, если я хочу получить доступ к буферу после того, как я получил некоторые данные, скопируйте их в общий полученный буфер. Нужно ли мне вводить критические разделы, прежде чем копировать из временного буфера во весь буфер, чтобы другие потоки не мешали значениям?


person a man in love    schedule 14.10.2017    source источник


Ответы (1)


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

person Mikhail Semenov    schedule 14.10.2017
comment
Создание потока для каждого соединения не рекомендуется и не очень хорошо масштабируется. Создание потока имеет много накладных расходов. Мой вопрос заключался в том, нужно ли мне создавать больше сокетов для различных операций на стороне клиента? например, общий доступ к файлам, обмен изображениями, текстовый чат и т. д., каждый из которых имеет свой уникальный сокет, поэтому это будет асинхронный процесс. - person a man in love; 15.10.2017