У меня есть некоторый код C ++, который пишет в сокет, который читается программой Java.
Программа C ++ использует boost :: async_write для передачи байтов, и они затем читаются программой Java. Первые 4 байта вызова async_write соответствуют размеру основного сегмента данных. Поскольку размер явно определяется этим заголовком, код Java может заполнить байтовый массив, который является размером фактических данных, используя метод «прочитанного» метода BufferedInputStream.
Хотя это, кажется, работает нормально почти каждый раз, иногда байтовый массив, читаемый InputStream, содержит обнуленные данные для конца своего буфера. Таким образом, примерно 1 из каждых 50000 сообщений «повреждается». Место в буфере, где начинается обнуление данных, меняется. Хотя я могу поймать это и выбросить сообщение, мне интересно, если это ожидаемая производительность? Я пробовал это, когда обе программы взаимодействуют через сокет на локальном хосте и все еще имеют проблему.
Я не верю, что байты, записываемые в программе на C ++, выходят из области видимости, поскольку они временно хранятся в очереди до тех пор, пока не вернется «handle_write» (из async_write)
Программа на C ++ имеет только один поток, выполняющий io_service.
Программа на Java также выполняет чтение в одном потоке.
Я не обнаружил утечек памяти ни в одной из программ.