У меня есть сервер, взаимодействующий с несколькими клиентами, где клиент отправляет сообщения на сервер, а сервер читает их с помощью метода recv (). Проблема, которую я получаю, состоит в том, что я использую waitforsingleobject (обработчик, 10000 миллисекунд), чтобы заставить сервер ждать несколько секунд, чтобы взаимодействовать с одним клиентом, а затем позволить другим доступ к нему, но затем я начинаю видеть ответ от сервера с неправильным сообщение клиенту и получение заблокировано. Так выглядит проблема синхронизации.
Поэтому мой вопрос (так как я новичок в c ++), как я могу гарантировать, что каждое входящее сообщение будет получено и получено ответом нужному клиенту, позволяя всем клиентам взаимодействовать с сервером.
Есть две альтернативы.
Во-первых, довольно стандартная модель — один поток на одного клиента. Когда клиент подключается, вы запускаете поток для его обработки.
Второй подход не требует много потоков. Вы должны использовать WSARecv () на перекрывающемся сокете вместо recv (). Таким образом, вы можете одновременно открывать несколько операций приема, по одной для каждого клиента, и ожидать их все в WaitForMultipleObjects (). Чтобы быть конкретным, вы будете ждать события внутри WSAOVERLAPPED. Помните, что WaitForMultipleObjects () имеет ограничение на количество объектов ожидания. При превышении вам нужно будет запустить другой поток. Код возврата от WaitForMultipleObjects () скажет вам, какой клиент отправил данные, чтобы вы могли ответить на него.
Или, как предложено выше, вы можете использовать select (), чтобы выяснить, в каком сокете есть данные.
Других решений пока нет …