2010-08-25 10 views
5

Ho cercato risposte in rete ma non riesco a trovare una risposta completa.boost :: asio - Chiarimento sull'associazione a un'interfaccia di rete specifica

Scenario: ho un'API client e un server. Un'applicazione utilizza l'API del client per comunicare con il server. Sia TCP che UDP vengono utilizzati per comunicare tra l'API client e il server. Tutto questo è stato scritto usando ASIO.

L'API del client si collega al server tramite TCP, quindi invia i comandi via TCP e riceve le risposte via TCP. L'API client ascolta anche un indirizzo UDP dove riceve continuamente dati in tempo reale.

L'ambiente è un mix di macchine che eseguono WIN32 e WIN64. Tutte le macchine hanno anche 2 schede di rete.

Domanda: Mi piacerebbe poter "collegare" le mie connessioni TCP e UDP a specifiche interfacce di rete locali. Ho visto alcune informazioni che trattano l'opzione socket SO_BINDTODEVICE e la funzione di bind da post precedenti o altri siti.

È possibile farlo nell'ambiente WIN32/64? Se potessi fare un po 'di luce su questo, alcuni esempi, o siti che sono utili, lo apprezzerei molto.

link che ho trovato:

  1. Using Linux, how to specify which ethernet interface data is transmitted on
  2. http://tuxology.net/2008/05/15/forcing-connections-through-a-specific-interface/
+0

non era evidente per me se hai provato a legare il tuo "accettabile" r' obietta uno specifico 'endpoint' usando uno dei costruttori sovraccaricati. Hai provato? –

+0

Sam - Non ho provato il costruttore sovraccaricato. Ci proverò stasera e ti faccio sapere. Sembra che dovrebbe fare il trucco per un server TCP. Spero di farlo anche per un client tcp, un client udp e un server udp. Se sono possibili Posso usare anche il metodo bind? Grazie, pubblicheremo il risultato. – skimobear

+0

Ho postato una risposta qui sotto con un codice di esempio, provatelo e fatemelo sapere. –

risposta

8

è possibile associare a un endpoint specifico utilizzando l'apposito tcp::ip::acceptorconstructor

include <boost/asio.hpp> 

int 
main() 
{ 
    using namespace boost::asio; 
    io_service service; 
    ip::tcp::endpoint ep(
      ip::address::from_string("127.0.0.1"), 
      1234 
      ); 
    ip::tcp::acceptor acceptor( 
      service, 
      ep 
      ); 
} 
+0

Sam, l'ho provato e funziona perfettamente. Grazie. – skimobear