2016-04-13 17 views
1

4 Ethernet Arabirimi (ensf1s1, ensf1s2, ensf1s3, ensf1f4) ve GNAT.Sockets kullanarak bir makinem var. Her bir arabirim üzerinden veri gönderip alabilmem gerekiyor.Ada GNAT.Sockets çoklu ethernet adaptörlerini gönderir mi?

kullanıyorum kodu 192.168.1 olarak yapılandırılmış IP adresleri ile

Create_Socket(SendFrom1, Family_Inet, Socket_Datagram); 
Create_Socket(SendFrom2, Family_Inet, Socket_Datagram); 
... 
Bind_Socket(SendFrom1, SendFrom1Address); 
Bind_Socket(SendFrom2, SendFrom2Address); 
... 
Channel1 := Stream(SendFrom1, SendToAddress1); 
Channel2 := Stream(SendFrom2, SendToAddress2); 
... 

olduğunu. (101/102/103/104) Ben doğru belirtilmiş Kaynak ile tek bir arayüzden üzerinden gönderilen tüm mesajları alıyorum ve paketteki Hedef IP'leri.

Aynı alt ağda birden fazla NIC'ye sahip olmanın bazı işletim sistemlerinde bir soruna neden olabileceğinden, 255.255.0.0 alt ağ maskesi ile 192.168.1.101, 192.168.2.102 vb. Değiştirdiğimi başka bir soruda okuyorum. Aynı kodu kullanarak Adresleri düzelttikten sonra, yalnızca daha önce tüm mesajları gönderen, ancak başka hiçbir şey iletmeyen arabirim için gönderilen verileri gönderir. 3.

Soket yapılandırmasında bir Soket'in bağdaştırıcıya bağlandığından emin olmak için bir şey özledim mi? SendFromAddress belirtilen? İlgili ise işletim sistemi RHEL 7'dir.

+0

Bu değiştirilen adresler yalnızca alt ağ maskesi 255.255.255.0 ise farklı alt ağlarda olabilir. –

cevap

0

Sorunuz, yuvaların nasıl çalıştığına bağlıdır.

Soketinizi belirli bir adrese bağlarsanız, yalnızca bu hedef adres için paketler alırsınız. Dört arabiriminizden herhangi birinden paket almak için INADDR_ANY adresine bağlayabilirsiniz. Bunu aşağıdaki şekilde yapacağız:

Address  : GNAT.Sockets.Sock_Addr_Type; 
SendFromAll : GNAT.Sockets.Socket_Type; 
    ... 
    Address.Port := 0; -- Or whatever fixed port you like 
    Address.Addr := GNAT.Sockets.Any_Inet_Addr; 
    GNAT.Sockets.Bind_Socket (SendFromAll, Address); 

bu uygulamayı kullanarak, SendFromAll soket herhangi arayüzünden verileri alacaktır. Receive_Socket ile gönderen adresini alabilirsiniz. Ardından, SendFromAll soketini kullanarak veriyi istemciye geri gönderdiğinizde, sistem hedef adrese ve ağ yönlendirme tablolarına bağlı olarak bir arabirim seçecektir. Linux'ta, yönlendirme politikasına (ip kuralı) ve yönlendirme tablolarına (ip yolu) bağlı olacaktır. Eğer gerçekten bir arayüze bir soket bağlamak gerekiyorsa

Client : GNAT.Sockets.Sock_Addr_Type; 
Buffer : Ada.Streams.Stream_Element_Array (0 .. 8192); 
Last : Ada.Streams.Stream_Element_Offset; 
.... 
    GNAT.Sockets.Receive_Socket (SendFromAll, Buffer, Last, Client); 
    GNAT.Sockets.Send_Socket (SendFromAll, Buffer (Buffer'First .. Last), Last, Client); 

Şimdi şu arabiriminin IP adresini almak gerekir. Birkaç arayüzünüz varsa, kendi IP adreslerini almanız gerekir. Bunu yapmak için GNAT.Sockets ile kolay bir yol yoktur. Get_Host_By_Name işlevini kullanabilirsiniz, ancak her arabirim için farklı adlar ayarlamanız gerekir (aksi halde her yuva için aynı IP'yi alırsınız).

GNAT.Sockets ile mümkün olmayan başka bir yöntem de SO_BINDTODEVICE soketi seçeneğini kullanmaktır. Soketi arayüz adına bağlarsınız (IP'yi almanıza gerek yoktur).

Sizin için ne olabilir, her Bind_Socket numaralı çağrı için aynı IP adresini kullanmanızdır.

İlgili konular