У меня проблема с 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.