Portál AbcLinuxu, 13. července 2025 03:54


Dotaz: socket

17.6.2010 13:57 Sten Fil | skóre: 4
socket
Přečteno: 282×
Odpovědět | Admin
Ahoj,

mam na linuxu client, server TCP komunikaci.



Server Listen socket:

socket, bind, listen.



Client socket:

socket, connect



Neprovadim zadne dodatecne nastaveni setsockopt



1. Server otevre listen socket

2. Pomoci select ceka na pripojeni klienta.

3. Po prichodu pozadavku na spojeni se provadi pred provedenim accept nejake akce na jejichz zaklade dojde k prijmu nebo odmitnuti clienta.



Zajimave je, ze jeste pred provedenim accept na serveru je v klientu uspesne proveden connect i write dat na server.



Je toto chovani normalni?

Da se mu nejak zabranit?



Diky za vase odpovedi.

Řešení dotazu:


Nástroje: Začni sledovat (1) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

Řešení 1× (Sten Fil (tazatel))
17.6.2010 18:20 Messa | skóre: 39 | blog: Messa
Rozbalit Rozbalit vše Re: socket
Odpovědět | | Sbalit | Link | Blokovat | Admin
Mě to nepřijde nenormální. U mě se "to" chová stejně. Nejspíš si server sám začne povídat s tolika klienty, na kolik stačí backlog. Stejně, když nad tím tak přemýšlím, co bys chtěl s klientem dělat jiného než ho přijmout (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.
Řešení 1× (Sten Fil (tazatel))
18.6.2010 18:16 mich | skóre: 16
Rozbalit Rozbalit vše Re: socket
Odpovědět | | Sbalit | Link | Blokovat | Admin
To co popisuješ je chování funkce listen, takže bych řekl, že je to chování normální. Netuším jak tomu zabránit.
je to teď v módě, na žive o tom furt píšou
Řešení 1× (Sten Fil (tazatel))
19.6.2010 11:24 pht | skóre: 48 | blog: pht
Rozbalit Rozbalit vše Re: socket
Odpovědět | | Sbalit | Link | Blokovat | Admin
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).
In Ada the typical infinite loop would normally be terminated by detonation.

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.