PDA

View Full Version : [C] errore su setsockopt()


Teo@Unix
12-12-2009, 15:10
Ciao,
ho un problemino con la chiamata setsockopt() per impostare l'opzione SO_REUSEADDR, scopo di questa č evitare che il mio server non possa effettuare la bind() successiva nel caso un altro processo stia usando lo stesso indirizzo locale...

innanzi tutto il codice:

struct sockaddr_in Addr;
int Mysocket, flag_ok = 1;
if(Mysocket = socket(AF_INET,SOCK_STREAM,0) == -1)
{
fprintf(stderr, "Listen_toLocalPort: socket() failed.\n");
exit(1);
}
if(setsockopt(Mysocket,SOL_SOCKET,SO_REUSEADDR,(char *)&flag_ok,sizeof(flag_ok)) < 0)
{
fprintf(stderr, "Listen_toLocalPort: setsockopt() failed.\n");
GoToSetsockoptError();
close(Mysocket);
exit(1);
}

l'uso che faccio mi sembra corretto, errno non assume nessun valore interpetabile...

putroppo impostare quella opzione č piuttosto importante. Sapete darmi un consiglio? Grazie.

cionci
12-12-2009, 15:57
Ciao,
ho un problemino con la chiamata setsockopt() per impostare l'opzione SO_REUSEADDR, scopo di questa č evitare che il mio server non possa effettuare la bind() successiva nel caso un altro processo stia usando lo stesso indirizzo locale..
Non fa proprio questo. Serve a fare in modo che in caso di crash del programma che usava una certa porta (ad esempio il tuo), la porta sia subito disponibile per essere riusata in listen (ad esempio sempre dal tuo programma).
Un uso tipico č un demone che monitora un processo che fa da server, se questo si pianta il demone ha il compito di far ripartire il programma. Se non settassi quell'opzione il programma non sarebbe in grado di rimettersi in listen sulla porte per un certo tempo definito dal sistema.

Comunque mi sembra corretto. Togli il casta a char *, non serve.

cionci
12-12-2009, 16:01
Attenzione !!!

if(Mysocket = socket(AF_INET,SOCK_STREAM,0) == -1)

Teo@Unix
12-12-2009, 16:28
Thank you, stupido errore di parentesi.... mo funziona infatti :stordita:

in quanto all'uso:
ho notato che se ho un'altro processo che stą utilizzando un indirizzo locale la bind() che faccio torna errore, precisamente EADDRINUSE.... sapevo che se l'opzione SO_REUSEADDR č settata ad 1 io posso rieffettuare bind()
... o mi stą sfuggendo qualcosa?

cionci
12-12-2009, 16:30
Se tenti di andare in listen sullo stessa coppia indirizzo:porta č normale e continuerą a farlo sempre fin quando la coppia č utilizza in listen da una applicazione.