TCP bind gond (Megoldva)

Fórumok

Sehol nem találtam rá, és már lövésem sincs, hogy mi lehet a gond.
létrehozok egy tcp servert, amit hozzárendelek egy porthoz, eddig szép és jó is. ha ilyenkor lezárom egy

close(sucket);

segítségével újra tudom indítani. Viszont, ha már valaki csatlakozik ehhez a serverhez, és ezt lezárom egy close-al, mejd a servert szintén eggyel, akkor a következő hibaüzenetet kapom újraindításkor: Address already in use
Egy kis idő múlva persze megint engedi.
Hogy tudom lezárni úgy a servert, hogy az újraindítás simán menjen?

Hozzászólások


 servsock=socket(PF_INET,SOCK_STREAM,IPPROTO_TCP);
 i=1;
 setsockopt(servsock,SOL_SOCKET,SO_REUSEADDR,(void *)&i,sizeof(int));
 bind(servsock,...)
 listen(servsock,...)

(lenyeg a SO_REUSEADDR)

aktívan használja
Csak annyit tesz, hogy a megf. portot egy adott afamily+proto pa'roshoz hozzarendelte valaki. Peldaul lehet bind()-olni akar 32k-nal nagyobb portokra is, de ha azon eppen kimeno" (kliens) forgalom zajlik, akkor az a bind sem fog sikerulni, annak ellenere, hogy szerver-jellegu" alkalmaza's nem fogja. Ha a listen()-t bind() nelkul hivod meg akkor a kernel allit be egy portot maganak, ami epp szabad [elso ranezesre nincs sok ertelme, bar hogyha csak "temporary socket"-et csinalsz, IPC celokbol, akkor teljesen jo, majd getsockaddr() hivassal visszakered a port sza'ma't es ezt adod a't a klienseknek].

De valoban, ha a bind() nem sikerul, akkor az adott port mar foglalt (fuggetlenul attol hogy a ahhoz a szerverhez csatlakozott-e valaki vagy sem); vagy az adott cimhez nem tartozik helyi interface (ha nem INADDR_ANY-t adsz meg, hanem barmi mast).