Creazione di più socket su un client

Ho una situazione in cui un client deve essere connesso a più server. In base alla domanda qui risolta: Connessione a più server da un singolo client socket C

Avrei bisogno di creare un singolo socket per connettersi a tutti i server. Quello che sto cercando di chiedere è: c’è un modo più efficiente per fare questo oltre a ripetere questo pezzo di codice per creare più socket? grazie molto!

//Create a socket for the client //If sockfd<0 there was an error in the creation of the socket if ((sockfd = socket (AF_INET, SOCK_STREAM, 0)) <0) { perror("Problem in creating the socket"); exit(2); } //Creation of the socket memset(&client1addr, 0, sizeof(client1addr)); client1addr.sin_family = AF_INET; client1addr.sin_addr.s_addr= inet_addr(argv[1]); client1addr.sin_port = htons(SERV_PORT); //convert to big-endian order //Connection of the client to the socket if (connect(sockfd, (struct sockaddr *) &client1addr, sizeof(client1addr))<0) { perror("Problem in connecting to the server"); exit(3); } 

Il problema di base nel tentativo di riutilizzare lo stesso socket per diverse connessioni è che una connessione socket deve memorizzare non solo la parte locale della connessione (host e numeri di porta) ma anche quelli remoti (host remoto e porta remota) Lo scopo di questo info è di raggiungere il socket corretto quando alcuni pacchetti di dati arrivano a un host, è necessario selezionare il socket giusto basato solo sul contenuto del pacchetto e nient’altro. Quindi, provare a connettere lo stesso socket a diverse postazioni remote non è ansible con un solo socket. Normalmente il problema qui è che si pensa a un socket come a qualcosa di ideale che potrebbe essere il modo in cui i nostri bisogni dettano invece di qualcosa che deve obbedire alle regole del protocollo. Un socket collegato deve definire queste quattro quantità e una volta assegnato (questo significato una volta connesso) non è ansible farlo sovrapporre più connessioni.

A proposito, la creazione di socket è qualcosa che è stato ottimizzato per cui ottenere un nuovo socket è economico in termini di risorse.

Se anche questa soluzione non è conveniente, hai la possibilità di passare a un protocollo senza connessione (come udp) in cui un socket è pronto a ricevere pacchetti non appena lo hai collegato a un indirizzo host e a una porta client, in modo che possa ricevere qualsiasi pacchetto diretto a quell’indirizzo IP e alla porta. In questo modo, puoi gestire i dati provenienti da fonti diverse con un solo socket (ad esempio, questo è stato utilizzato in molti protocolli p2p), ma dovrai gestire da solo i pacchetti abbandonati, ripetuti e modificati in transito.