<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>Tra il codice e la realtà &#187; SO_RCVBUF</title>
	<atom:link href="http://andreamurru.wordpress.com/tag/so_rcvbuf/feed/" rel="self" type="application/rss+xml" />
	<link>http://andreamurru.wordpress.com</link>
	<description>omnia munda mundis</description>
	<lastBuildDate>Fri, 04 Sep 2009 19:38:44 +0000</lastBuildDate>
	<generator>http://wordpress.com/</generator>
	<language>it</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<cloud domain='andreamurru.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://www.gravatar.com/blavatar/7f532f9a0124df110c111e4e38d3cc3c?s=96&#038;d=http://s.wordpress.com/i/buttonw-com.png</url>
		<title>Tra il codice e la realtà &#187; SO_RCVBUF</title>
		<link>http://andreamurru.wordpress.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://andreamurru.wordpress.com/osd.xml" title="Tra il codice e la realtà" />
		<item>
		<title>Perdita di pacchetti ad alti bitrate</title>
		<link>http://andreamurru.wordpress.com/2009/01/19/perdita-di-pacchetti-ad-alti-bitrate/</link>
		<comments>http://andreamurru.wordpress.com/2009/01/19/perdita-di-pacchetti-ad-alti-bitrate/#comments</comments>
		<pubDate>Mon, 19 Jan 2009 22:17:32 +0000</pubDate>
		<dc:creator>Andrea Murru</dc:creator>
				<category><![CDATA[Programmazione]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[completion routine]]></category>
		<category><![CDATA[overlapped I/O]]></category>
		<category><![CDATA[socket]]></category>
		<category><![CDATA[SO_RCVBUF]]></category>
		<category><![CDATA[windows embedded ce 6.0]]></category>
		<category><![CDATA[wireshark]]></category>

		<guid isPermaLink="false">http://andreamurru.wordpress.com/?p=71</guid>
		<description><![CDATA[In un progetto sul quale ho lavorato di recente, mi è capitato di avere a che fare con flussi (streaming multimediali) a bitrate relativamente alto, per l&#8217;hw in questione. Scrivo questo post perché siamo stati vittime di un nostro (banale) bug che ci è costato qualche giorno di test e qualche mal di testa: magari [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=andreamurru.wordpress.com&blog=2297529&post=71&subd=andreamurru&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>In un progetto sul quale ho lavorato di recente, mi è capitato di avere a che fare con flussi (streaming multimediali) a bitrate relativamente alto, per l&#8217;hw in questione. Scrivo questo post perché siamo stati vittime di un nostro (banale) bug che ci è costato qualche giorno di test e qualche mal di testa: magari qualcuno potrà evitarseli leggendo questo post&#8230; non si trova molta documentazione in giro.</p>
<p>Intanto qualche altro dettaglio sul sistema: un client che riceve flussi multimediali in UDP (fino a 10 mbs) su windows embedded ce 6.0, realizzato in c++ con il visual studio 2005, utilizzando direttamente winsock2. Un thread si occupa della ricezione utilizzando semplicemente una socket in modalità bloccante in un ciclo di lettura che ha anche il compito di effetture alcune operazioni sui dati (poco onerose in termini di CPU) e di copiarli in un buffer dal quale un thread consumatore le preleva. Viene utilizzata la funzione recv(), visto che la modalità bloccante non è affatto un problema (e quindi l&#8217; <span class="srcSentence">overlapped I/O è inutile) e le </span><span class="srcSentence">completion routine non sono ben supportate da windows embedded ce 6.0.</span></p>
<p><span class="srcSentence">Tutto sembra funzionare bene, fino a bitrare inferiori a 2 mbs, ma superando tale valore&#8230; si manifestano degli strani problemi. Dopo molta fatica (visto che ovviamente non era possibile andare in debug, ma neppure scrivere su file se non pochi kbytes e quidi il debug stesso non poteva che avvenire anch&#8217;esso via rete), sembrava inequivocabile che si trattasse di perdite di pacchetti dallo 0.3% al 3% circa. A ridurre la nostra lucità di analisi si metteva anche il fatto che ad avere problema era solo uno streamer che utilizzavamo per la prima volta, mentre quello che avevamo utilizzato fino ad allora funzionava alla grande (ora sappiamo che dipendeva solo dal bitrate).</span></p>
<p><span class="srcSentence">Il passo successivo (e molto poco divertente) è stato quello di usare wireshark per verificare se una tale perdita di pacchetti era in qualche modo imputabile alla nostra lettura&#8230; provate a cercare in un dump 1 paccheto perso, verificando che non ci siano buchi in un continuity counter a 4 bit e con il parser di wireshark bacato. Davvero poco divertente. Comunque le perdite non c&#8217;erano!</span></p>
<p><span class="srcSentence">Il problema è semplicemente legato al fatto che il sistema operativo allocca un buffer interno, settato di defaut a pochi kbytes, che può facilmente venire saturato se il thread che effettua la lettura non è sufficientemente veloce o se viene sospeso (anche solo per pochi ms).</span></p>
<p><span class="srcSentence">Fortunatamnte la soluzione esiste: basta settare un buffer di ricezione più grande. </span></p>
<blockquote><p><span class="srcSentence">unsigned bufferSize = 1024 * 1024;<br />
::setsockopt(s_, SOL_SOCKET, SO_RCVBUF, (const char FAR*)&amp;amp;bufferSize, sizeof(bufferSize));<br />
</span></p></blockquote>
<p><span class="srcSentence">con 1 mbyte di buffer, a 10 mbs, si possono gestire circa 800 ms di flusso: si tratta di un valore congruo che ci ha permesso di eliminare del tutto le perdite.</span></p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/andreamurru.wordpress.com/71/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/andreamurru.wordpress.com/71/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/andreamurru.wordpress.com/71/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/andreamurru.wordpress.com/71/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/andreamurru.wordpress.com/71/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/andreamurru.wordpress.com/71/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/andreamurru.wordpress.com/71/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/andreamurru.wordpress.com/71/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/andreamurru.wordpress.com/71/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/andreamurru.wordpress.com/71/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=andreamurru.wordpress.com&blog=2297529&post=71&subd=andreamurru&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://andreamurru.wordpress.com/2009/01/19/perdita-di-pacchetti-ad-alti-bitrate/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/c533f393aa0365e59024d333b02b0b3f?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Andrea Murru</media:title>
		</media:content>
	</item>
	</channel>
</rss>