При использовании Boost ASIO полезная нагрузка разделяется на два TCP-пакета, когда она помещается в MTU

У меня проблема с boost :: asio :: ip :: tcp :: iostream. Я пытаюсь отправить около 20 необработанных байтов. Проблема в том, что эта 20-байтовая полезная нагрузка разделяется на два TCP-пакета с 1 байтом, затем 19 байтами. Простая проблема, почему это происходит, я понятия не имею. Я пишу это для устаревшего двоичного протокола, который очень требует, чтобы полезная нагрузка умещалась в одном пакете TCP (стон).

Вставка всего исходного кода из моей программы была бы долгой и чрезмерно сложной, я разместил здесь функциональную проблему только в пределах двух функций (проверено, она воспроизводит проблему);

#include <iostream>

// BEGIN cygwin nastyness
// The following macros and conditions are to address a Boost compile
// issue on cygwin. https://svn.boost.org/trac/boost/ticket/4816
//
/// 1st issue
#include <boost/asio/detail/pipe_select_interrupter.hpp>

/// 2nd issue
#ifdef __CYGWIN__
#include <termios.h>
#ifdef cfgetospeed
#define __cfgetospeed__impl(tp) cfgetospeed(tp)
#undef cfgetospeed
inline speed_t cfgetospeed(const struct termios *tp)
{
    return __cfgetospeed__impl(tp);
}
#undef __cfgetospeed__impl
#endif /// cfgetospeed is a macro

/// 3rd issue
#undef __CYGWIN__
#include <boost/asio/detail/buffer_sequence_adapter.hpp>
#define __CYGWIN__
#endif
// END cygwin nastyness.

#include <boost/array.hpp>
#include <boost/asio.hpp>
#include <iostream>

typedef boost::asio::ip::tcp::iostream networkStream;

void writeTestingData(networkStream* out) {
        *out << "Hello world." << std::flush;
//      *out << (char) 0x1 << (char) 0x2 << (char) 0x3 << std::flush;
}

int main() {
        networkStream out("192.168.1.1", "502");

        assert(out.good());

        writeTestingData(&out);
        out.close();
}

Чтобы добавить к странной проблеме, если я отправляю строку «Hello world.», Она идет одним пакетом. Если я отправлю 0x1, 0x2, 0x3 (необработанные байтовые значения), я получу 0x1 в пакете 1, а затем остальные данные в следующем пакете TCP. Я использую WireShark для просмотра пакетов, есть только переключатель между машиной разработчика и 192.168.1.1.

9
задан Sam Miller 28 March 2013 в 22:48
поделиться