Как отправить буфер размером более 256 Кбайт с boost asio на OSX, отлично работает на WIN - PullRequest
1 голос
/ 19 августа 2011

У меня простой клиент-серверный подход, отправляющий буферы символов с использованием сокета tcp с boost asio на OSX. Когда я использую буфер размером более 256 КБ, я получаю ошибку доступа к памяти. Кажется, это происходит на стороне сервера. Но, тем не менее, точно такой же код с большими размерами буфера, чем 256 КБ, отлично работает на Windows!

GDB на OSX говорит мне

Program received signal EXC_BAD_ACCESS, Could not access memory.
Reason: KERN_INVALID_ADDRESS at address: 0x00000001002bebb8
[Switching to process 15955 thread 0x2003]
0x0000000100012920 in connectionThread::operator() ()

Мне интересно, есть ли какая-то специфическая проблема выделения памяти для ОС, о которой я должен знать. Поддержка документов Asio не очень помогала.

Я не хочу разбивать буфер! Я хочу отправить весь буфер, который может иметь размер до 921600 байт. Который уже отлично работает на Windows с Boost Asio.

Сообщение

char data[307200];

На стороне клиента ОТПРАВИТЬ msg

void send( boost::asio::ip::tcp::socket& s ) const {
    try {
        boost::asio::write( s, boost::asio::buffer( data, data_size));
    }
    catch( std::exception e ) {
        throw std::runtime_error("message send error | " + std::string( e.what() ) );
    }
}

Серверная ЧТЕНИЕ msg

void read( boost::asio::ip::tcp::socket& s ) {
    try {
        // Read data
        boost::asio::read( s, boost::asio::buffer( &data, data_size ));
    }
    catch( std::exception e ) {
        throw std::runtime_error( "message read error | " + std::string( e.what() ) );
    }
}

трассировка

    Program received signal EXC_BAD_ACCESS, Could not access memory.
Reason: KERN_INVALID_ADDRESS at address: 0x00000001002bebb8
[Switching to process 17916 thread 0x2003]
0x0000000100012920 in connectionThread::operator() ()
(gdb) backtrace
#0  0x0000000100012920 in connectionThread::operator() ()
#1  0x000000010000679d in boost::_mfi::mf1<void, connectionThread, boost::shared_ptr<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::stream_socket_service<boost::asio::ip::tcp> > >&>::operator() ()
#2  0x00000001000068ca in boost::_bi::list2<boost::_bi::value<connectionThread*>, boost::_bi::value<boost::shared_ptr<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::stream_socket_service<boost::asio::ip::tcp> > > > >::operator()<boost::_mfi::mf1<void, connectionThread, boost::shared_ptr<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::stream_socket_service<boost::asio::ip::tcp> > >&>, boost::_bi::list0> ()
#3  0x000000010000690a in boost::_bi::bind_t<void, boost::_mfi::mf1<void, connectionThread, boost::shared_ptr<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::stream_socket_service<boost::asio::ip::tcp> > >&>, boost::_bi::list2<boost::_bi::value<connectionThread*>, boost::_bi::value<boost::shared_ptr<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::stream_socket_service<boost::asio::ip::tcp> > > > > >::operator() ()
#4  0x0000000100006928 in boost::detail::thread_data<boost::_bi::bind_t<void, boost::_mfi::mf1<void, connectionThread, boost::shared_ptr<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::stream_socket_service<boost::asio::ip::tcp> > >&>, boost::_bi::list2<boost::_bi::value<connectionThread*>, boost::_bi::value<boost::shared_ptr<boost::asio::basic_stream_socket<boost::asio::ip::tcp, boost::asio::stream_socket_service<boost::asio::ip::tcp> > > > > > >::run ()
#5  0x000000010006b699 in thread_proxy (param=<value temporarily unavailable, due to optimizations>) at libs/thread/src/pthread/thread.cpp:121
#6  0x00007fff8094cfd6 in _pthread_start ()
#7  0x00007fff8094ce89 in thread_start ()
(gdb) 

Спасибо за любые идеи

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...