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?
- 824 megtekintés
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)
- A hozzászóláshoz be kell jelentkezni
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?
- A hozzászóláshoz be kell jelentkezni
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
- A hozzászóláshoz be kell jelentkezni
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).
- A hozzászóláshoz be kell jelentkezni
Köszi, ezen valahogy átsiklottam, de működik rendesen...
- A hozzászóláshoz be kell jelentkezni