http://livre.g6.asso.fr/index.php?title=L%27interface_socket&feed=atom&action=history L'interface socket - Revision history 2024-03-29T01:07:59Z Revision history for this page on the wiki MediaWiki 1.25.2 http://livre.g6.asso.fr/index.php?title=L%27interface_socket&diff=2953&oldid=prev Bruno Deniaud at 10:42, 27 February 2006 2006-02-27T10:42:04Z <p></p> <table class='diff diff-contentalign-left'> <col class='diff-marker' /> <col class='diff-content' /> <col class='diff-marker' /> <col class='diff-content' /> <tr style='vertical-align: top;'> <td colspan='2' style="background-color: white; color:black; text-align: center;">← Older revision</td> <td colspan='2' style="background-color: white; color:black; text-align: center;">Revision as of 10:42, 27 February 2006</td> </tr><tr><td colspan="2" class="diff-lineno" id="L1" >Line 1:</td> <td colspan="2" class="diff-lineno">Line 1:</td></tr> <tr><td colspan="2">&#160;</td><td class='diff-marker'>+</td><td style="color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div><ins style="font-weight: bold; text-decoration: none;">{{suivi| L'interface de programmation &quot;socket&quot; IPv6 | L'interface de programmation &quot;socket&quot; IPv6 | Les primitives de conversion entre noms et adresses | Les primitives de conversion entre noms et adresses }}</ins></div></td></tr> <tr><td class='diff-marker'>&#160;</td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>La création d'une socket se fait comme auparavant en appelant la primitive socket. La distinction entre les protocoles IPv4 et IPv6 se fait sur la valeur du premier argument passé à &lt;tt&gt;socket&lt;/tt&gt;, à savoir la famille d'adresses (ou de protocoles), c'est-à-dire ici &lt;tt&gt;PF_INET&lt;/tt&gt; ou &lt;tt&gt;PF_INET6&lt;/tt&gt;. Par exemple, si on veut créer un socket IPv4/UDP, on écrira :</div></td><td class='diff-marker'>&#160;</td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>La création d'une socket se fait comme auparavant en appelant la primitive socket. La distinction entre les protocoles IPv4 et IPv6 se fait sur la valeur du premier argument passé à &lt;tt&gt;socket&lt;/tt&gt;, à savoir la famille d'adresses (ou de protocoles), c'est-à-dire ici &lt;tt&gt;PF_INET&lt;/tt&gt; ou &lt;tt&gt;PF_INET6&lt;/tt&gt;. Par exemple, si on veut créer un socket IPv4/UDP, on écrira :</div></td></tr> <tr><td class='diff-marker'>&#160;</td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"></td><td class='diff-marker'>&#160;</td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"></td></tr> <tr><td colspan="2" class="diff-lineno" id="L56" >Line 56:</td> <td colspan="2" class="diff-lineno">Line 57:</td></tr> <tr><td class='diff-marker'>&#160;</td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"></td><td class='diff-marker'>&#160;</td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"></td></tr> <tr><td class='diff-marker'>&#160;</td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>Cette constante et cette variable sont définies dans le fichier &lt;tt&gt;netinet/in.h&lt;/tt&gt;.</div></td><td class='diff-marker'>&#160;</td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>Cette constante et cette variable sont définies dans le fichier &lt;tt&gt;netinet/in.h&lt;/tt&gt;.</div></td></tr> <tr><td colspan="2">&#160;</td><td class='diff-marker'>+</td><td style="color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div><ins style="font-weight: bold; text-decoration: none;">{{suivi| L'interface de programmation &quot;socket&quot; IPv6 | L'interface de programmation &quot;socket&quot; IPv6 | Les primitives de conversion entre noms et adresses | Les primitives de conversion entre noms et adresses }}</ins></div></td></tr> </table> Bruno Deniaud http://livre.g6.asso.fr/index.php?title=L%27interface_socket&diff=2264&oldid=prev Laurent Toutain: /* L'adresse de bouclage */ 2005-12-14T06:04:47Z <p>‎<span dir="auto"><span class="autocomment">L&#039;adresse de bouclage</span></span></p> <table class='diff diff-contentalign-left'> <col class='diff-marker' /> <col class='diff-content' /> <col class='diff-marker' /> <col class='diff-content' /> <tr style='vertical-align: top;'> <td colspan='2' style="background-color: white; color:black; text-align: center;">← Older revision</td> <td colspan='2' style="background-color: white; color:black; text-align: center;">Revision as of 06:04, 14 December 2005</td> </tr><tr><td colspan="2" class="diff-lineno" id="L42" >Line 42:</td> <td colspan="2" class="diff-lineno">Line 42:</td></tr> <tr><td class='diff-marker'>&#160;</td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>La constante &lt;tt&gt;IN6ADDR_ANY_INIT&lt;/tt&gt; et la variable &lt;tt&gt;in6addr_any&lt;/tt&gt; sont toutes deux définies dans le fichier &lt;tt&gt;netinet/in.h&lt;/tt&gt;.</div></td><td class='diff-marker'>&#160;</td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>La constante &lt;tt&gt;IN6ADDR_ANY_INIT&lt;/tt&gt; et la variable &lt;tt&gt;in6addr_any&lt;/tt&gt; sont toutes deux définies dans le fichier &lt;tt&gt;netinet/in.h&lt;/tt&gt;.</div></td></tr> <tr><td class='diff-marker'>&#160;</td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"></td><td class='diff-marker'>&#160;</td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"></td></tr> <tr><td class='diff-marker'>−</td><td style="color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;"><div>==L'adresse de bouclage==</div></td><td class='diff-marker'>+</td><td style="color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div>==<ins class="diffchange diffchange-inline">&lt;div id=&quot;loopback&quot;&gt;</ins>L'adresse de bouclage<ins class="diffchange diffchange-inline">&lt;/div&gt;</ins>==</div></td></tr> <tr><td class='diff-marker'>&#160;</td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"></td><td class='diff-marker'>&#160;</td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"></td></tr> <tr><td class='diff-marker'>&#160;</td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>En IPv4, c'est la constante &lt;tt&gt;INADDR_LOOPBACK&lt;/tt&gt;. En IPv6, de manière tout à fait similaire à l'adresse &quot;wildcard&quot;, il y a deux façons d'affecter cette adresse. Ceci peut se faire au moment de la déclaration avec la constante &lt;tt&gt;IN6ADDR_LOOPBACK_INIT&lt;/tt&gt; :</div></td><td class='diff-marker'>&#160;</td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>En IPv4, c'est la constante &lt;tt&gt;INADDR_LOOPBACK&lt;/tt&gt;. En IPv6, de manière tout à fait similaire à l'adresse &quot;wildcard&quot;, il y a deux façons d'affecter cette adresse. Ceci peut se faire au moment de la déclaration avec la constante &lt;tt&gt;IN6ADDR_LOOPBACK_INIT&lt;/tt&gt; :</div></td></tr> </table> Laurent Toutain http://livre.g6.asso.fr/index.php?title=L%27interface_socket&diff=2263&oldid=prev Laurent Toutain at 06:03, 14 December 2005 2005-12-14T06:03:37Z <p></p> <p><b>New page</b></p><div>La création d'une socket se fait comme auparavant en appelant la primitive socket. La distinction entre les protocoles IPv4 et IPv6 se fait sur la valeur du premier argument passé à &lt;tt&gt;socket&lt;/tt&gt;, à savoir la famille d'adresses (ou de protocoles), c'est-à-dire ici &lt;tt&gt;PF_INET&lt;/tt&gt; ou &lt;tt&gt;PF_INET6&lt;/tt&gt;. Par exemple, si on veut créer un socket IPv4/UDP, on écrira :<br /> <br /> sock = socket(PF_INET, SOCK_DGRAM, 0);<br /> <br /> tandis qu'une création de socket IPv6/UDP se fera ainsi :<br /> <br /> sock = socket(PF_INET6, SOCK_DGRAM, 0);<br /> <br /> Une erreur de programmation classique consiste à utiliser &lt;tt&gt;AF_INET&lt;/tt&gt; à la place de &lt;tt&gt;PF_INET&lt;/tt&gt;. Cela n'a pas d'effet en général car rares sont les systèmes pour lesquels ces deux constantes diffèrent. Pour éviter en IPv6 des problèmes liés à cette erreur, il est demandé que les deux constantes &lt;tt&gt;PF_INET6&lt;/tt&gt; et &lt;tt&gt;AF_INET6&lt;/tt&gt; soient identiques.<br /> <br /> Quant aux autres primitives constituant l'interface socket, leur syntaxe reste inchangée. Il faut simplement leur fournir des adresses IPv6, en l'occurrence des pointeurs vers des structures de type &lt;tt&gt;struct sockaddr_in6&lt;/tt&gt; au préalable convertis en des pointeurs vers des structures génériques de type &lt;tt&gt;struct sockaddr&lt;/tt&gt;.<br /> <br /> Donnons pour mémoire une liste des primitives les plus importantes :<br /> <br /> bind() connect() sendmsg()<br /> sendto() accept() recvfrom()<br /> recvmsg() getsockname() getpeername()<br /> <br /> ==&lt;div id=&quot;wildcard&quot;&gt;L'adresse &quot;wildcard&quot;&lt;/div&gt;==<br /> <br /> Lors du nommage d'une socket via la primitive &lt;tt&gt;bind&lt;/tt&gt;, il arrive fréquemment qu'une application (par exemple un serveur TCP) laisse au système la détermination de l'adresse source pour elle. En IPv4, pour ce faire, elle passe à bind une structure &lt;tt&gt;sockaddr_in&lt;/tt&gt; avec le champ &lt;tt&gt;sin_addr.s_addr&lt;/tt&gt; ayant pour valeur la constante &lt;tt&gt;INADDR_ANY&lt;/tt&gt;, constante définie dans le fichier &lt;tt&gt;netinet/in.h&lt;/tt&gt;.<br /> <br /> En IPv6, il y a deux manières de faire cela, à cause des règles du langage C sur les initialisations et affectations de structures. La première est d'initialiser une structure de type &lt;tt&gt;struct in6_addr&lt;/tt&gt; par la constante &lt;tt&gt;IN6ADDR_ANY_INIT&lt;/tt&gt; :<br /> <br /> struct in6_addr any_addr = IN6ADDR_ANY_INIT;<br /> <br /> Attention, ceci ne peut se faire qu'au moment de la déclaration. Par exemple le code qui suit est incorrect (en C il est interdit d'affecter une constante complexe à une structure) :<br /> <br /> struct sockaddr_in6 sin6;<br /> <br /> sin6.sin6_addr = IN6ADDR_ANY_INIT; /* erreur de syntaxe !! */<br /> <br /> La seconde manière utilise une variable globale :<br /> <br /> extern const struct in6_addr in6addr_any;<br /> struct sockaddr_in6 sin6;<br /> <br /> sin6.sin6_addr = in6addr_any;<br /> <br /> Cette méthode n'est pas possible dans une déclaration de variable globale ou statique.<br /> <br /> La constante &lt;tt&gt;IN6ADDR_ANY_INIT&lt;/tt&gt; et la variable &lt;tt&gt;in6addr_any&lt;/tt&gt; sont toutes deux définies dans le fichier &lt;tt&gt;netinet/in.h&lt;/tt&gt;.<br /> <br /> ==L'adresse de bouclage==<br /> <br /> En IPv4, c'est la constante &lt;tt&gt;INADDR_LOOPBACK&lt;/tt&gt;. En IPv6, de manière tout à fait similaire à l'adresse &quot;wildcard&quot;, il y a deux façons d'affecter cette adresse. Ceci peut se faire au moment de la déclaration avec la constante &lt;tt&gt;IN6ADDR_LOOPBACK_INIT&lt;/tt&gt; :<br /> <br /> struct in6_addr loopback_addr = IN6ADDR_LOOPBACK_INIT;<br /> <br /> ou via la variable globale &lt;tt&gt;in6addr_loopback&lt;/tt&gt; :<br /> <br /> extern const struct in6_addr in6addr_loopback;<br /> struct sockaddr_in6 sin6;<br /> <br /> sin6.sin6_addr = in6addr_loopback;<br /> <br /> Cette constante et cette variable sont définies dans le fichier &lt;tt&gt;netinet/in.h&lt;/tt&gt;.</div> Laurent Toutain