PDA

View Full Version : [C] - Errore nel binding


clockover
20-12-2009, 13:04
Sto imparando la programmazione di rete in ambiente Unix!

Ho creato un programma server che crea una socket e successivamente cerca di associarla ad un indirizzo!
questo è un pezzo del codice
//creazione socket server
sock_ds = socket(PF_INET, SOCK_STREAM, 0);
if(sock_ds == -1)Error_("Errore creazione socket");

//creazione e associazione ad indirizzo
struct sockaddr_in my;
my.sin_family = AF_INET;
my.sin_port = 60000;
inet_pton(AF_INET, "192.168.1.4", &my.sin_addr.s_addr);

if(bind(sock_ds, (struct sockaddr*)&my, sizeof(my)) == -1)Error_("Errore binding server");

//messa in ascolto del server
if(listen(sock_ds, 3) == -1)Error_("Errore ascolto del server");

//struttura del client
struct sockaddr_in client;
int client_dim = sizeof(client);
int client_ds;

il problema sorge quando termino il server e successivamente vado a riavviarlo! Risultato della chiamata bind() è -1! Questa cosa mi succede anche con il client: dopo aver contattato il server, eseguito le operazioni che volevo eseguire, e successivamente uscito, non sono più in grado di far riuscire la bind() per un certo tempo! Non riesco a venirne a capo! Ci sono suggerimenti?

Ho fatto anche altre prove! Dato che al -1 della chiamata bind() uscivo con la macro Error_, ho semplicemente inserito un puts("Errore bind"); e poi continuato ad eseguire il programma! Funziona correttamente! Cioè non c'è nessun problema dato che la comunicazione funziona!

maulattu
20-12-2009, 13:46
domanda scema: chiudi il socket "sock_ds" quando termini il server?
ocio: durante la stessa esecuzione del server, la bind va eseguita una e una sola volta.
in sostanza uno pseudo codice è:

sock = socket(...)
bind
listen
while ((sock_client = accept(...)) != -1)
{
gestisci creazione del client (processo/thread)
}

clockover
20-12-2009, 14:43
Porca miseria mi sono dimenticato... :muro: :muro: :muro: che cretino.... ecco perchè poi il client mi funzionava bene poi... perchè chiudevo il descrittore alla fine!

Rimanendo in tema avrei ancora un paio di dubbi in materia:
1) usando la macro INADDR_ANY per l'assegnazione dell'indirizzo, quale indirizzo assegno in realtà? L'indirizzo di localhost oppure quello di eth0?
2) Lato client vorrei usufruire di una ephemeral port. Nella specifica della sin_port dovrei mettere il valore 0 giusto?

Ragazzi se mi vengono altri dubbi non abbiate paura.. chiederò ancora :D :D