http://livre.g6.asso.fr/index.php?title=L%27interface_socket&feed=atom&action=historyL'interface socket - Revision history2024-03-29T01:07:59ZRevision history for this page on the wikiMediaWiki 1.25.2http://livre.g6.asso.fr/index.php?title=L%27interface_socket&diff=2953&oldid=prevBruno Deniaud at 10:42, 27 February 20062006-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"> </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 "socket" IPv6 | L'interface de programmation "socket" 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'> </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é à <tt>socket</tt>, à savoir la famille d'adresses (ou de protocoles), c'est-à-dire ici <tt>PF_INET</tt> ou <tt>PF_INET6</tt>. Par exemple, si on veut créer un socket IPv4/UDP, on écrira :</div></td><td class='diff-marker'> </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é à <tt>socket</tt>, à savoir la famille d'adresses (ou de protocoles), c'est-à-dire ici <tt>PF_INET</tt> ou <tt>PF_INET6</tt>. Par exemple, si on veut créer un socket IPv4/UDP, on écrira :</div></td></tr>
<tr><td class='diff-marker'> </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'> </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'> </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'> </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="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 <tt>netinet/in.h</tt>.</div></td><td class='diff-marker'> </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 <tt>netinet/in.h</tt>.</div></td></tr>
<tr><td colspan="2"> </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 "socket" IPv6 | L'interface de programmation "socket" IPv6 | Les primitives de conversion entre noms et adresses | Les primitives de conversion entre noms et adresses }}</ins></div></td></tr>
</table>Bruno Deniaudhttp://livre.g6.asso.fr/index.php?title=L%27interface_socket&diff=2264&oldid=prevLaurent Toutain: /* L'adresse de bouclage */2005-12-14T06:04:47Z<p><span dir="auto"><span class="autocomment">L'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'> </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 <tt>IN6ADDR_ANY_INIT</tt> et la variable <tt>in6addr_any</tt> sont toutes deux définies dans le fichier <tt>netinet/in.h</tt>.</div></td><td class='diff-marker'> </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 <tt>IN6ADDR_ANY_INIT</tt> et la variable <tt>in6addr_any</tt> sont toutes deux définies dans le fichier <tt>netinet/in.h</tt>.</div></td></tr>
<tr><td class='diff-marker'> </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'> </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"><div id="loopback"></ins>L'adresse de bouclage<ins class="diffchange diffchange-inline"></div></ins>==</div></td></tr>
<tr><td class='diff-marker'> </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'> </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="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 <tt>INADDR_LOOPBACK</tt>. En IPv6, de manière tout à fait similaire à l'adresse "wildcard", il y a deux façons d'affecter cette adresse. Ceci peut se faire au moment de la déclaration avec la constante <tt>IN6ADDR_LOOPBACK_INIT</tt> :</div></td><td class='diff-marker'> </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 <tt>INADDR_LOOPBACK</tt>. En IPv6, de manière tout à fait similaire à l'adresse "wildcard", il y a deux façons d'affecter cette adresse. Ceci peut se faire au moment de la déclaration avec la constante <tt>IN6ADDR_LOOPBACK_INIT</tt> :</div></td></tr>
</table>Laurent Toutainhttp://livre.g6.asso.fr/index.php?title=L%27interface_socket&diff=2263&oldid=prevLaurent Toutain at 06:03, 14 December 20052005-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é à <tt>socket</tt>, à savoir la famille d'adresses (ou de protocoles), c'est-à-dire ici <tt>PF_INET</tt> ou <tt>PF_INET6</tt>. 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 <tt>AF_INET</tt> à la place de <tt>PF_INET</tt>. 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 <tt>PF_INET6</tt> et <tt>AF_INET6</tt> 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 <tt>struct sockaddr_in6</tt> au préalable convertis en des pointeurs vers des structures génériques de type <tt>struct sockaddr</tt>.<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 />
==<div id="wildcard">L'adresse "wildcard"</div>==<br />
<br />
Lors du nommage d'une socket via la primitive <tt>bind</tt>, 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 <tt>sockaddr_in</tt> avec le champ <tt>sin_addr.s_addr</tt> ayant pour valeur la constante <tt>INADDR_ANY</tt>, constante définie dans le fichier <tt>netinet/in.h</tt>.<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 <tt>struct in6_addr</tt> par la constante <tt>IN6ADDR_ANY_INIT</tt> :<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 <tt>IN6ADDR_ANY_INIT</tt> et la variable <tt>in6addr_any</tt> sont toutes deux définies dans le fichier <tt>netinet/in.h</tt>.<br />
<br />
==L'adresse de bouclage==<br />
<br />
En IPv4, c'est la constante <tt>INADDR_LOOPBACK</tt>. En IPv6, de manière tout à fait similaire à l'adresse "wildcard", il y a deux façons d'affecter cette adresse. Ceci peut se faire au moment de la déclaration avec la constante <tt>IN6ADDR_LOOPBACK_INIT</tt> :<br />
<br />
struct in6_addr loopback_addr = IN6ADDR_LOOPBACK_INIT;<br />
<br />
ou via la variable globale <tt>in6addr_loopback</tt> :<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 <tt>netinet/in.h</tt>.</div>Laurent Toutain