<?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; C</title>
	<atom:link href="http://www.simotrone.it/tag/c/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.simotrone.it</link>
	<description>Simotrone is back!</description>
	<lastBuildDate>Fri, 30 Jul 2010 05:47:22 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>CGI in C</title>
		<link>http://www.simotrone.it/2010/05/25/cgi-in-c/</link>
		<comments>http://www.simotrone.it/2010/05/25/cgi-in-c/#comments</comments>
		<pubDate>Tue, 25 May 2010 05:30:11 +0000</pubDate>
		<dc:creator>Simotrone</dc:creator>
				<category><![CDATA[Binary People]]></category>
		<category><![CDATA[C]]></category>
		<category><![CDATA[CGI]]></category>
		<category><![CDATA[lib]]></category>
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://www.simotrone.it/?p=2866</guid>
		<description><![CDATA[Qualche tempo fa mi sono messo a guardare framework web vari e curiosi, trovando le cose più disparate: mi avevano colpito molto due engine scriptati in bash e rc (nanoblog e werc).
La shell è molto affacinante, ma l&#8217;overheading del codice legato ai vari &#8220;system&#8221; che la shell lancia per avviare figli di se stessa sono [...]]]></description>
			<content:encoded><![CDATA[<p>Qualche tempo fa mi sono messo a guardare framework web vari e curiosi, trovando le cose più disparate: mi avevano colpito molto due engine scriptati in bash e rc (<a href="http://nanoblogger.sourceforge.net/">nanoblog</a> e <a href="http://werc.cat-v.org/">werc</a>).<br />
La shell è molto affacinante, ma l&#8217;overheading del codice legato ai vari &#8220;system&#8221; che la shell lancia per avviare figli di se stessa sono mostruosi.</p>
<p>Dunque, in un weekend lontano da casa ma col portatilino a mano, mi sono messo a guardare queste cose lato C &#8211; un po&#8217; macchinosetto, non c&#8217;è dubbio.</p>
<p>Mi sono messo a scrivere una lib cgi, per esercizio, in modo che sapesse interpretare un form in GET ed in POST (non avevo mica capito come client e server si passavano i dati in POST) e la cosa funzionava pure (a parte un bug, suvvia).</p>
<p>Tornato a casa, un <strong>apt-cache search libcgi</strong> ha evidenziato i seguenti pacchetti, che indicavano chiaramente il mio lavoro come inutile:</p>
<div class="codesnip-container" >
<div class="codesnip" style="font-family: monospace;"><span class="br0">&#91;</span>&#8230;<span class="br0">&#93;</span><br />
libcgi-dev &#8211; library <span class="kw1">for</span> CGI programs <span class="kw1">in</span> C<br />
libcgi-doc &#8211; documentation <span class="kw1">for</span> libcgi <span class="kw1">in</span> html<br />
libcgi0 &#8211; library <span class="kw1">for</span> CGI programs <span class="kw1">in</span> C<br />
libcgic-dev &#8211; C library <span class="kw1">for</span> developing CGI applications<br />
libcgic2 &#8211; C library <span class="kw1">for</span> developing CGI applications<span class="br0">&#91;</span>&#8230;<span class="br0">&#93;</span></div>
</div>
<p>La pagina introduttiva di libcgi-doc (su <a href="http://libcgi.sourceforge.net/page.htm">sourceforge</a>) dice quel che segue:</p>
<blockquote><p>Hello!<br />
My name is Rafael Steil, I&#8217;m from Brazil.</p>
<p>I started programming LibCGI just for fun at september/2001. The reason I wrote<br />
this lib was, originally, to learn more about C programming. In that time, I<br />
had many problems with pointers manipulation, and I was being a bit bored about<br />
it.<br />
I needed a reason, a good reason continue. Those days I&#8217;ve been coding in PHP,<br />
and I sill like PHP a lot, because it is powerful and fun to code with. But on<br />
the other hand, I don&#8217;t want to work with PHP for the rest of my life, I want<br />
to do something of exciting, like programming games <img src='http://www.simotrone.it/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> .</p>
<p>Just as curiosity, currently I spend my time ( which means, I&#8217;m paid for )<br />
coding in Java and C#.</p>
<p>When I wrote the first LibCGI&#8217;s line of code ( in this time LibCGI was just a<br />
test program ), I knew absolutely nothing about CGI programming, I didn&#8217;t know<br />
how to read form variables, nothing.<br />
After some time searching in the Internet, I found some cool papers, and one of<br />
them described how to read data, and before reading it, I thought &#8220;sucks, It<br />
seems to be really complex&#8221;, but not, I was wrong! How fun!! After some hours I<br />
finished a more complex program, that reads from STDIN and parses it! So I<br />
thought &#8220;why not make a lib???&#8221;.</p>
<p>Great! I had one more reason to code in C. At that time, I was already codding<br />
much better, and I was safe that could do something very cool! Now, the result<br />
is LibCGI. I would like to thank to everyone that send me suggestions, bugs and<br />
bug-fixes, well, to everyone that uses LibCGI. Thanks a lot guys.!!</p></blockquote>
<p> <img src='http://www.simotrone.it/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Esiste anche il pacchetto <strong>libcgic-dev</strong> (sviluppato da <a href="http://www.boutell.com/cgic/">boutell.com</a>), ma visto che si trascinava dietro mille cose in debian e non mi interessava, l&#8217;ho lasciato lì.</p>
<p>Sicuramente la lib di Boutell sarà meglio (oltre che più aggiornata), ma mi sento &#8220;romanticamente&#8221; vicino al brasiliano.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.simotrone.it/2010/05/25/cgi-in-c/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Vim e il binario con xxd</title>
		<link>http://www.simotrone.it/2009/02/13/vim-e-il-binario-con-xxd/</link>
		<comments>http://www.simotrone.it/2009/02/13/vim-e-il-binario-con-xxd/#comments</comments>
		<pubDate>Fri, 13 Feb 2009 05:20:24 +0000</pubDate>
		<dc:creator>Simotrone</dc:creator>
				<category><![CDATA[Binary People]]></category>
		<category><![CDATA[C]]></category>
		<category><![CDATA[hex]]></category>
		<category><![CDATA[vim]]></category>
		<category><![CDATA[xxd]]></category>

		<guid isPermaLink="false">http://www.simotrone.it/?p=1263</guid>
		<description><![CDATA[Ho scoperto solo di recente che vim puo&#8217; fare da editor anche per i binari.
Il buon vecchio:
sim@idrogeno:~/script/gcc/tmp$ cat hw.c
#include 
int main(int argc, char **argv) {
        printf("Hello world\n");
        return 0;
}
post compilazione appare così:
sim@idrogeno:~/script/gcc/tmp$ head -n1 hw
ELF>à@@À@@%"@@@@@À@@@@¤¤ ¨¨`¨▒ ÐÐ`Ð` @@
Påtdèè@è@$$Qåt/lib64/ld-linux-x86-64.so.2GN
▒ÂÀ__gmon_start__libc.so.6puts__libc_start_mainGLIBC_2.2.5u▒i
1`HèkèúèåHÃÿ5Ê ÿ%Ì @ÿ%Ê héàÿÿÿÿ%Â
héÐÿÿÿ1íIÑ^HâHäðPTIÇÀð@HÇÁ@HÇÇÌ@èÇÿÿÿôHHY HÀtÿÐHÃUHåSH=p
uK¸À`Hj [...]]]></description>
			<content:encoded><![CDATA[<p>Ho scoperto solo di recente che vim puo&#8217; fare da editor anche per i binari.</p>
<p>Il buon vecchio:</p>
<pre>sim@idrogeno:~/script/gcc/tmp$ cat hw.c
#include <stdio.h>
int main(int argc, char **argv) {
        printf("Hello world\n");
        return 0;
}</pre>
<p>post compilazione appare così:</p>
<pre>sim@idrogeno:~/script/gcc/tmp$ head -n1 hw
ELF>à@@À@@%"@@@@@À@@@@¤¤ ¨¨`¨▒ ÐÐ`Ð` @@
Påtdèè@è@$$Qåt/lib64/ld-linux-x86-64.so.2GN
▒ÂÀ__gmon_start__libc.so.6puts__libc_start_mainGLIBC_2.2.5u▒i
1`HèkèúèåHÃÿ5Ê ÿ%Ì @ÿ%Ê héàÿÿÿÿ%Â
héÐÿÿÿ1íIÑ^HâHäðPTIÇÀð@HÇÁ@HÇÇÌ@èÇÿÿÿôHHY HÀtÿÐHÃUHåSH=p
uK¸À`Hj H-¸`HÁøHXÿH9Ús%HBHE ÿÅ¸`H7 H9ÚrâÆ# H[ÉÃfff.UH=
Håt▒¸HÀt¿È`IÃÉAÿã@ÉÃUHåHì}üHuð¿Ü@èÛþÿÿ¸ÉÃóÃfffff.Hl$ØL|$øH- L=
Ld$àLl$èLt$ðH\$ÐHì8L)ýAþIõHÁýIÔèSþÿÿHít1Û@LâLîD÷AÿßHÃH9ërêH
\Hl$Ld$▒Ll$ Lt$(L|$0HÄ8ÃUHåSH
Høÿt»¨`DHÿÐHHøÿuñH[ÉÃHè_þÿÿHÃHello worlc$äþÿÿÿÿÿx▒ÿÿÿzRx
zRx                                                                                Ì@ AC
  þÿÿ$4þÿÿJf@ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
È@@@õþÿoh@è@@                @
sim@idrogeno:~/script/gcc/tmp$</pre>
<p>Bene. Ogni tanto capita di avere a che fare con spazzatura illeggibile.<br />
Ora, se apriamo il binario con <strong>vim -b hw</strong> avvertiamo l'editor che sta per aprire un binario, quindi che stia attento.<br />
Il codice è comunque ancora illeggibile.<br />
Per rendere piu' chiaro l'hex interno usiamo l'opzione <strong>:set display=uhex</strong> che visualizza i vari valori byte per byte.<br />
Dovremmo vedere qualcosa tipo:</p>
<pre><7f>ELF<02><01><01><00><00><00>
[...]</pre>
<p>Per essere in grado di lavorare sul serio sul codice piu&#8217; comodamente è necessario convertire il testo (o meglio, fare un <strong>hexdump</strong>) ulteriormente con un programma unix che si chiama xxd (<a href="http://www.rt.com/man/xxd.1.html">man</a>) attraverso l&#8217;opzione <strong>:%!xxd</strong> (modifica tutto il file [%] usando il comando esterno [!] xxd). Avremo quindi:</p>
<pre>sim@idrogeno:~/script/gcc/tmp$ head hw.xxd
0000000: 7f45 4c46 0201 0100 0000 0000 0000 0000  .ELF............
0000010: 0200 3e00 0100 0000 e003 4000 0000 0000  ..>.......@.....
0000020: 4000 0000 0000 0000 c010 0000 0000 0000  @...............
0000030: 0000 0000 4000 3800 0800 4000 2500 2200  ....@.8...@.%.".
0000040: 0600 0000 0500 0000 4000 0000 0000 0000  ........@.......
0000050: 4000 4000 0000 0000 4000 4000 0000 0000  @.@.....@.@.....
0000060: c001 0000 0000 0000 c001 0000 0000 0000  ................
0000070: 0800 0000 0000 0000 0300 0000 0400 0000  ................
0000080: 0002 0000 0000 0000 0002 4000 0000 0000  ..........@.....
0000090: 0002 4000 0000 0000 1c00 0000 0000 0000  ..@.............</pre>
<p>Ora possiamo modificare il programma con vim andando a toccare i codici hex nella parte centrale (la parte letterale è irrilevante).<br />
Posizionandoci su un carattere nella parte letterale e utilizzando il comando <strong>ga</strong> possiamo vedere che vim ci annuncia la codifica in hex corrispondente (e, ovviamente, presente nella parte centrale nel caso di caratteri).<br />
E&#8217; fondamentale, finite le modifiche al codice, reversare il dump con <strong>:%!xxd -r</strong> e poi salvare l&#8217;eseguibile con vim come normale.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.simotrone.it/2009/02/13/vim-e-il-binario-con-xxd/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>MySQL, API e C (2)</title>
		<link>http://www.simotrone.it/2009/01/24/mysql-api-e-c-2/</link>
		<comments>http://www.simotrone.it/2009/01/24/mysql-api-e-c-2/#comments</comments>
		<pubDate>Sat, 24 Jan 2009 05:40:24 +0000</pubDate>
		<dc:creator>Simotrone</dc:creator>
				<category><![CDATA[Binary People]]></category>
		<category><![CDATA[api]]></category>
		<category><![CDATA[C]]></category>
		<category><![CDATA[Mysql]]></category>

		<guid isPermaLink="false">http://www.simotrone.it/?p=1184</guid>
		<description><![CDATA[Funzionozze per interrogare MySQL con il C.
La lista completa delle funzioni sul sito di MySQL.
Prototipo di mysql_init(), per allocare memoria e inizializzare l&#8217;oggetto MYSQL. 
proto: MYSQL *mysql_init(MYSQL *mysql)
Dopo aver inizializzato l&#8217;oggetto si puo&#8217; creare la connessione al db con mysql_real_connect().
proto: MYSQL *mysql_real_connect(MYSQL *mysql, const char *host,
     const char *user, const char [...]]]></description>
			<content:encoded><![CDATA[<p>Funzionozze per interrogare MySQL con il C.<br />
La <a href="http://dev.mysql.com/doc/refman/5.1/en/c-api-function-overview.html">lista completa delle funzioni</a> sul sito di MySQL.</p>
<p>Prototipo di <a href="http://dev.mysql.com/doc/refman/5.1/en/mysql-init.html">mysql_init()</a>, per allocare memoria e inizializzare l&#8217;oggetto MYSQL. </p>
<pre>proto: MYSQL *mysql_init(MYSQL *mysql)</pre>
<p>Dopo aver inizializzato l&#8217;oggetto si puo&#8217; creare la connessione al db con <a href="http://dev.mysql.com/doc/refman/5.1/en/mysql-real-connect.html">mysql_real_connect()</a>.</p>
<pre>proto: MYSQL *mysql_real_connect(MYSQL *mysql, const char *host,
     const char *user, const char *passwd, const char *db,
     unsigned int port, const char *unix_socket, unsigned long client_flag)</pre>
<p>Esempio: mysql_real_connect(&#038;mysql, host, user, pass, db_name, 0, NULL, 0)</p>
<p>La <a href="http://dev.mysql.com/doc/refman/5.1/en/mysql-real-query.html">query</a> si chiama col prototipo che segue inserendo la stringa <strong>stmt_str</strong> e la lunghezza della stessa (es.: con <strong>strlen()</strong>). Se ritorna zero, la query è avvenuta.</p>
<pre>proto:  int mysql_real_query(MYSQL *mysql, const char *stmt_str,
     unsigned long length)</pre>
<p>L&#8217;analisi del risultato è un po&#8217; macchinosa.</p>
<p>Il risultato della query viene incamerato grazie alla funzione <a href="http://dev.mysql.com/doc/refman/5.1/en/mysql-store-result.html">mysql_store_result()</a> che incamera i dati nella struct MYSQL_RES.</p>
<pre>proto: MYSQL_RES *mysql_store_result(MYSQL *mysql)</pre>
<p>Esempio:</p>
<pre>MYSQL mysql;
MYSQL_RES *result;

[ blah blah blah... ]
result = mysql_store_result(&#038;mysql)</pre>
<p>Notare che result rappresenta il risultato della query, sia esso</p>
<ol>
<li>Nullo perchè la query non è andata a buon fine</li>
<li>Con dati causati da un SELECT o uno SHOW.</li>
<li>Con risultato ma senza dati causato magari da un INSERT (che non spamma righe ma un risultato di righe modificate).</li>
</ol>
<p>La struct MYSQL_RES di result puo&#8217; venire esplorata con varie funzioni.</p>
<p>La funzione principale è probabilmente <a href="http://dev.mysql.com/doc/refman/5.1/en/mysql-fetch-row.html">mysql_fetch_row(result)</a> che estrae le singole righe dal result set.</p>
<pre>proto: MYSQL_ROW mysql_fetch_row(MYSQL_RES *result)</pre>
<p>Il numero di valori nella riga (i campi restituiti) è dato da <a href="http://dev.mysql.com/doc/refman/5.1/en/mysql-num-fields.html">mysql_num_fields(result)</a> e <a href="http://dev.mysql.com/doc/refman/5.1/en/mysql-num-rows.html">mysql_num_rows()</a> conta le righe restituite.</p>
<pre>proto: unsigned int mysql_num_fields(MYSQL_RES *result)

proto: my_ulonglong mysql_num_rows(MYSQL_RES *result)</pre>
<p>Questo dovrebbe bastare per &#8220;navigare&#8221; i risultati della SELECT query (un bell&#8217;esempio per ciclare i risultati della query lo si trova <a href="http://dev.mysql.com/doc/refman/5.1/en/mysql-fetch-row.html">in fondo alla pagina del fetch</a>).</p>
<p>Per chiudere le operazioni, usare <a href="http://dev.mysql.com/doc/refman/5.1/en/mysql-free-result.html">mysql_free_result(result)</a> per liberare la memoria allocata per il <em>result set</em> e <a href="http://dev.mysql.com/doc/refman/5.1/en/mysql-close.html">mysql_close(&#038;mysql)</a>.</p>
<hr/>
Aggiuntine.</p>
<p><a href="http://dev.mysql.com/doc/refman/5.1/en/mysql-fetch-fields.html">mysql_fetch_result(result)</a> parsa i campi.</p>
<pre>proto: MYSQL_FIELD *mysql_fetch_fields(MYSQL_RES *result)

num_fields = mysql_num_fields(result);
fields = mysql_fetch_fields(result);
for(i = 0; i < num_fields; i++)
{
   printf("Field %u is %s\n", i, fields[i].name);
}</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.simotrone.it/2009/01/24/mysql-api-e-c-2/feed/</wfw:commentRss>
		<slash:comments>1</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 la connessione al database (le [...]]]></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 dati da mandare [...]]]></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 la [...]]]></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 la 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 di memoria [...]]]></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, AF_INET6, AF_UNIX), il [...]]]></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>Ant Attack</title>
		<link>http://www.simotrone.it/2008/12/27/ant-attack/</link>
		<comments>http://www.simotrone.it/2008/12/27/ant-attack/#comments</comments>
		<pubDate>Sat, 27 Dec 2008 05:20:23 +0000</pubDate>
		<dc:creator>Simotrone</dc:creator>
				<category><![CDATA[Binary People]]></category>
		<category><![CDATA[Gamesgeek]]></category>
		<category><![CDATA[ant attack]]></category>
		<category><![CDATA[C]]></category>
		<category><![CDATA[gamegeek]]></category>

		<guid isPermaLink="false">http://www.simotrone.it/?p=1089</guid>
		<description><![CDATA[Poiche&#8217; qualcuno, piu&#8217; o meno giustamente, mi addita ancora come un game-geek&#8230; 
Sleggiucchiando qua e là a proposito di programmazione in C e altro mi sono imbattuto in Sandy White e il suo Ant Attack.
Tra i «veri programmatori» occorrerebbe menzionare l&#8217;inglese Sandy White, che scrisse nel 1983 il primo videogame in proiezione isometrica, 3D_Ant_Attack 3D, [...]]]></description>
			<content:encoded><![CDATA[<p>Poiche&#8217; <a href="http://blog.pythonaro.com/index.html">qualcuno</a>, piu&#8217; o meno giustamente, mi addita ancora come un <strong>game-geek</strong>&#8230; <img src='http://www.simotrone.it/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /><br />
Sleggiucchiando qua e là a proposito di programmazione in C e altro mi sono imbattuto in Sandy White e il suo <a href="http://sandywhite.co.uk/fun/ants/">Ant Attack</a>.</p>
<blockquote><p>Tra i «veri programmatori» occorrerebbe menzionare l&#8217;inglese Sandy White, che scrisse nel 1983 il primo videogame in proiezione isometrica, 3D_Ant_Attack 3D, per il Sinclair ZX Spectrum in puro assembler Zilog Z80 e Basic Spectrum, utilizzando solo carta e matita; solo dopo aver accuratamente completato il lavoro su carta, assemblò &#8220;a mano&#8221; il lavoro ed immise i codici esadecimali direttamente in memoria.</p></blockquote>
<p>(da wiki)</p>
<p>Questo foglio:<br />
<img src="http://sandywhite.co.uk/fun/ants/pics/AAgraphic002.jpg" alt="Ant attack graphics" /><br />
non ha prezzo.</p>
<blockquote><p>graphics were designed on squared paper, each filled square taken as a binary 1, each empty square as 0, converted into hex and then typed in. These are original drawings for the boy (in striding pose). It&#8217;s quite difficult to make anything recognisable with only 16 x 16 pixels &#8211; the grenade on his his belt is only one pixel!</p></blockquote>
<p>Stupendo.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.simotrone.it/2008/12/27/ant-attack/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 7 ip
$ man socket
$ [...]]]></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>
