Builder.cz - Informacni server o programovani

Odběr fotomagazínu

Fotografický magazín "iZIN IDIF" každý týden ve Vašem e-mailu.
Co nového ve světě fotografie!

 

Zadejte Vaši e-mailovou adresu:

Kamarád fotí rád?

Přihlas ho k odběru fotomagazínu!

 

Zadejte e-mailovou adresu kamaráda:



Winsock, TCP, recv a význam chyby ERROR_SUCCESS?

Seznam témat     Nová odpověď

Přihlásit se     Registrace     Zapomenuté heslo

Re: Winsock, TCP, recv a význam chyby ERROR_SUCCESS?

Autor: Honza Havelka

18:45:02 20.07.2010

Použij blokující režim. Já používám pro TCP recv na sokety v blokujícím režimu taky. Většinou to dávám do samostatného vlákna. V blokujícím režimu se recv na TCP chová tak, že blokuje jen když nejsou žádná data ke čtení a když je aspoň bajt tak neblokuje a načte ten bajt i když je v parametru len větší délka. Tomu, aby recv neblokoval pokud není ani bajt ke čtení se dá předejít selectem a pan Valerian už to tady na serveru v příkladech uváděl. Tak si to udělej podle toho.

http://forum.builder.cz/read.php?16,2345688,2347917#msg-2347917
http://forum.builder.cz/read.php?16,2345688,2347918#msg-2347918

Citovat příspěvek

 

Re: Winsock, TCP, recv a význam chyby ERROR_SUCCESS?

Autor: ZmutovanyCitron

20:37:24 19.07.2010

Zdravím,

děkuji za odpověd, ale to už jsem zkoušel, WSAGetLastError či SO_ERROR, je to jedno, vrací to stejnou chybu, tedy ERROR_SUCCESS... do dokumentace jsem se už taky díval, a nic o té chybě tam není, protože to ERROR_SUCCESS vlastně chyba ani není, je to potvrzení že operace proběhla v pořádku, no jenže recv hlásí chybu...

abych to upřesnil, tak takhle nějak vypadá to volání recv:

[quote]
int result = recv(s, buffer, 1024, 0);
if (result == SOCKET_ERROR)
{
int error = WSAGetLastError(); // tady je ta "chyba" ERROR_SUCCESS
if (error == WSAEWOULDBLOCK)
return 0;
else printError(); // FormatMessage

}
[/quote]

Zajímavé je že když tu chybu ERROR_SUCCESS budu ignorovat a zavolám recv podruhé tak už to chybu nevyhodí, ale normálně zapíše do bufferu nějaká data. Jenže já tu chybu ignorovat nemůžu protože jsem zjistil že pokud už žádné data nejsou na cestě tak mi recv vždycky selže (SOCKET_ERROR) a WSAGetLastError vždycky vrací ERROR_SUCCESS.

Pokud jsem pochopil správně chování funkce recv() tak pro neblokující sokety by měla zapsat do mého bufferu tolik dat kolik je možné, tedy i méně než jsem zažádal přes parametr "size" při volání recv(), a ihned se vrátit, bez čekání na další data, a vrátit by mi měla počet zapsaných bytů.

A pokud žádné data nejsou na cestě, fuknce recv() by měla vrátit WSAEWOULDBLOCK, tedy pro neblokující sokety... nějak takhle jsem to pochopil.

No jinak jsem hledal co se dalo, ale odpověd na mou otázku jsem nenašel... ERROR_SUCCESS by to prostě vracet nemělo...
:S

Citovat příspěvek

 

Re: Winsock, TCP, recv a význam chyby ERROR_SUCCESS?

Autor: JiriValerian

19:15:16 19.07.2010

[color=#008000]ZmutovanyCitron Napsal:
-------------------------------------------------------
> Zdravím ve spolek,
>
> potřeboval bych vysvětlit význam chyby
> ERROR_SUCCESS která je mi vrácena při zavolání
> funkce getsockopt(), tedy zavolám getsockopt(s,
> SOL_SOCKET, SO_ERROR, chyba, &len), a proměnná
> "chyba" se rovná ERROR_SUCCESS.
>
> Vím že ta "chyba" znamená že žádná chyba
> nenastala, problém je že tu chybu zjištuju na
> soketu na kterém vím že nastala chyba při volání
> funkce recv(), protože recv mi vrátí SOCKET_ERROR,
> takže pak následně volám getsockopt() abych
> zjistil jaká chyba nastala.
>[/color]

Pokud [b]recv[/b] vrátí [b]SOCKET_ERROR[/b] pak použijte [b]WSAGetLastError()[/b].

[b]recv Function[/b]
http://msdn.microsoft.com/en-us/library/ms740121(VS.85).aspx

[b]Citace:[/b]
[color=#FF0000][i]If no error occurs, recv returns the number of bytes received and the buffer pointed to by the buf parameter will contain this data received. If the connection has been gracefully closed, the return value is zero.

Otherwise, a value of SOCKET_ERROR is returned, and a specific error code can be retrieved by calling WSAGetLastError.[/i][/color]

Citovat příspěvek

 

Winsock, TCP, recv a význam chyby ERROR_SUCCESS?

Autor: ZmutovanyCitron

16:55:05 19.07.2010

Zdravím ve spolek,

potřeboval bych vysvětlit význam chyby ERROR_SUCCESS která je mi vrácena při zavolání funkce getsockopt(), tedy zavolám getsockopt(s, SOL_SOCKET, SO_ERROR, chyba, &len), a proměnná "chyba" se rovná ERROR_SUCCESS.

Vím že ta "chyba" znamená že žádná chyba nenastala, problém je že tu chybu zjištuju na soketu na kterém vím že nastala chyba při volání funkce recv(), protože recv mi vrátí SOCKET_ERROR, takže pak následně volám getsockopt() abych zjistil jaká chyba nastala.

Ještě nějaké informace o nastavení toho soketu, je na tcp serveru, takže bind a listen, nastaven jako neblokující (ioctlsocket), a stav zjištuju přes funkci select().

Děkuji za případné odpovědi.
ZmutovanyCitron.

PS: Používám verzi 2.2...

Citovat příspěvek

 

 

 

Přihlášení k mému účtu

Uživatelské jméno:

Heslo: