TCP bind gond (Megoldva)

 ( kaltsi | 2008. április 25., péntek - 17:59 )

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ás megjelenítési lehetőségek

A választott hozzászólás megjelenítési mód a „Beállítás” gombbal rögzíthető.

 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)

Nekem is hasonló problémám van zOS-en. Kérdésem, hogy amennyiben a listen port ténylegesen foglalt, tehát egy másik process aktívan használja, akkor mi történik? lefut sikeresen a bind() és hibával elszál a korábbi listen socket, vagy a bind() dob egy hibát?

Ha egy másik process bindol arra a portra, akkor az már az övé. Csak a te programodban fog ez hibát okozni (a te bind hívásod tér vissza hibajelzéssel), a másik processz nem is értesül az egészről.

--
The Net is indeed vast and infinite...
http://gablog.eu

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).

Köszi, ezen valahogy átsiklottam, de működik rendesen...