Как мне сопоставить коды ошибок системы Windows с boost :: error_condition? - PullRequest
1 голос
/ 02 августа 2011

В приведенном ниже коде я хотел бы заменить ошибку Windows WinSock WSAEINTR = 10004 на общий код ошибки системного буста, но как мне сопоставить код, обнаруженный в отладчике, с общими перечислениями?

timeout_.expires_from_now(posix_time::seconds(15));
timeout_.async_wait( boost::bind(&cancel_socket_fn,this,_1) );
asio::streambuf rd_buf;
unsigned length = read_until( socket_, rd_buf,delimiter_string, error );
timeout_.cancel();

if(error) 
{
    // how do I make this portable?
    if(error.value()==WSAEINTR) throw request_timeout_exception()
    else throw my_asio_exception(error,"Unable to read header");
}

...

cancel_socket_fn(system::error_code e) { socket_.cancel(); }

1 Ответ

0 голосов
/ 06 октября 2011

if (ошибка == boost :: asio :: error :: прерывается) ...

И я думаю, что здесь есть ошибка проектирования, потому что, если этот код вызывается из потока, где вызывается io_service :: run () (или подобного), то метод cancel_socket_fn () не будет вызываться до тех пор, пока read_until () не завершится. Или, если они находятся в разных потоках, возникают проблемы с синхронизацией, поскольку методы таймера не являются поточно-ориентированными.

...