Не уверен, где проблема.Поскольку вы упомянули серверы, я полагаю, что TCP, да?
Телефон должен связать часть вашего PDU с другим телефоном.Он подключается как клиент к серверу на другом телефоне.Сокет-пара установлена.Он отправляет данные в сокет сервера.Пара сокетов уникальна - никакие другие потоки, которые могут происходить между двумя телефонами, не должны прерывать это (конечно, это будет замедлять).
Я не вижу, как работают асинхронные / синхронизирующие сокеты, предполагаяреализовано правильно, должно повлиять на это, либо должно работать нормально.
Есть ли что-то, чего я здесь не вижу?
Кстати, план Maciek по поддержке протокола путем добавления начального байта 'AA'отличная идея - протоколы, зависящие от отправки только длины, так как первый элемент, кажется, в конце концов облажаются и приводят к тому, что узел пытается освободить больше байтов от количества атомов во вселенной.
Rgds, Martin
Хорошо, теперь я понимаю проблему (я совершенно не понял топологию сети OP - я думал, что на каждом телефоне работает TCP-сервер, а также клиент / с, но на ПК есть только один сервер / что угодно-la-чаты).Я не понимаю, почему вы не можете заблокировать класс сокета с помощью мьютекса, поэтому сериализуйте сообщения.Вы можете поставить сообщения в очередь в сокет, но это имеет последствия для памяти, которых вы пытаетесь избежать.
Вы можете посвятить соединение подаче на телефон только инструкций, например, «откройте мне еще одно сокетное соединение и верните этот GUID - после этого сообщение будет передано на сокет».Это использует пару сокетов только для контроля и уменьшает мощность вашего сервера вдвое: (
Вы застряли с протоколом, который вы описали, или вы можете разбить свои сообщения на куски с некоторым идентификатором в каждом чанке?Затем вы можете мультиплексировать сообщения в одну пару сокетов.
Другая альтернатива, которая снова потребует разбиения сообщений, - это введение «управляющего сообщения» (возможно, это блок с 55 при запуске вместо AA),который содержит идентификатор сообщения (GUID?), который телефон использует для установления второго соединения через сокет с сервером, передает идентификатор и затем отправляет второе сообщение о новом соединении через сокет.
Другой,(еще не надоест?), способ убедить телефон в том, что новое сообщение может быть в ожидании, состоит в том, чтобы закрыть сокет сервера, на который телефон получает сообщение. Затем телефон может снова подключиться, сообщить серверу, что онполучил только хххх байты идентификатора сообщения гггг. Затем сервер мог ответить с инструкцией наen другой сокет для нового сообщения zzzz и затем возобновите отправку сообщения yyyy.Это может потребовать некоторой буферизации на сервере, чтобы гарантировать, что никакие данные не будут потеряны во время «перерыва».Вы можете захотеть реализовать такую функцию «перезапуск потоковой передачи после перерыва» в любом случае, так как телефоны имеют тенденцию проходить под мостами / туннелями, так же как последние КБ видеофайла 360 МБ передаются в потоковом режиме :( Я знаю, что TCP должен заботиться о пропущенных пакетах, но если беспроводный уровень телефона решает закрыть сокет по какой-либо причине ...
Ни одно из этих решений не является особенно удовлетворительным. Интересно посмотреть, какие другие идеи возникают ..
Rgds,Martin