Forum » Programiranje » Winsock knjižnica
Winsock knjižnica
TomiL ::
Na računalniku imam 2 aplikaciji (2x .exe, oba programa sta spisana v C++ okolju), ki služita kot server-client par ter komunicirata preko TCP protokola. Sedaj želim, da bi lahko oba programa poganjal kar lokalno na istem računalniku (ki ima 2x NIC) in sicer tako, da bi na enem NIC pošiljal podatke (ti potem gredo preko enega simulatorja)in na drugem NIC sprejemal.
Pojavi se problem, ker (zaradi routinga) TCP paketi naredijo loop na loopback vmesniku (v Wiresharku mi ne pokaže prometa na NICih). Oba programa sta spisana v C++ okolju, sedaj pa me zanima naslednje:
-uspelo mi je, da mi server posluša prihajajoče povezave samo na eni network kartici z kodo:
Problem nastane pri programu, ki pošilja, saj se v primeru da nastavim lasten IP kot ponorni IP le-tega PC samostojno prepozna kot svojega in ne spelje prometa iz NICa. Na internetu sem našel, da se lahko nastavi setsockopt:
..in tale post, ki pa je za Linux: post (SO_BINDTODEVICE ni veljaven za Win32 oz. vsaj meni ne deluje v Expressu C++ 2010). Je že kdo reševal podoben problem?
Hvala za vsak info!
Lp
Pojavi se problem, ker (zaradi routinga) TCP paketi naredijo loop na loopback vmesniku (v Wiresharku mi ne pokaže prometa na NICih). Oba programa sta spisana v C++ okolju, sedaj pa me zanima naslednje:
-uspelo mi je, da mi server posluša prihajajoče povezave samo na eni network kartici z kodo:
server.sin_addr.s_addr = inet_addr(IPnaslov)
Problem nastane pri programu, ki pošilja, saj se v primeru da nastavim lasten IP kot ponorni IP le-tega PC samostojno prepozna kot svojega in ne spelje prometa iz NICa. Na internetu sem našel, da se lahko nastavi setsockopt:
int setsockopt( __in SOCKET s, __in int level, __in int optname, __in const char *optval, __in int optlen );
..in tale post, ki pa je za Linux: post (SO_BINDTODEVICE ni veljaven za Win32 oz. vsaj meni ne deluje v Expressu C++ 2010). Je že kdo reševal podoben problem?
Hvala za vsak info!
Lp
DuleKrtola ::
Zakaj pa bi rad pošiljal iz enega NICa in prejemal na drugega? There is no place like 127.0.0.1
TomiL ::
DuleKrtola, gre se za en emulator omrežja, ki ga je potrebno testirat in želel bi spravit promet skozi njega in imeti vso logiko (upravljanje povezav in nadzor) na enem PC...:)
fiction ::
Po defaultu mislim, da je implicitno najboljša pot za destination IP, ki ga maš assignan (na poljubnem interfacu) na mašini loopback adapter. Ampak lahko pa sam dodaš novo routo z boljšo metriko. Boš pa moral paziti, da tudi na pravi kartici pošiljaš (bind sending socketa na IP, ki ga ima željena kartica). Če povsod poslušaš, pomoje niti ne bi smelo biti problematično.
TomiL ::
OK,mi je uspelo urediti:
Izklopil SW (v CMD z 'route' komando) in HW loopback (v omrežnih nastavitvah) na obeh NIC-ih, strežniški SW nastavil, da posluša samo na enem interface-u ter naredil statične route v CMD (route ADD [IP_kamor_posiljam] MASK 255.255.255.255 [gateway] IF [interface_iz_katerega_se_naj_poslje]).
Vseeno hvala vsem za nasvete in pomoč!
Lp
@fiction:
si me za las prehitel s postom Sem naredil tako kot si tudi ti predlagal, Thx! Sem pa pozabil omeniti: metriko je treba nastaviti na najmanjšo (=najvišja prioriteta) oz. nižjo kot jo ima default routa ALI pobrisati default route (v mojem primeru: 'loopback' z metriko 1); če se NE UPORABI dodatnih stikal (-p 'permament') se ob resetu PC statične route pobrišejo.
Lp
Izklopil SW (v CMD z 'route' komando) in HW loopback (v omrežnih nastavitvah) na obeh NIC-ih, strežniški SW nastavil, da posluša samo na enem interface-u ter naredil statične route v CMD (route ADD [IP_kamor_posiljam] MASK 255.255.255.255 [gateway] IF [interface_iz_katerega_se_naj_poslje]).
Vseeno hvala vsem za nasvete in pomoč!
Lp
@fiction:
si me za las prehitel s postom Sem naredil tako kot si tudi ti predlagal, Thx! Sem pa pozabil omeniti: metriko je treba nastaviti na najmanjšo (=najvišja prioriteta) oz. nižjo kot jo ima default routa ALI pobrisati default route (v mojem primeru: 'loopback' z metriko 1); če se NE UPORABI dodatnih stikal (-p 'permament') se ob resetu PC statične route pobrišejo.
Lp
Zgodovina sprememb…
- spremenil: TomiL ()
fiction ::
Oz. se popravljam, z bind() samo določiš izvorni IP (je pa to vseeno važno). Kater bo izvoren interface je pa ravno to kar rešuje SO_BINDTODEVICE, ki ga pa na Winsih nimaš. Drugače se uporabi pomoje tisti vmesnik preko katerega obstaja najboljša pot do cilja, source IP je pa lahko z drugega vmesnika.
Vredno ogleda ...
Tema | Ogledi | Zadnje sporočilo | |
---|---|---|---|
Tema | Ogledi | Zadnje sporočilo | |
» | dnsmasq problemOddelek: Omrežja in internet | 1857 (1597) | poweroff |
» | OpenWRT in OpenVPN (strani: 1 2 )Oddelek: Omrežja in internet | 10300 (8160) | BivšiUser2 |
» | Win 7 routing dveh mrežnih karticOddelek: Omrežja in internet | 1641 (1537) | Spc |
» | Ubuntu in adslOddelek: Operacijski sistemi | 2315 (2031) | gregs |
» | Linux računalnik - router / 2. mrežna ne obstaja?Oddelek: Omrežja in internet | 1642 (1561) | Brane2 |