Winsock recv - kolik dat je ve vstupní frontě? – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Winsock recv - kolik dat je ve vstupní frontě? – C / C++ – Fórum – Programujte.comWinsock recv - kolik dat je ve vstupní frontě? – C / C++ – Fórum – Programujte.com

 

22. 5. 2013   #1
-
0
-

Dobrý den,

používám recv pro čtení dat ze soketu. Funkce nezaručuje, kolik dat bude ze soketu přečteno a tak často dochází k tomu, že příchozí zprávy (i velmi krátké) čtu po "koukskách". Zatím jsem to řešil tak, že jsem tyto přijaté fragmenty skládal do fronty a zjišťoval, zda už je zpráva celá. Jak zjistím, kolik dat přišlo aniž bych je vyjmul ze vstupní fronty?

hu

Nahlásit jako SPAM
IP: 195.178.67.–
crazy
~ Moderátor
+10
Grafoman
22. 5. 2013   #2
-
0
-
Nahlásit jako SPAM
IP: 147.32.31.–
All you need is vision and time.
zlz
~ Anonymní uživatel
634 příspěvků
22. 5. 2013   #3
-
+1
-
Zajímavé

ioctlsocket FIONREAD

Jestli chceš data nechat hromadit ve vstupní frontě a tímto testovat jestli už přišlo všechno, tak to nebude dobrý nápad (teda dovedu si představit, že u některých aplikací by to mohlo být výhodné, ale...). Tak jak to máš teď - načítání dostupných dat s detekcí kompletního načtení - to bude lepší.

Nahlásit jako SPAM
IP: 78.156.159.–
22. 5. 2013   #4
-
0
-

MSG_PEEK umožní určit, kolik lze recv číst, ale není to totéž jako kolik je ve vst. frontě.

Z jakého důvodu to není dobrý nápad?

hu

Nahlásit jako SPAM
IP: 195.178.67.–
zlz
~ Anonymní uživatel
634 příspěvků
22. 5. 2013   #5
-
0
-

Podle dokumentace to ioctl pro stream funguje jako ten peek - vrací množství, které se dá načíst jedním recv.

Nechávat to ve frontě není dobrý nápad jednoduše proto, že se ti ta fronta může zaplnit a socket (OS) přestane přijímat další data. Otázka pak je, jestli ti to vadí a jak na to budeš reagovat.

Nahlásit jako SPAM
IP: 78.156.159.–
22. 5. 2013   #6
-
0
-

Záměr: čekat, až tam bude hlavička zprávy (12 Bytů), tu vyzvednu. Ta obsahuje délku následujících dat, maximálně 999 Bytů. Po dovršení očekávaného množství dat je přečíst jako celek.

Závislost na množství dat odeslaných funkcí send je naprosto nežádoucí - přijetí zprávy nepředchází volání send.

hu

Nahlásit jako SPAM
IP: 195.178.67.–
23. 5. 2013   #7
-
0
-

#3 zlz
podle http://support.microsoft.com/kb/192599/cs máš pravdu, že ponechávat data ve vstupním bufferu a zjišťovat, kolik jich je, je nevhodné. Také doporučují můj původní postup - příchozí data načíst do aplikace a teprve tam je dělit na zprávy a zpracovávat.

hu

Nahlásit jako SPAM
IP: 195.178.67.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 12 hostů

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý