Portál AbcLinuxu, 13. července 2025 03:54
socket, bind, listen
.socket, connect
Řešení dotazu:
accept()
), i když (zrovna v tomto konkrétním případě) ho poté případně odmítneš okamžitým close()
? Tím chci říct, že když se spojení nakonec stejně acceptne, je asi optimální si s klientem začít povídat (poslat potvrzující paket) hned a nečekat na ten accept.
BTW. v manuálové stránce accept(2) je zmínka, že protokolem vyžadujícím explicitní potvrzení přijetí je třeba DECNet - z toho bych vyvozoval, že se to u TCP chová spíše tak, jak naznačuji.
Je toto chovani normalni?Pokud vím, tak toto chování neporušuje specifikované chování ani jedné z vyjmenovaných funkcí ani protokolu TCP. Fyzicky se děje to, že connect naváže spojení na úrovni TCP a write někam do toho spojení zapíše data (která pak zůstanou viset v nějakém bufferu buď na klientovi nebo na serveru). To ale ničemu nevadí. Podle specifikace se můžete spolehnout pouze na to, že server z těch dat nepřečte ani bajt, dokud nezavolá accept (navázání spojení na obou stranách) a že pokud klient poslal nejprv A a pak B, tak server který přečetl B tak také před tím přečetl A (proudové chování).
Da se mu nejak zabranit?Nevím o tom a hlavně byste se o to neměl pokoušet. Pokud potřebujete nějak synchronizovat klienta se serverem tak si na to udělejte nějaký mechanizmus nad tím TCP (posílejte si synchronizační zprávy).
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.