<?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/"
	>

<channel>
	<title>SIMOTRONE WEB PAGE &#187; socket</title>
	<atom:link href="http://www.simotrone.it/tag/socket/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.simotrone.it</link>
	<description>Simotrone is always here!</description>
	<lastBuildDate>Sat, 04 Feb 2012 18:30:44 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1</generator>
		<item>
		<title>Java socket</title>
		<link>http://www.simotrone.it/2009/12/08/java-socket/</link>
		<comments>http://www.simotrone.it/2009/12/08/java-socket/#comments</comments>
		<pubDate>Tue, 08 Dec 2009 06:33:29 +0000</pubDate>
		<dc:creator>Simotrone</dc:creator>
				<category><![CDATA[Binary People]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[protocolli]]></category>
		<category><![CDATA[server]]></category>
		<category><![CDATA[socket]]></category>

		<guid isPermaLink="false">http://www.simotrone.it/?p=2480</guid>
		<description><![CDATA[Ecco un dumper in ascolto su di un socket scritto in java. import java.net.*; import java.io.*; public class Dumper &#123; &#160; &#160; public static void main&#40;String&#91;&#93; args&#41; &#123; &#160; &#160; &#160; &#160; try &#123; &#160; &#160; &#160; &#160; &#160; &#160; int portNumber = 1234; &#160; &#160; &#160; &#160; &#160; &#160; try &#123; &#160; &#160; &#160; [...]]]></description>
			<content:encoded><![CDATA[<p>Ecco un dumper in ascolto su di un socket scritto in java.</p>
<div class="codesnip-container" >
<div class="codesnip" style="font-family: monospace;"><span class="co2">import java.net.*;</span><br />
<span class="co2">import java.io.*;</span></p>
<p><span class="kw2">public</span> <span class="kw2">class</span> Dumper <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw2">public</span> <span class="kw2">static</span> <span class="kw4">void</span> main<span class="br0">&#40;</span><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AString+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">String</span></a><span class="br0">&#91;</span><span class="br0">&#93;</span> args<span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">try</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">int</span> portNumber = <span class="nu0">1234</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">try</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; portNumber = <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AInteger+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">Integer</span></a>.<span class="me1">parseInt</span><span class="br0">&#40;</span><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3ASystem+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">System</span></a>.<span class="me1">getProperty</span><span class="br0">&#40;</span><span class="st0">&quot;port&quot;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span> <span class="kw2">catch</span> <span class="br0">&#40;</span><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AException+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">Exception</span></a> e<span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AServerSocket+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">ServerSocket</span></a> serv = <span class="kw2">new</span> <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AServerSocket+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">ServerSocket</span></a><span class="br0">&#40;</span>portNumber<span class="br0">&#41;</span>;</p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">for</span> <span class="br0">&#40;</span>;;<span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3ASocket+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">Socket</span></a> sock = serv.<span class="me1">accept</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AInputStream+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">InputStream</span></a> inStream = sock.<span class="me1">getInputStream</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">int</span> ch;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">while</span> <span class="br0">&#40;</span><span class="br0">&#40;</span>ch = inStream.<span class="me1">read</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> &gt;= <span class="nu0">0</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <a href="http://www.google.com/search?hl=en&amp;q=allinurl%3ASystem+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">System</span></a>.<span class="me1">out</span>.<span class="me1">print</span><span class="br0">&#40;</span><span class="br0">&#40;</span><span class="kw4">char</span><span class="br0">&#41;</span> ch<span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; sock.<span class="me1">close</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span> <span class="kw2">catch</span> <span class="br0">&#40;</span><a href="http://www.google.com/search?hl=en&amp;q=allinurl%3AException+java.sun.com&amp;btnI=I%27m%20Feeling%20Lucky"><span class="kw3">Exception</span></a> e<span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; e.<span class="me1">printStackTrace</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
<span class="br0">&#125;</span></div>
</div>
<p>A che serve? Non a molto.<br />
E&#8217; un server in ascolto su una porta e spamma sul terminale. Puntando netcat o telnet, possiamo scrivere lato client e vedere che si dice lato server.<br />
Oppure possiamo puntarci un browser sopra e sapere quali righe invia, per esempio, Iceweasel 2 per presentarsi ad un server web:</p>
<pre>GET / HTTP/1.1
Host: xxxxx.yyy.zz:1234
User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.17)
    Gecko/20080827 Iceweasel/2.0.0.17 (Debian-2.0.0.17-0etch1)
Accept: text/xml,application/xml,application/xhtml+xml,text/html;
    q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
Accept-Language: it,en;q=0.7,it-ch;q=0.3
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.simotrone.it/2009/12/08/java-socket/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>MySQL, API e C (1)</title>
		<link>http://www.simotrone.it/2009/01/20/mysql-api-e-c/</link>
		<comments>http://www.simotrone.it/2009/01/20/mysql-api-e-c/#comments</comments>
		<pubDate>Tue, 20 Jan 2009 05:46:42 +0000</pubDate>
		<dc:creator>Simotrone</dc:creator>
				<category><![CDATA[Binary People]]></category>
		<category><![CDATA[C]]></category>
		<category><![CDATA[Mysql]]></category>
		<category><![CDATA[socket]]></category>

		<guid isPermaLink="false">http://www.simotrone.it/?p=1175</guid>
		<description><![CDATA[MySQL è the world&#8217;s most popular open source database. C è un (il?) linguaggio di programmazione sviluppato da D. Ritchie per implementare Unix OS. L&#8217;API è l&#8217;application programming interface. Il file /usr/include/mysql/mysql.h è l&#8217;header che contiene classi, funzioni e variabili per mysql (#include &#60;mysql/mysql.h&#62;). Il manualazzo delle API MySQL. MYSQL è la struttura per maneggiare [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.mysql.com/">MySQL</a> è <em>the world&#8217;s most popular open source database</em>.<br />
<a href="http://en.wikipedia.org/wiki/C_(programming_language)">C</a> è un (il?) linguaggio di programmazione sviluppato da <a href="http://www.cs.bell-labs.com/who/dmr/">D. Ritchie</a> per implementare Unix OS.<br />
L&#8217;<a href="http://en.wikipedia.org/wiki/API">API</a> è l&#8217;<em>application programming interface</em>.</p>
<p>Il file <b>/usr/include/mysql/mysql.h</b> è l&#8217;<a href="http://en.wikipedia.org/wiki/Header_files">header</a> che contiene classi, funzioni e variabili per mysql (<strong>#include &lt;mysql/mysql.h&gt;</strong>).</p>
<p>Il <a href="http://dev.mysql.com/doc/refman/5.1/en/c.html">manualazzo</a> delle API MySQL.</p>
<p><strong>MYSQL</strong> è la struttura per maneggiare la connessione al database (le si associa una variabile, e ne si richiama l&#8217;indirizzo con l&#8217;operatore unario <strong>&#038;</strong> ogni qual volta serva &#8211; cioè sempre).</p>
<pre>typedef struct st_mysql
{
  [... blah blah blah ...]
  char          *host,*user,*passwd,*unix_socket,*server_version,*host_info,*info;
  char          *db;
  struct charset_info_st *charset;
  MYSQL_FIELD   *fields;
  MEM_ROOT      field_alloc;
  my_ulonglong affected_rows;
  [... blah blah blah ...]
  my_bool       free_me;                /* If free in mysql_close */
  my_bool       reconnect;              /* set to 1 if automatic reconnect */

  /*
    Points to boolean flag in MYSQL_RES  or MYSQL_STMT. We set this flag
    from mysql_stmt_close if close had to cancel result set of this object.
  */
  my_bool *unbuffered_fetch_owner;
  [... blah blah blah ...]
} MYSQL;
</pre>
<p><strong>MYSQL_RES</strong> è la struttura rappresentante il risutlato di una query che ritorna delle righe (es. SELECT).</p>
<pre>typedef struct st_mysql_res {
  my_ulonglong row_count;
  MYSQL_FIELD   *fields;
  MYSQL_DATA    *data;
  MYSQL_ROWS    *data_cursor;
  unsigned long *lengths;               /* column lengths of current row */
  MYSQL         *handle;                /* for unbuffered reads */
  MEM_ROOT      field_alloc;
  unsigned int  field_count, current_field;
  MYSQL_ROW     row;                    /* If unbuffered read */
  MYSQL_ROW     current_row;            /* buffer to current row */
  my_bool       eof;                    /* Used by mysql_fetch_row */
  /* mysql_stmt_close() had to cancel this result */
  my_bool       unbuffered_fetch_cancelled;
  const struct st_mysql_methods *methods;
} MYSQL_RES;</pre>
<p><strong>MYSQL_ROW</strong> è un array che rappresenta una riga di dati.</p>
<pre>typedef char **MYSQL_ROW;               /* return data as array of strings */</pre>
<p>Ci metto pure il <strong>MYSQL_FIELD</strong>, visto che viene considerato dalla struct RES.</p>
<pre>typedef struct st_mysql_field {
  char *name;                 /* Name of column */
  char *org_name;             /* Original column name, if an alias */
  char *table;                /* Table of column if column was a field */
  char *org_table;            /* Org table name, if table was an alias */
  char *db;                   /* Database for table */
  char *catalog;              /* Catalog for table */
  char *def;                  /* Default value (set by mysql_list_fields) */
  [... blah blah blah ...]
  enum enum_field_types type; /* Type of field. See mysql_com.h for types */
} MYSQL_FIELD;</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.simotrone.it/2009/01/20/mysql-api-e-c/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>C network prog (4)</title>
		<link>http://www.simotrone.it/2009/01/13/c-network-prog-4/</link>
		<comments>http://www.simotrone.it/2009/01/13/c-network-prog-4/#comments</comments>
		<pubDate>Tue, 13 Jan 2009 05:09:58 +0000</pubDate>
		<dc:creator>Simotrone</dc:creator>
				<category><![CDATA[Binary People]]></category>
		<category><![CDATA[C]]></category>
		<category><![CDATA[socket]]></category>

		<guid isPermaLink="false">http://www.simotrone.it/?p=1142</guid>
		<description><![CDATA[Dopo aver creato il socket, averlo bind&#8217;ato e messo in ascolto, nonche&#8217; averlo connesso lato client, le nostre due macchine possono comunicare grazie ai comandi send() e recv(): int send(int sockd, void *buf, int len, int opt) int recv(int sockd, void *buf, int len, int opt) Il parametro len indica la lunghezza del buffer (dei [...]]]></description>
			<content:encoded><![CDATA[<p>Dopo aver creato il socket, averlo bind&#8217;ato e messo in ascolto, nonche&#8217; averlo connesso lato client, le nostre due macchine possono comunicare grazie ai comandi <strong>send()</strong> e <strong>recv()</strong>:</p>
<blockquote><pre>int send(int sockd, void *buf, int len, int opt)</pre>
</blockquote>
<blockquote><pre>int recv(int sockd, void *buf, int len, int opt)</pre>
</blockquote>
<p>Il parametro <em>len</em> indica la lunghezza del buffer (dei dati da mandare o ricevere) e <em>opt</em> sono le opzioni (spesso 0).</p>
<hr/>
Tutto quanto ho descritto finora è perfetto per la gestione <strong>TCP</strong>.</p>
<p>Nel caso del protocollo <strong>UDP</strong> non c&#8217;e&#8217; connessione, quindi si possono evitare connect(), listen() e accept().</p>
<p>La comunicazione avviene fra i socket di client e server (con socket bind&#8217;ato) grazie a funzione come <strong>sendto</strong> e <strong>recvfrom</strong> &#8211; il kernel riceve i pacchetti <em>datagram</em> e li riceve sul processo in ascolto sulla porta a cui sono diretti oppure li scarta (con conseguente messaggio ICMP &#8220;port unreachable&#8221; al client) se non c&#8217;e&#8217; alcun processo in ascolto.</p>
<blockquote><pre>ssize_t sendto(int sockd, const void *buf, size_t len,
        int flags, const struct sockaddr *to, socklen_t tolen)</pre>
</blockquote>
<p><em>Flags</em> è un parametro di opzioni che va di default a 0, <em>to</em> e <em>tolen</em> sono rispettivamnete l&#8217;indirizzo di destinazione e la sua lunghezza.</p>
<blockquote><pre>ssize_t recvfrom(int sockd, const void *buf,
        size_t len, int flags, const struct sockaddr *from,
        socklen_t *fromlen)
</pre>
</blockquote>
<p>(Si possono mettere <em>from</em> e <em>fromlen</em> a NULL se non si è interessati a sapere i dati dell&#8217;indirizzo di origine.)</p>
]]></content:encoded>
			<wfw:commentRss>http://www.simotrone.it/2009/01/13/c-network-prog-4/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>C network prog (3)</title>
		<link>http://www.simotrone.it/2009/01/09/c-network-prog-3/</link>
		<comments>http://www.simotrone.it/2009/01/09/c-network-prog-3/#comments</comments>
		<pubDate>Fri, 09 Jan 2009 05:46:06 +0000</pubDate>
		<dc:creator>Simotrone</dc:creator>
				<category><![CDATA[Binary People]]></category>
		<category><![CDATA[C]]></category>
		<category><![CDATA[socket]]></category>

		<guid isPermaLink="false">http://www.simotrone.it/?p=1135</guid>
		<description><![CDATA[Dopo aver creato un socket e creato una struttura coi dati dell&#8217;host necessari, dobbiamo associare le due cose grazie alla funzione bind(). La funzione bind viene utilizzata dal server per associare il socket ad un ip ed una porta; un client non usa bind perche&#8217; il suo indirizzo viene determinato dall&#8217;interfaccia usata, e la porta [...]]]></description>
			<content:encoded><![CDATA[<p>Dopo aver creato un socket e creato una struttura coi dati dell&#8217;host necessari, dobbiamo associare le due cose grazie alla funzione <strong>bind()</strong>.<br />
La funzione bind viene utilizzata dal server per associare il socket ad un ip ed una porta; un client non usa bind perche&#8217; il suo indirizzo viene determinato dall&#8217;interfaccia usata, e la porta la decide il kernel scegliendo la prima disponibile.<br />
Il prototipo di bind è:</p>
<blockquote><pre>int bind(int sockd, const struct sockaddr *serv_addr, socklen_t addrlen)</pre>
</blockquote>
<p>dove viene considerato il <em>socket descriptor</em>, la struttura dell&#8217;indirizzo del server, e la dimensione dell&#8217;indirizzo.</p>
<p>L&#8217;indirizzo puo&#8217; essere inserito liberamente, oppure si possono utilizzare alcune costanti predefinite:</p>
<ul>
<li>INADDR_ANY per indicare qualunque indirizzo (0.0.0.0)</li>
<li>INADDR_BROADCAST</li>
<li>INADDR_LOOPBACK (127.0.0.1)</li>
</ul>
<p>Dopo il bind&#8217;aggio del socket, si deve indicare al server di rimanere in ascolto con <strong>listen()</strong> e di accettare con <strong>accept()</strong> eventuali connessioni.</p>
<blockquote><pre>int listen(int sockd, int backlog)</pre>
</blockquote>
<blockquote><pre>int accept(int sockd, struct sockaddr *addr,
        socklen_t *addrlen)</pre>
</blockquote>
<p>Nel caso di accept, l&#8217;indirizzo e la dimensione relativa sono del client che invia la richiesta di connessione (nel caso ci servissero i dati per loggare i contatti).</p>
<hr/>
La connessione TCP fra client e server si stabilisce grazie alla funzione <strong>connect()</strong> dopo aver creato il socket-lato-client:</p>
<blockquote><pre>int connect(int sockd, const struct sockaddr *serv_addr,
        socklen_t addrlen)</pre>
</blockquote>
]]></content:encoded>
			<wfw:commentRss>http://www.simotrone.it/2009/01/09/c-network-prog-3/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>C network prog (2)</title>
		<link>http://www.simotrone.it/2009/01/07/c-network-prog-2/</link>
		<comments>http://www.simotrone.it/2009/01/07/c-network-prog-2/#comments</comments>
		<pubDate>Wed, 07 Jan 2009 06:00:34 +0000</pubDate>
		<dc:creator>Simotrone</dc:creator>
				<category><![CDATA[Binary People]]></category>
		<category><![CDATA[C]]></category>
		<category><![CDATA[socket]]></category>

		<guid isPermaLink="false">http://www.simotrone.it/?p=1133</guid>
		<description><![CDATA[Forse non tutti sanno che l&#8217;ordine di lettura dei byte non è fissato (wiki). Le diverse architetture dei calcolatori hanno un modo differente di leggere dati di dimensione superiore al byte: la cosa fondamentale è che puo&#8217; cambiare l&#8217;ordine in cui diversi byte consecutivi vengono memorizzati. Big endian è il caso in cui le posizioni [...]]]></description>
			<content:encoded><![CDATA[<p>Forse non tutti sanno che l&#8217;ordine di lettura dei byte non è fissato (<a href="http://it.wikipedia.org/wiki/Ordine_dei_byte">wiki</a>).<br />
Le diverse architetture dei calcolatori hanno un modo differente di leggere dati di dimensione superiore al byte: la cosa fondamentale è che puo&#8217; cambiare l&#8217;ordine in cui diversi byte consecutivi vengono memorizzati.<br />
<em>Big endian</em> è il caso in cui le posizioni di memoria sono occupate a partire dal byte piu&#8217; significativo (a sinistra) (Mac, per esempio, usa questo modo).<br />
<em>Little endian</em> è il caso in cui le posizioni di memoria partono dal byte piu&#8217; a destra (Intel).</p>
<p>Esempio:</p>
<blockquote><p>Se vogliamo memorizzare la stringa ABCD, e la localizziamo all&#8217;indirizzo di memoria 100, in big endian avremo A al 100, B al 101, C al 102, D al 103; mentre in little endian avremo D al 100, C al 101, B al 102 e A al 103.</p></blockquote>
<p>Ovviamente questo problema diventa immenso quando si inseriesce come stringa un numero (ad esempio una porta): 1234 puo&#8217; diventare 4321 con effetti assai diversi.</p>
<p>Il formato di rete dei byte, o <strong>network byte order</strong>, <strong>è big endian</strong>; per questo è necessario convertire i valori numerici degli ip e delle porte in big endian &#8211; per fare questo ci vengono in soccorso le funzioni htonl (per i long int) e htons (per gli short). Ad esempio nel definire la struttura dell&#8217;indirizzo abbiamo:</p>
<blockquote><pre>struct sockaddr_in sa;

sa.sin_family = AF_INET;
sa.sin_port = htons(port);
sa.sin_addr.s_addr = htonl(INADDR_ANY);</pre>
</blockquote>
]]></content:encoded>
			<wfw:commentRss>http://www.simotrone.it/2009/01/07/c-network-prog-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>C network prog (1)</title>
		<link>http://www.simotrone.it/2009/01/02/c-network-prog/</link>
		<comments>http://www.simotrone.it/2009/01/02/c-network-prog/#comments</comments>
		<pubDate>Fri, 02 Jan 2009 06:00:53 +0000</pubDate>
		<dc:creator>Simotrone</dc:creator>
				<category><![CDATA[Binary People]]></category>
		<category><![CDATA[C]]></category>
		<category><![CDATA[socket]]></category>

		<guid isPermaLink="false">http://www.simotrone.it/?p=1126</guid>
		<description><![CDATA[In generale un socket di rete è un tubo tra due processi (ie: client &#8211; server) col quale ciascuno dei due processi puo&#8217; interagire (leggere, scrivere, ecc.). Il prototipo per creare un socket in C è il seguente: int socket (int domain, int type, int prot) Il parametro domain indica la famiglia da usare (AF_INET, [...]]]></description>
			<content:encoded><![CDATA[<p>In generale un socket di rete è un tubo tra due processi (ie: client &#8211; server) col quale ciascuno dei due processi puo&#8217; interagire (leggere, scrivere, ecc.).</p>
<p>Il prototipo per creare un socket in C è il seguente:</p>
<blockquote><pre>int socket (int domain, int type, int prot)</pre>
</blockquote>
<p>Il parametro <em>domain</em> indica la famiglia da usare (AF_INET, AF_INET6, AF_UNIX), il <em>type</em> definisce la comunicazione (tcp, upd: SOCK_STREAM, SOCK_DGRAM) e <em>protocol</em> definisce un particolare protocollo (generalmente vale 0).</p>
<p>Il socket da solo non vale niente (allocca le strutture necessarie nel kernel); è quindi necessario fornire gli indirizzi secondo strutture di dati prestabilite (in sys/socket.h):</p>
<blockquote><pre>struct sockaddr
{
    sa_family_t  sa_family;
    char         sa_data[14];
}</pre>
</blockquote>
<p>La struttura è volutamente generica: le funzioni che usano gli indirizzi hanno nel prototipo un puntatore alla struttura, e necessitano di un <em>casting</em> (del puntatore) per farsi capire dal protocollo voluto.</p>
<p>Gli indirizzi IPv4 seguono la seguente struttura:</p>
<blockquote><pre>struct  sockaddr_in
{
     sa_family_t     sin_family;
     in_port_t       sin_port;
     struct in_addr  sin_addr;
     unsigned char   sin_zero[8];
}</pre>
</blockquote>
<p>e la struttura in_addr (che contiene l&#8217;IPv4 di 32 bit) risulta:</p>
<blockquote><pre>struct  in_addr
{
      u_int32_t       s_addr;
}</pre>
</blockquote>
<p>Le strutture IPv6 e per indirizzi locali hanno alcuni campi specifici.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.simotrone.it/2009/01/02/c-network-prog/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Nebbia in Val Padana</title>
		<link>http://www.simotrone.it/2008/12/24/nebbia-in-val-padana/</link>
		<comments>http://www.simotrone.it/2008/12/24/nebbia-in-val-padana/#comments</comments>
		<pubDate>Tue, 23 Dec 2008 23:30:49 +0000</pubDate>
		<dc:creator>Simotrone</dc:creator>
				<category><![CDATA[Binary People]]></category>
		<category><![CDATA[It's all, folks!]]></category>
		<category><![CDATA[Weird trips]]></category>
		<category><![CDATA[C]]></category>
		<category><![CDATA[gironzoli]]></category>
		<category><![CDATA[nebbia]]></category>
		<category><![CDATA[padova]]></category>
		<category><![CDATA[socket]]></category>

		<guid isPermaLink="false">http://www.simotrone.it/?p=1098</guid>
		<description><![CDATA[Il perche&#8217; Il Creatore (comunque lo vogliate chiamare) abbia inventato la nebbia, non lo so. Comunque so per certo che ci deve essere qualcosa che non gli piace nella terra fra Ferrara e Rovigo&#8230; O_o Almeno qualche pistolotto che sfrutta i socket in C (e le struct) è venuto fuori&#8230; figata notevole. ^_^ $ man [...]]]></description>
			<content:encoded><![CDATA[<p>Il perche&#8217; Il Creatore (comunque lo vogliate chiamare) abbia inventato la nebbia, non lo so.<br />
Comunque so per certo che ci deve essere qualcosa che non gli piace nella terra fra Ferrara e Rovigo&#8230;<br />
O_o</p>
<p>Almeno qualche pistolotto che sfrutta i socket in C (e le struct) è venuto fuori&#8230; figata notevole. ^_^</p>
<pre>$ man 7 ip
$ man socket
$ man bind / listen / connect
$ man accept / send /recv</pre>
<p><a href="http://www.cs.utah.edu/dept/old/texinfo/glibc-manual-0.02/library_15.html">http://www.cs.utah.edu/dept/old/texinfo/glibc-manual-0.02/library_15.html</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.simotrone.it/2008/12/24/nebbia-in-val-padana/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

