Предполагается, что TCP - нет способа гарантировать, что каждая команда будет прочитана так, как она была отправлена.В конце пункта назначения каждая команда может быть фрагментирована или присоединена к другим командам, поэтому вам нужно вручную решить, где находятся границы между ними.
Обычный метод - это префикс команд с их длиной, которую вы можетесначала прочитайте, и точно знаете, сколько байтов нужно прочитать до следующего.В конце пункта назначения у вас обычно есть какая-то очередь, в которую вы помещаете все полученные данные, и вы читаете по очереди одну команду за раз, только когда есть одна или несколько полностью полученных команд.
Iне рекомендую использовать блокирующие сокеты ни при каких обстоятельствах, даже если вы используете отдельный поток.Если вам нужно и отправлять, и получать по одному и тому же сокету, вы можете столкнуться с проблемами, когда вы пытаетесь вызвать Read, когда нет данных, ожидающих, и вы не сможете отправлять какие-либо данные, пока некоторые не будут получены.Вместо того, чтобы использовать блокирующие вызовы, используйте BeginRead
, EndRead
для асинхронного приема, тогда вы сможете отправлять и получать в одном потоке, не беспокоясь об этом.