<?xml version="1.0" encoding="UTF-8"?><!-- generator="wordpress.com" -->
<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/"
	>

<channel>
	<title>setsockopt &amp;laquo; WordPress.com Tag Feed</title>
	<link>http://en.wordpress.com/tag/setsockopt/</link>
	<description>Feed of posts on WordPress.com tagged "setsockopt"</description>
	<pubDate>Tue, 22 Dec 2009 20:45:18 +0000</pubDate>

	<generator>http://en.wordpress.com/tags/</generator>
	<language>en</language>

<item>
<title><![CDATA[setsockopt SO_LINGER]]></title>
<link>http://cotton5415.wordpress.com/2009/10/30/setsockopt-so_linger/</link>
<pubDate>Fri, 30 Oct 2009 02:51:16 +0000</pubDate>
<dc:creator>cotton5415</dc:creator>
<guid>http://cotton5415.wordpress.com/2009/10/30/setsockopt-so_linger/</guid>
<description><![CDATA[SO_LINGER: 只針對 socket 的 close() 發揮作用。 case 1 (default): linger-&gt;l_onoff = 0; &#8211;&gt; linger-]]></description>
<content:encoded><![CDATA[<div class='snap_preview'><p>SO_LINGER:<br />
只針對 socket 的 close() 發揮作用。<br />
case 1 (default):<br />
    linger-&#62;l_onoff = 0; &#8211;&#62; linger-&#62;l_linger no effect;<br />
case 2:<br />
    linger-&#62;l_onoff !=0; linger-&#62;l_linger = 0 ;<br />
    close() immediately. 不管底層的資料是否送出，直接送一個 RST(reset)給另一端。因此另一端在 recv的時候，會產生 ECONNRESET 的 error</p>
<p>case 3:<br />
    linger-&#62;l_onff != 0; linger-&#62;l_linger != 0;<br />
    close() 會 block住或是等到 l_linger 的timeout時間到之後，產生 EWOULDBLOCK error </p>
<p>ref: http://www.developerweb.net/forum/archive/index.php/t-2982.html</p>
</div>]]></content:encoded>
</item>
<item>
<title><![CDATA[Enabling broadcast option on a socket!]]></title>
<link>http://nibuthomas.com/2008/03/30/enabling-broadcast-option-on-a-socket/</link>
<pubDate>Sun, 30 Mar 2008 06:39:22 +0000</pubDate>
<dc:creator>Nibu Thomas</dc:creator>
<guid>http://nibuthomas.com/2008/03/30/enabling-broadcast-option-on-a-socket/</guid>
<description><![CDATA[In order to enable broadcasting option on a socket you&#8217;ve got to enable it via a call to setso]]></description>
<content:encoded><![CDATA[<div class='snap_preview'><p>In order to enable broadcasting option on a socket you&#8217;ve got to enable it via a call to <em>setsockopt</em> with optname set to <em>SO_BROADCAST</em> and level set to <em>SOL_SOCKET</em>!</p>
<p>Here is a function which does this!</p>
<pre class="brush: cpp;">bool SetBroadcastOn( const bool Enable )
{
    const BOOL bEnable = Enable;
    if( setsockopt( sckHandle,
                    SOL_SOCKET,
                    SO_BROADCAST,
                    (const char*)&amp;bEnable ,
                    sizeof( blEnable )) != 0 )
    {
        return false;
    }   

    // Success
    return true;
}// End EnableBroadcast</pre>
</div>]]></content:encoded>
</item>
<item>
<title><![CDATA[C Socket Programming in the UNIX environment - part 5]]></title>
<link>http://fripp.wordpress.com/2007/12/12/c-socket-programming-in-the-unix-environment-part-5/</link>
<pubDate>Wed, 12 Dec 2007 19:28:04 +0000</pubDate>
<dc:creator>fripp</dc:creator>
<guid>http://fripp.wordpress.com/2007/12/12/c-socket-programming-in-the-unix-environment-part-5/</guid>
<description><![CDATA[Ecco il codice di una semplicissima applicazione client-server che simula il servizio daytime. In ma]]></description>
<content:encoded><![CDATA[<div class='snap_preview'><p>Ecco il codice di una semplicissima applicazione client-server che simula il servizio daytime. In maniera molto banale, il client si connette al server per ottenere data e ora corrente.</p>
<p>Ecco il codice del server:</p>
<p><!--more--></p>
<pre class="brush: cpp;">

#include &lt;stdio.h&gt;
#include &lt;stdlib.h&gt;
#include &lt;sys/types.h&gt;
#include &lt;unistd.h&gt;
#include &lt;netdb.h&gt;
#include &lt;time.h&gt;
#include &lt;string.h&gt;
#include &lt;sys/socket.h&gt;
#include &lt;arpa/inet.h&gt;

#define BACKLOG 10

int main (int argc, const char * argv[]) {
    int list_fd,conn_fd;
    struct sockaddr_in serv_add;
    char buffer[80];
    time_t timeval;

    //creiamo la socket
    if((list_fd=socket(AF_INET,SOCK_STREAM,0))&lt;0){
        perror(&quot;socket creation error\n&quot;);
        exit(-1);
    }

    //la funzione memset azzera la memoria riservata alla struttura serv_add
    memset((void*)&amp;serv_add,0,sizeof(serv_add));

    //inizializziamo la struttura in maniera opportuna
    serv_add.sin_family=AF_INET;    //specifica che useremo il protocollo IPv4
    serv_add.sin_port=htons(13);    //specifichiamo la porta su cui si mette in ascolto il server
                                    //usiamo la htons per impostare il valore corretto in network byte order

    serv_add.sin_addr.s_addr=htonl(INADDR_ANY);        

    //la funzione setsockopt permette di impostare delle opzioni per la socket che
    //si sta usando.
    //in particolare, questa chiamata alla funzione permette di riutilizzare la porta
    //della socket anche dopo che la connessione è stata chiusa.
    //senza la chiamata a questa funzione, alla chiusura della connessione la porta appena
    //usata non è momentaneamente disponibile, perchè risulta esser ancora allocata a livello kernel
    int yes=1;
    if(setsockopt(list_fd,SOL_SOCKET,SO_REUSEADDR,&amp;yes,sizeof(int))&lt;0){
        perror(&quot;setsockopt\n&quot;);
        exit(-1);
    }

    //facciamo il binding della socket con la struttura che descrive l'indirizzo
    if(bind(list_fd,(struct sockaddr*)&amp;serv_add,sizeof(serv_add))&lt;0){
        perror(&quot;bind error\n&quot;);
        exit(-1);
    }

    //mettiamo il server in ascolto sulla socket
    if(listen(list_fd,BACKLOG)&lt;0){
        perror(&quot;listen error\n&quot;);
        exit(-1);

    }

    //all'interno del ciclo while il server accetta le connessioni
    //la funzione 'accept' restituisce la socket su cui il server gestirà la connessione
    //col client
    while(1){
        struct sockaddr_in tmp;
        unsigned int addrlen=sizeof(tmp);
        memset((void*)&amp;tmp,0,sizeof(tmp));
        if((conn_fd=accept(list_fd,(struct sockaddr*)NULL,NULL))&lt;0){
            perror(&quot;accept error\n&quot;);
            exit(-1);
        }
        //la funzione getpeername permette di ottenere informazioni sul client
        //la funzione prende come argomenti la socket di connessione,
        //una struttura di tipo sockaddr_in e un puntatore alla dimensione
        //in bytes della struttura
        getpeername(conn_fd,(struct sockaddr*)&amp;tmp,&amp;addrlen);

        //attraverso la funzione inet_ntoa trasformiamo l'indirizzo del client in una stringa in notazione decimale puntata
        printf(&quot;Client IP: %s\nClient port: %d\n&quot;,inet_ntoa(tmp.sin_addr),tmp.sin_port);
        timeval=time(NULL);

        //il server calcola la data corrente e la manda al client attraverso la funzione write
        snprintf(buffer,sizeof(buffer),&quot;%.24s\r\n&quot;,ctime(&amp;timeval));

        //la funzione write prende come argomenti:
        //1) la socket di connessione
        //2) il buffer contenente le informazioni da trasmettere
        //3) la lunghezza del buffer in bytes

        //il secondo parametro della write è un void*
        if(write(conn_fd,buffer,strlen(buffer))&lt;0){
            perror(&quot;write error\n&quot;);
            exit(-1);
        }

        //chiudiamo la connessione
        close(conn_fd);
    }

    return 0;
}</pre>
<p>Ecco il codice del client:</p>
<pre class="brush: cpp;">

#include &lt;stdio.h&gt;
#include &lt;sys/types.h&gt;
#include &lt;arpa/inet.h&gt;
#include &lt;sys/socket.h&gt;
#include &lt;netinet/in.h&gt;
#include &lt;string.h&gt;

int main (int argc, const char * argv[]) {
    int sock_fd;    //descrittore della socket
    int nread;
    struct sockaddr_in serv_add;    //conterr√† le informazioni relative al server
    char buffer[80];
    char indirizzo_server[]=&quot;127.0.0.1&quot;;

    //crea la socket TCP
    if( (sock_fd=socket(AF_INET,SOCK_STREAM,0))&lt;0 ){
        perror(&quot;Socket creation error\n&quot;);
        return -1;
    }

    //inizializza l'indirizzo del server

    //azzeriamo la struttura che descrive la socket
    memset((void*)&amp;serv_add,0,sizeof(struct sockaddr_in));
    serv_add.sin_family=AF_INET;    //address family inet IPv4
    serv_add.sin_port=htons(13);    //definiamo il numero di porta
                                    //in particolare la funzione htons converte
                                    //bytes in host order in bytes in network order

    //la funzione inet_pton converte una stringa &quot;dotted decimal&quot; in un indirizzo &quot;utile&quot;
    if( inet_pton(AF_INET,indirizzo_server,&amp;serv_add.sin_addr) &lt;= 0){
        perror(&quot;Address creation error\n&quot;);
        return -1;
    }

    //stabilisce la connessione
    if(connect(sock_fd,(struct sockaddr*) &amp;serv_add,sizeof(serv_add))&lt;0){
        perror(&quot;Connection error&quot;);
        return -1;
    }

    //legge le informazioni trasmesse dal server
    while((nread=read(sock_fd,buffer,80))&gt;0){
        buffer[nread]=0;
        if(fputs(buffer,stdout)==EOF){
            perror(&quot;fputs error&quot;);
            return -1;
        }
    }

    if(nread&lt;0){
        perror(&quot;Read error&quot;);
        return -1;
    }

    close(sock_fd);

    return 0;
}</pre>
<p>Possiamo notare come il server di cui ho postato il codice non è un server &#8220;concorrente&#8221;, ma &#8220;iterativo&#8221;. Ciò vuol dire che questo server è in grado di servire una sola richiesta alla volta. Per implementare un server concorrente è necessario saper gestire la crezione e l&#8217;esecuzione di processi e thread in concorrenza. Spero in futuro di poter parlare di questi argomenti (tempo permettendo!).</p>
<p>Buona programmazione. (I file sorgente li trovate <a TARGET="_blank" HREF="http://www.mediafire.com/?sharekey=07a6fc3509746b714012e8015643d9c8f68f4869dda94415">qui</a>)</p>
</div>]]></content:encoded>
</item>

</channel>
</rss>
