Dom 18 Agosto, 06:37:07 - 2019

Autore Topic: Dubbio sull'assegnazione dell'indirizzo ip ad una socket  (Letto 627 volte)

0 Utenti e 1 Visitatore stanno visualizzando questo topic.

Offline Parseval

  • Studente
  • *
  • Post: 36
  • FeedBack: +1/-0
    • Mostra profilo
Dubbio sull'assegnazione dell'indirizzo ip ad una socket
« il: Gio 26 Gennaio, 14:52:32 - 2017 »
Ragazzi ho un dubbio... quando vado a preparare la struct sockaddr_in per eseguire la bind di un socket...
nel campo sin_addr.s_addr va inserito l'ip che voglio assegnare alla socket o gli ip accettati per le connessioni entranti... Io credevo che fosse il sistema operativo ad assegnare l'indirizzo ip alla socket durante la bind. Su internet trovo affermazioni discordanti.

Offline ConanDoyle

  • Studente
  • *
  • Post: 11
  • FeedBack: +2/-0
  • You know my methods, Watson.
    • Mostra profilo
Re:Dubbio sull'assegnazione dell'indirizzo ip ad una socket
« Risposta #1 il: Gio 26 Gennaio, 21:48:10 - 2017 »
Nel campo sin_addr.s_addr devi inserire l'indirizzo della scheda di rete (detta interfaccia di rete) presente nella macchina dalla quale tu vuoi accettare le connessioni entranti, in ambito server infatti potresti aver necessità di accogliere connessioni solo da una determinata interfaccia. Se tu assegni a questo campo la macro INADDR_ANY, nel momento in cui farai listen, la socket accoglierà connessioni entranti da tutte le interfacce di rete presente nel sistema, che puoi verificare, per esempio, con il comando ifconfig sul terminale:

Codice: [Seleziona]
eth0      Link encap:Ethernet  HWaddr b8:ac:6f:65:31:e5 
          inet addr:192.168.2.100  Bcast:192.168.2.255  Mask:255.255.255.0
          inet6 addr: fe80::baac:6fff:fe65:31e5/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:2697529 errors:0 dropped:0 overruns:0 frame:0
          TX packets:2630541 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:2159382827 (2.0 GiB)  TX bytes:1389552776 (1.2 GiB)
          Interrupt:17

lo        Link encap:Local Loopback 
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:2849 errors:0 dropped:0 overruns:0 frame:0
          TX packets:2849 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:2778290 (2.6 MiB)  TX bytes:2778290 (2.6 MiB)

Come puoi vedere l'indirizzo classico a cui si fa connettere l'applicazione client è 127.0.0.1, ovvero l'indirizzo dell'interfaccia di loopback che ogni sistema possiede. In questo esempio se volessi accogliere connessioni solo dall'esterno della tua macchina, connessa per esempio con ethernet, dovresti specificare nella struct sockaddr_in inet_addr("192.168.2.100"), ovvero l'inet_addr dell'interfaccia eth0 che guardacaso è l'indirizzo che l'interfaccia possiede nella rete locale.

Tieni presente inoltre che puoi venire a conoscenza dell'indirizzo ip del cliente che ha eseguito una connect verso il tuo server solo nel momento in cui la accept avrà riempito la struttura sockaddr e solo in quel momento puoi effettuare un vero "filtro" degli ip entranti.

Ciò che il sistema operativo assegna randomicamente, in base alla disponibilità, è la porta della nuova socket creata dalla accept dopo una connect avvenuta con successo. Ovvero la porta attraverso la quale il server può realmente comunicare con il client perché la porta originaria su cui hai precedentemente eseguito una bind e poi una listen non può affatto essere usata per la comunicazione, perché bloccata.
« Ultima modifica: Gio 26 Gennaio, 21:55:02 - 2017 da ConanDoyle »
"How often have I said to you that when you have eliminated the impossible, whatever remains, however improbable, must be the truth?"
Sherlock Holmes in "The Copper Beeches" (Doubleday p. 323)

Offline Parseval

  • Studente
  • *
  • Post: 36
  • FeedBack: +1/-0
    • Mostra profilo
Re:Dubbio sull'assegnazione dell'indirizzo ip ad una socket
« Risposta #2 il: Ven 27 Gennaio, 13:38:21 - 2017 »
Grazie Conan: una risposta davvero esauriente!