» »

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:
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...:)

5er--> ::

Ni rešitev, ampak mogoče bi ti pomagal Virtualbox?

TomiL ::

Hmm, sem poizkušal tudi s Sunovim VB, ampak mi je vseeno naredilo loopback. :/

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:D 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 ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

dnsmasq problem

Oddelek: Omrežja in internet
121867 (1607) poweroff
»

OpenWRT in OpenVPN (strani: 1 2 )

Oddelek: Omrežja in internet
7910306 (8166) BivšiUser2
»

Win 7 routing dveh mrežnih kartic

Oddelek: Omrežja in internet
61641 (1537) Spc
»

Ubuntu in adsl

Oddelek: Operacijski sistemi
202315 (2031) gregs
»

Linux računalnik - router / 2. mrežna ne obstaja?

Oddelek: Omrežja in internet
91643 (1562) Brane2

Več podobnih tem