2013-10-23 52 views
0

有沒有辦法允許在ASIO中使用已連接的套接字?如何在Boost.ASIO中分配已連接的本地套接字類型(TCP)

試圖發送一個請求; ip::tcp::socket::assign在2個不同的地方隨機給出2個不同的段錯誤。其中之一是在回撥之前(op_queue_acess::next),其他回撥之後(boost::asio::detail::task_io_service_operation::complete(func_等於0並嘗試執行))。所以我想它不適用於連接的套接字。

編輯:

的情況是,我有一個連接的本地描述符(實際上是在另一個庫下方的插槽),我想將其分配到一個新的空IP :: TCP ::插座等等,我可以在套接字準備好時使用read(使用帶有空緩衝區的socket::async_read_some)並以非阻塞方式使用該庫。

示例代碼如下爲:

class C 
{ 
ip::tcp::socket socket_; 
const char connection_info_[] = "..."; 
TPLibrary tp_; 

void start() 
{ 
    . 
    . 
    tp_.connect(connection_info); 
    socket_.assign(ip::tcp::v4(), tp_.nativeSocket()); 
} 
} 

然後使用這個插座上async_read給人的說賽格故障,有時其調用回調,有時之前後。

編輯: 現在我已經刪除了所有內容,只有tcp :: socket和分配給套接字,但仍然提供給segfaults。是否因爲io_service位於動態加載的庫上,並且套接字位於另一個動態加載的庫中,並且引用了主庫上的io_service?

+0

你的問題不清楚。你有一個現有的本地描述符,你想分配給一個已經連接的'boost :: asio :: ip :: tcp :: socket'? –

+0

@SamMiller我編輯了這個問題。 – Etherealone

+0

有一個[示例](http://www.boost.org/doc/libs/1_54_0/doc/html/boost_asio/example/cpp03/nonblocking/third_party_lib.cpp),顯示了Asio文檔中包含的reactor風格操作。 SO上也有[類似](http://stackoverflow.com/questions/4686127/async-wait-on-file-descriptor-using-boost-asio/4686523#4686523)問題。請在您的問題中包含您的代碼,以便我們提供幫助。 –

回答

0

問題是關於我正在使用的動態鏈接。作爲對tcp::socket::assign問題的回答,在連接的套接字上工作正常。

1

您可以將已連接的套接字分配給boost :: asio套接字,然後享受增強功能。

從下面的鏈接你可以找到如何使用assign API。

http://www.boost.org/doc/libs/1_54_0/doc/html/boost_asio/reference/basic_stream_socket/assign/overload1.html

讓我知道如果您有任何疑問。

編輯:

現在,如果你的問題是關於非閉塞讀爲async_read_some是非阻塞然後使用read_some如下

boost::asio::async_read(*p_socket, boost::asio::buffer(&buffer[index], remaining_len2read), read_handler); 

上述API被攔截並不會返回,直到所有的數據被接收。

+0

我確實使用它,它給ASIO功能上的segfaults我這樣做。我認爲'ASIO連接'不僅僅是連接和分配不夠,這是真的嗎? – Etherealone

+0

這是不正確的,OP希望使用'null_buffers'並讓庫處理從本地套接字讀取數據。 –

+0

是否有特定的原因(@Tolga)正在使用'null_buffers'? –

相關問題