2013-03-25 4 views
0

동일한 부스트 asio UDP 비동기 코드를 사용하는 두 개의 테스트 프로그램 (A & B)이 거의 동일합니다. 로컬 호스트 // 여기부스트 ASIO 및 UDP 오류

void handle_receive(const udp::endpoint recvFromEP, const boost::system::error_code& error,std::size_t bytesRecv/*bytes_transferred*/) 
{ 
    boost::shared_ptr<std::string> message(new std::string(_mRecvBuffer.c_array(),bytesRecv)); 
    if (!error) 
     { 
     doSomeThingGood(); 
     } 
else { 
     cerr << "UDP Recv error : " << error << endl; 
    } 
} 

그래서 여기 무슨 일이야 핸들러에게의

_mSocket.async_receive_from(
      boost::asio::buffer(_mRecvBuffer), _mReceiveEndpoint, 
      boost::bind(&UdpConnection::handle_receive, this,_mReceiveEndpoint, 
      boost::asio::placeholders::error, 
      boost::asio::placeholders::bytes_transferred)); 
// _mReceiveEndpoint is known and good. the buffer is good too. 

모든 :

여기에 수신 호출입니다.

프로그램 'A'를 먼저 시작한 다음 프로그램 'B'를 시작하면 'A'는 UDP Recv 오류 : server : 10061을 제공합니다. 프로그램 'A'는 계속 잘 보냅니다. 'B'는 괜찮습니다.

위의 문장에서 'A'와 'B'를 바꿀 수 있으며 여전히 사실입니다. 내가 다시 mSocket.async_receive_from를 호출하여 나쁜 읽기 조건의 재설정을 시도 할 경우

, 나는 내가 웹에서 이러한 오류를 검토 한 10054.

오류 ..... 매우 도움이되지 얻을.

아무도 이러한 의미가 무엇인지, 그리고이 조건이 발생하면 프로그램 내부에서 어떻게 복구 할 수 있는지에 대한 아이디어가 있습니까? 소켓을 재설정하는 방법이 있습니까?

온 전성 검사 .... 두 프로그램 모두 두 포트만 사용하여 루프백에서 작동 할 수 있습니까? 보내기 = 20000, A는 수신 = 20001 B의 전송 = 20001, B 수신 = 20000

TL; DR이 나타납니다 내가 보내고있다 전에 경청하려고하면, 나는 오류가 발생하지만 & 내가 할 수있는 그것에서 회복하지 못한다. 내가 보낸 후, 나는 괜찮아.

- EDIT - McAfee 호스트 침입 방지 기능이 나에게 불쾌한 짓을하고있는 것으로 보입니다. 만약 VS2010에서 디버깅을하면 DLL에 문제가 생길 수 있습니다.

덕분에 내받을 핸들러에서

+0

: http://stackoverflow.com/questions/4364434/let-two-udp-servers-listen - 같은 - 포트 –

답변

2

, 나는 _mSocket.async_receive_from를 호출되지 않았다() 다시 .... 난 그냥 오류를 인쇄하고 종료.

어리석은 실수. 다른 사람에게 도움이 될 경우를 대비하여 여기에 게시하십시오.

또한 다른 해상도로 비슷한 문제가 발생하는 경우 : _mSocket.set_option (boost :: asio :: socket_base :: reuse_address (true));

은 여러 개의 수신기가있는 경우 도움이됩니다.

0

여러 소스에서 Windows에서 SO_REUSEADDR을 사용해야한다고 설명합니다. 그러나 소켓을 바인딩하는없이 과 함께 UDP 메시지를 수신 할 수 있다는 언급은 없습니다. 아래의 코드는 소켓을 로컬 listen_endpoint에 바인드하는데 필수적이지 않습니다. 왜냐하면 그것 없이는 여전히 UDP 메시지를받을 수 있기 때문입니다.하지만 기본적으로 사용자는 포트의 독점적 인 소유권을가집니다.

그러나 소켓 (또는 TCP 사용시 수락 자)에서 reuse_address (true)를 설정하고 나중에 소켓을 바인딩하면 여러 응용 프로그램 또는 자체 응용 프로그램의 여러 인스턴스에서 다시 수행 할 수 있습니다. 모두가 모든 메시지를 받게됩니다.

// Create the socket so that multiple may be bound to the same address. 
boost::asio::ip::udp::endpoint listen_endpoint(
    listen_address, multicast_port); 

// == important part == 
socket_.open(listen_endpoint.protocol()); 
socket_.set_option(boost::asio::ip::udp::socket::reuse_address(true)); 
socket_.bind(listen_endpoint); 
// == important part == 

boost::array<char, 2000> recvBuffer; 
socket_.async_receive_from(boost::asio::buffer(recvBuffer), m_remote_endpoint, 
     boost::bind(&SocketReader::ReceiveUDPMessage, this, boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred) 

소스 : 분명히 몇 가지 속임수는 두 개의 프로세스 bewteen 포트를 공유 할 수 있습니다 전에 일이 필요 http://www.boost.org/doc/libs/1_45_0/doc/html/boost_asio/example/multicast/receiver.cpp