La Fibre
Télécom => Réseau => TCP/IP / Fonctionnement des réseaux => Discussion démarrée par: Marin le 10 décembre 2015 à 18:25:48
-
Effectivement, il est intéressant de savoir comment est fait le partage en 4, si un abonné à les ports 0 à 16383, le second les ports 16384 à 32767, ect...
Il n'y a pas de port 0.
-
Il n'y a pas de port 0.
Il me semblait qu'il y avait 2^16 ports, numérotés de 0 à 65535.
-
Le port UDP et TCP utilisent bien des numéros de ports sur 16 bits, ce qui donne 2^16 valeurs possibles pour chaque port (source et destination), ce qui ne veut pas dire que toutes les valeurs sont possibles.
-
On peut pas utiliser le port de sous réseaux ;D (désolé je sors)
-
Le port UDP et TCP utilisent bien des numéros de ports sur 16 bits, ce qui donne 2^16 valeurs possibles pour chaque port (source et destination), ce qui ne veut pas dire que toutes les valeurs sont possibles.
Il semble bien exister. (http://www.iana.org/assignments/service-names-port-numbers/service-names-port-numbers.xhtml)
-
Il me semblait qu'il y avait 2^16 ports, numérotés de 0 à 65535.
Pas valide :
0 tcp Reserved
0 udp Reserved
-
Il me semblait qu'il y avait 2^16 ports, numérotés de 0 à 65535.
oui mais '0' peut poser des problèmes a cause de certaines implèmentations de TCP ou UDP et de certaines API et logiciels, donc on évite de s'en servir. Mais en théorie on pourrait. L'IANA l'a donc marqué comme "réservé".
-
Pas valide :
Donc, il existe.
-
oui mais '0' peut poser des problèmes a cause de certaines implèmentations de TCP ou UDP et de certaines API et logiciels, donc on évite de s'en servir. Mais en théorie on pourrait. L'IANA l'a donc marqué comme "réservé".
Donc, il y a bien un port 0.
-
En TCP ou en UDP, le port 0 existe mais est réservé. Sur d'autres protocoles de couche Transport ça peut etre différent.
-
Il semble bien exister. (http://www.iana.org/assignments/service-names-port-numbers/service-names-port-numbers.xhtml)
Cela commence bien :
Service Name and Transport Protocol Port Number Registry - RFC 6335 (http://www.iana.org/assignments/service-names-port-numbers/service-names-port-numbers.xhtml)
based on three ranges: System
Ports (0-1023), User Ports (1024-49151), and the Dynamic and/or Private
Ports (49152-65535);
Foutaise absolue, il n'y a aucun port privé ou dynamique ou utilisateur.
Les ports à partir de 1024 sont sémantiquement équivalents. L'implèmentation TCP/UDP ne fait absolument aucune différence entre eux.
-
Il n'y a pas de port 0.
Je parle exclusivement de çà.
-
Foutaise absolue, il n'y a aucun port privé ou dynamique ou utilisateur.
si tu n'as juste pas compris a quoi ca sert.
lit: http://tools.ietf.org/html/rfc6335#section-6
et : http://tools.ietf.org/html/rfc6335#section-8.1.2
Donc, il existe.
oui tout a fait. mais il ne faut pas l'utiliser car dans l'avenir l'IANA pourrait decider de l'utiliser pour une extension ou autre:
o Reserved: Reserved port numbers are not available for regular
assignment; they are "assigned to IANA" for special purposes.
Reserved port numbers include values at the edges of each range,
e.g., 0, 1023, 1024, etc., which may be used to extend these
ranges or the overall port number space in the future.
-
La valeur 0 n'est pas un numéro de port, c'est tout.
-
Nous resterons donc en désaccord sur ce point.
-
Jamais utilisé le port 0 mais il existe, après il faut bien trouver une application qui écoute sur ce port pour le sortir de la catégorie légende urbaine. Faut voir aussi pour le NAT s'il serait possible vers un port 0.
Pour l'info il existe aussi des protocoles qui n'utilisent pas de ports, comme ICMP.
-
On peut tout à fait utiliser le port 0 en tcp/udp. Le problème c'est juste que dans beaucoup d'implèmentations il est utiliser pour sélectionner le premier port local disponible et beaucoup de programmes le considère invalide mais j'ai déjà essayé et ça marche normalement.
-
On peut tout à fait utiliser le port 0 en tcp/udp. Le problème c'est juste que dans beaucoup d'implèmentations il est utiliser pour sélectionner le premier port local disponible et beaucoup de programmes le considère invalide mais j'ai déjà essayé et ça marche normalement.
Tu as testé sur quel OS?
Reserved signifie INTERDIT!
-
reserved != forbidden
-
Tu as testé sur quel OS?
OpenBSD/Linux
-
De toute façon les ports de 0 à 1024 sont réservé, donc pas la peine d'épiloguer on ne peut pas s'en servir.
Après il y a du choix ::)
-
OpenBSD/Linux
Tu as encore le programme?
-
Tu as encore le programme?
Prends n'importe quoi, comme un apache, tu le fais écouter sur le port 80 et tu fais une redirection du port 0 vers 80 avec iptables ou pf. Ensuite tu peux faire une requête avec curl et ça passe. Ca marche aussi avec Chrome, Firefox n'aime pas par contre.
-
Prends n'importe quoi, comme un apache, tu le fais écouter sur le port 80 et tu fais une redirection du port 0 vers 80 avec iptables ou pf. Ensuite tu peux faire une requête avec curl et ça passe. Ca marche aussi avec Chrome, Firefox n'aime pas par contre.
Intéressant!
-
Les ports à partir de 1024 sont sémantiquement équivalents. L'implèmentation TCP/UDP ne fait absolument aucune différence entre eux.
C'est inexact, cf ip_local_port_range/ip_local_reserved_ports sous Linux.
De plus "l'implèmentation TCP/UDP" ne veut rien dire, il y a des implèmentations avec des paramétrages différents à ce niveau.
-
Quel rapport avec la RFC précitée?
-
Chrome sur Windows 10:
https://lafibre.info:0/ -> ERR_ADDRESS_INVALID (c'est l'OS qui répond ca, on voit un appel systeme dans le tracing de Chrome)
https://lafibre.info:1/ -> ERR_UNSAFE_PORT (c'est Chrome qui bloque ca avec sa liste de 'restricted port' (voir source (http://src.chromium.org/viewvc/chrome/trunk/src/net/base/net_util.cc?view=markup)ligne 70).)
https://lafibre.info:2/ -> ERR_CONNECTION_REFUSED (le paquet quitte bien la machine, c'est le serveur de lafibre qui n'ecoute pas sur le port 2 donc normal)
https://lafibre.info:3/ -> idem port 1
-
Edge windows 10 affiche le site avec le port :0, a priori il ignore juste le truc :D
sur 1/2/3, connexion refusée
-
https://lafibre.info:1/ -> ERR_UNSAFE_PORT (c'est Chrome qui bloque ca avec sa liste de 'restricted port' (voir source (http://src.chromium.org/viewvc/chrome/trunk/src/net/base/net_util.cc?view=markup)ligne 70).)
En effet, les navigateurs peuvent être utilisés pour ouvrir des connexions depuis l'intérieur d'une zone protégée par un pare-feu. Et même sans pare-feu, le navigateur peut être utilisé pour ouvrir des connexions depuis une IP locale ou de confiance.
C'est un problème intrinsèque au Web tel que conçu initialement.
-
curl -H "Host: ns3.urdn.com.ua" http://ns3.urdn.com.ua:0
Marche bien avec Chrome (chromium) aussi.
-
Sous linux?
-
Sous linux?
OpenBSD/Linux
-
Alors pourquoi tu introduis un guide des bonnes manières et pourquoi tu l'interprètes à l'envers?
Reserved signifie INTERDIT!
Si il est interdit, c'est qu'il existe. Donc, il y a un bien un port 0.
-
Avec une vieille version de Nmap (nmap -p 0-3 -T4 -A -v lafibre.info) :
C'est intéressant, seul le port 0 affiche un port filtré tandis que les autres sont closed. Donc ça prouve que quelque chose passe par le port 0, mais avec Firefox, ses protections bloquent l'accès comme d'autres ont remarqués. Un wget n'a rien donné non plus.
-
Avec une vieille version de Nmap (nmap -p 0-3 -T4 -A -v lafibre.info) :
C'est intéressant, seul le port 0 affiche un port filtré tandis que les autres sont closed. Donc ça prouve que quelque chose passe par le port 0, mais avec Firefox, ses protections bloquent l'accès comme d'autres ont remarqués. Un wget n'a rien donné non plus.
Il n'y a rien qui écoute sur ces ports sur lafibre.info alors à quoi tu t'attends ?
-
Kgersen à donné des liens avec ces ports
Chrome sur Windows 10:
https://lafibre.info:0/ -> ERR_ADDRESS_INVALID (c'est l'OS qui répond ca, on voit un appel systeme dans le tracing de Chrome)
https://lafibre.info:1/ -> ERR_UNSAFE_PORT (c'est Chrome qui bloque ca avec sa liste de 'restricted port' (voir source ligne 70).)
https://lafibre.info:2/ -> ERR_CONNECTION_REFUSED (le paquet quitte bien la machine, c'est le serveur de lafibre qui n'ecoute pas sur le port 2 donc normal)
https://lafibre.info:3/ -> idem port 1
-
Kgersen à donné des liens avec ces ports
Ca change pas, que ça soit l'OS qui bloque ou pas, t'aura toujours rien parce qu'il n'y a rien qui écoute sur ce port à cette adresse.
-
Ca change pas, que ça soit l'OS qui bloque ou pas, t'aura toujours rien parce qu'il n'y a rien qui écoute sur ce port à cette adresse.
ERR_CONNECTION_REFUSED ce n'est pas rien!
-
root@tao:/projets/netcat# ./nc -l -p 0
invalid local port 0
root@tao:/projets/netcat# ./nc -l -p 1
^C punt!
root@tao:/projets/netcat#
Je dis ça je dis rien...
(4 pages de topic pour une histoire de 0, killing-spreeeeeeee !!!!)
-
Le port 0 est bien utilisé et a toute son utilité.
http://compnetworking.about.com/od/tcpip/p/port-numbers-0.htm
-
Euh... t'as lu l'article ? :D
"Port 0 is officially a reserved port in TCP/IP networking, meaning that it should not be used for any TCP or UDP network communications."
"port 0 is a programming technique for specifying system-allocated (dynamic) ports"
"[] network programmers can instead specify port 0 as a connection parameter. That triggers the operating system to automatically search for and return the next available port in the dynamic port number range."
Donc si tu demandes le port 0 on t'en donne un automatiquement. Tu ne peux pas l'utiliser directement.
-
La discussion est de savoir si :
Il n'y a pas de port 0.
ou de savoir si il y a un port 0.
Ceci "Port 0 is officially a reserved port in TCP/IP networking" me suffit amplement pour affirmer qu'il y a bien un port 0, et son utilité est décrite dans le lien donné.
Après que ce port puisse ou ne puisse pas être ouvert physiquement sur une machine est un autre débat.
-
Est ce que l'ensemble vide est lui même un ensemble puisqu'il est vide ?
=> vous avez 4 heures.
-
Est ce que l'ensemble vide est lui même un ensemble puisqu'il est vide ?
=> vous avez 4 heures.
OUI
https://fr.wikipedia.org/wiki/Ensemble_vide
-
Est ce que l'ensemble vide est lui même un ensemble puisqu'il est vide ?
=> vous avez 4 heures.
Réponse en 6 minutes...
-
Est ce que l'ensemble vide est lui même un ensemble puisqu'il est vide ?
=> vous avez 4 heures.
En théorie des ensembles il existe axiomatiquement. Tous les ensembles qu'on peut construire sont basés sur l'ensemble vide : ∅, {∅}, {∅, {∅}}, etc.
L'ensemble des entiers correspond à { ∅, {∅}, {∅, {∅}}, ... }
Par ailleurs, sans ensemble vide on ne peut pas définir l'intersection de deux ensembles disjoints.
Se passer d'ensemble vide est l'équivalent à se passer de 0 en arithmétique.
-
C'est pas faux.
-
Réponse en 6 minutes...
Réponse de matheux en 6 minutes. En math, quand tu as 4 h, tu as au plus 4 h, il n'est pas interdit de torcher la démonstration en 4 lignes.
En philo, quand tu as 4 h, tu as intérêt à occuper les 4 h et à pondre au moins 4 pages.
-
C'est pas faux.
Pour détailler un peu plus :
0 correspond à ∅ qui signifie {}
1 correspond à {∅} qui signifie {{}}
etc.
On utilise à chaque fois l'axiome de la paire pour démontrer l'existence de l'ensemble.
Il y a un axiome qui garantit l'existence de l'ensemble des entiers, parce qu'on ne peut pas construire un ensemble infini avec les autres axiomes.
-
Ah les matheux ::)
-
reserved != forbidden
"forbidden" n'existe pas dans les RFC!
-
Pour en revenir au sujet, j'ai retenu d'un papier lu en cours de sécurité l'an dernier que les attaques sur le port 0 étaient une faille connue : les firewalls habituels sont souvent un peu trop surs que les OS refuseront que l'utilisateur envoient quoi que ce soit sur ce port, tellement qu'il était ouvert par défaut et que les OS laissaient des failles béantes à ceux qui avaient l'idée de s'amuser avec ce port.
-
De toute façon, personne ne va mettre un serveur sur un port 0, même en supposant que ça soit possible.
Donc je ne vois pas le souci.
-
De toute façon, personne ne va mettre un serveur sur un port 0, même en supposant que ça soit possible.
Donc je ne vois pas le souci.
et pourquoi pas ?
personne ne pensera à aller le chercher là ... Pour certaines applications
-
(http://www.smiley-lol.com/smiley/manger/grignoter/mais4.gif)
-
Dans Linux, le port n'est pas utilisable par bind() :
Je cite http://unix.stackexchange.com/questions/180492/is-it-possible-to-connect-to-tcp-port-0
There's a comment about this in [linux kernel source]/net/ipv4/inet_connection_sock.c on inet_csk_get_port():
/* Obtain a reference to a local port for the given sock,
* if snum is zero it means select any available local port.
*/
Which is a standard unix convention. There could be systems that will actually allow use of port 0, but that would be considered a bad practice. This behaviour is not officially specified by POSIX, IANA, or the TCP protocol, however.
Sinon IRL vous n'avez rien de plus intéressant à débattre ?
-
Dans Linux, le port n'est pas utilisable par bind() :
Je cite http://unix.stackexchange.com/questions/180492/is-it-possible-to-connect-to-tcp-port-0
Sinon IRL vous n'avez rien de plus intéressant à débattre ?
on pourrait parler du résultat des élections de demain, mais vu le niveau, c'est plus intéressant l'histoire du port 0
-
Pour demain je prédis que le gagnant sera NUL et ses propositions applicables proches de l'ensemble VIDE.
-
Pour demain je prédis que le gagnant sera NUL et ses propositions applicables proches de l'ensemble VIDE.
tu es méchant, le budget régional n'est pas contraint sur au moins 10%.....
-
Sous linux :
Appel à socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)
985 static const struct net_proto_family inet_family_ops = {
986 .family = PF_INET,
987 .create = inet_create,
http://lxr.free-electrons.com/source/net/ipv4/af_inet.c#L985
249 static int inet_create(struct net *net, struct socket *sock, int protocol,
250 int kern)
251 {
...
269 list_for_each_entry_rcu(answer, &inetsw[sock->type], list) {
Contenu de la variable inetsw :
1032 void inet_register_protosw(struct inet_protosw *p)
1033 {
...
1046 list_for_each(lh, &inetsw[p->type]) {
1047 answer = list_entry(lh, struct inet_protosw, list);
1048 /* Check only the non-wild match. */
1049 if ((INET_PROTOSW_PERMANENT & answer->flags) == 0)
1050 break;
1054 }
...
1062 list_add_rcu(&p->list, last_perm);
Appel de inet_register_protosw :
1735 for (q = inetsw_array; q < &inetsw_array[INETSW_ARRAY_LEN]; ++q)
1736 inet_register_protosw(q);
http://lxr.free-electrons.com/source/net/ipv4/af_inet.c#L1735
Contenu de la variable inetsw_array :
994 static struct inet_protosw inetsw_array[] =
995 {
996 {
997 .type = SOCK_STREAM,
998 .protocol = IPPROTO_TCP,
...
1003 },
http://lxr.free-electrons.com/source/net/ipv4/af_inet.c#L994
Appel à listen
3177 int kernel_listen(struct socket *sock, int backlog)
3178 {
3179 return sock->ops->listen(sock, backlog);
3180 }
http://lxr.free-electrons.com/source/net/socket.c#L3177
Valeur du membre ops :
994 static struct inet_protosw inetsw_array[] =
995 {
996 {
997 .type = SOCK_STREAM,
998 .protocol = IPPROTO_TCP,
999 .prot = &tcp_prot,
1000 .ops = &inet_stream_ops,
1003 },
http://lxr.free-electrons.com/source/net/ipv4/af_inet.c#L994
Valeur sock->ops->listen :
900 const struct proto_ops inet_stream_ops = {
901 .family = PF_INET,
...
911 .listen = inet_listen,
http://lxr.free-electrons.com/source/net/ipv4/af_inet.c#L900
Définition de inet_listen:
191 /*
192 * Move a socket into listening state.
193 */
194 int inet_listen(struct socket *sock, int backlog)
195 {
....
232 err = inet_csk_listen_start(sk, backlog);
http://lxr.free-electrons.com/source/net/ipv4/af_inet.c#L191
736 int inet_csk_listen_start(struct sock *sk, int backlog)
737 {
...
753 if (!sk->sk_prot->get_port(sk, inet->inet_num)) {
http://lxr.free-electrons.com/source/net/ipv4/inet_connection_sock.c#L736
Valeur du membre sk_prot :
249 static int inet_create(struct net *net, struct socket *sock, int protocol,
250 int kern)
251 {
...
269 list_for_each_entry_rcu(answer, &inetsw[sock->type], list) {
270
271 err = 0;
272 /* Check the non-wild match. */
273 if (protocol == answer->protocol) {
274 if (protocol != IPPROTO_IP)
275 break;
...
316 answer_prot = answer->prot;
...
323 sk = sk_alloc(net, PF_INET, GFP_KERNEL, answer_prot, kern);
http://lxr.free-electrons.com/source/net/ipv4/af_inet.c#L985
1389 struct sock *sk_alloc(struct net *net, int family, gfp_t priority,
1390 struct proto *prot, int kern)
1391 {
1392 struct sock *sk;
...
1401 sk->sk_prot = sk->sk_prot_creator = prot;
...
1413 return sk;
http://lxr.free-electrons.com/source/net/core/sock.c#L1389
Valeur du membre get_port :
2315 struct proto tcp_prot = {
2316 .name = "TCP",
...
2335 .get_port = inet_csk_get_port,
http://lxr.free-electrons.com/source/net/ipv4/tcp_ipv4.c#L2315
90 /* Obtain a reference to a local port for the given sock,
91 * if snum is zero it means select any available local port.
92 */
93 int inet_csk_get_port(struct sock *sk, unsigned short snum)
http://lxr.free-electrons.com/source/net/ipv4/inet_connection_sock.c#L90
Vous avez suivi?
-
Pour connect sur socket(PF_INET, SOCK_STREAM, IPPROTO_TCP) :
994 static struct inet_protosw inetsw_array[] =
995 {
996 {
997 .type = SOCK_STREAM,
998 .protocol = IPPROTO_TCP,
999 .prot = &tcp_prot,
1000 .ops = &inet_stream_ops,
1003 },
http://lxr.free-electrons.com/source/net/ipv4/af_inet.c#L994
900 const struct proto_ops inet_stream_ops = {
901 .family = PF_INET,
...
905 .connect = inet_stream_connect,
http://lxr.free-electrons.com/source/net/ipv4/af_inet.c#L900
651 int inet_stream_connect(struct socket *sock, struct sockaddr *uaddr,
652 int addr_len, int flags)
653 {
...
657 err = __inet_stream_connect(sock, uaddr, addr_len, flags);
http://lxr.free-electrons.com/source/net/ipv4/af_inet.c#L651
560 /*
561 * Connect to a remote host. There is regrettably still a little
562 * TCP 'magic' in here.
563 */
564 int __inet_stream_connect(struct socket *sock, struct sockaddr *uaddr,
565 int addr_len, int flags)
566 {
...
580 switch (sock->state) {
....
591 case SS_UNCONNECTED:
...
596 err = sk->sk_prot->connect(sk, uaddr, addr_len);
http://lxr.free-electrons.com/source/net/ipv4/af_inet.c#L560
2315 struct proto tcp_prot = {
2316 .name = "TCP",
...
2319 .connect = tcp_v4_connect,
http://lxr.free-electrons.com/source/net/ipv4/tcp_ipv4.c#L2315
139 /* This will initiate an outgoing connection. */
140 int tcp_v4_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len)
141 {
142 struct sockaddr_in *usin = (struct sockaddr_in *)uaddr;
143 struct inet_sock *inet = inet_sk(sk);
144 struct tcp_sock *tp = tcp_sk(sk);
145 __be16 orig_sport, orig_dport;
146 __be32 daddr, nexthop;
147 struct flowi4 *fl4;
148 struct rtable *rt;
...
167 orig_sport = inet->inet_sport;
168 orig_dport = usin->sin_port;
169 fl4 = &inet->cork.fl.u.ip4;
170 rt = ip_route_connect(fl4, nexthop, inet->inet_saddr,
171 RT_CONN_FLAGS(sk), sk->sk_bound_dev_if,
172 IPPROTO_TCP,
173 orig_sport, orig_dport, sk);
...
226 rt = ip_route_newports(fl4, rt, orig_sport, orig_dport,
227 inet->inet_sport, inet->inet_dport, sk);
...
245 err = tcp_connect(sk);
http://lxr.free-electrons.com/source/net/ipv4/tcp_ipv4.c#L139
273 static inline struct rtable *ip_route_connect(struct flowi4 *fl4,
274 __be32 dst, __be32 src, u32 tos,
275 int oif, u8 protocol,
276 __be16 sport, __be16 dport,
277 struct sock *sk)
278 {
279 struct net *net = sock_net(sk);
280 struct rtable *rt;
281
282 ip_route_connect_init(fl4, dst, src, tos, oif, protocol,
283 sport, dport, sk);
284
285 if (!src && oif) {
286 int rc;
287
288 rc = l3mdev_get_saddr(net, oif, fl4);
289 if (rc < 0)
290 return ERR_PTR(rc);
291
292 src = fl4->saddr;
293 }
294 if (!dst || !src) {
295 rt = __ip_route_output_key(net, fl4);
296 if (IS_ERR(rt))
297 return rt;
298 ip_rt_put(rt);
299 flowi4_update_output(fl4, oif, tos, fl4->daddr, fl4->saddr);
300 }
301 security_sk_classify_flow(sk, flowi4_to_flowi(fl4));
302 return ip_route_output_flow(net, fl4, sk);
303 }
304
305 static inline struct rtable *ip_route_newports(struct flowi4 *fl4, struct rtable *rt,
306 __be16 orig_sport, __be16 orig_dport,
307 __be16 sport, __be16 dport,
308 struct sock *sk)
309 {
310 if (sport != orig_sport || dport != orig_dport) {
311 fl4->fl4_dport = dport;
312 fl4->fl4_sport = sport;
313 ip_rt_put(rt);
314 flowi4_update_output(fl4, sk->sk_bound_dev_if,
315 RT_CONN_FLAGS(sk), fl4->daddr,
316 fl4->saddr);
317 security_sk_classify_flow(sk, flowi4_to_flowi(fl4));
318 return ip_route_output_flow(sock_net(sk), fl4, sk);
319 }
320 return rt;
321 }
http://lxr.free-electrons.com/source/include/net/route.h#L273
Je ne vois rien ici qui contraigne la valeur du port destination.
-
Dans Linux, le port n'est pas utilisable par bind() :
Si, il l'est :
422 int inet_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len)
423 {
424 struct sockaddr_in *addr = (struct sockaddr_in *)uaddr;
425 struct sock *sk = sock->sk;
426 struct inet_sock *inet = inet_sk(sk);
427 struct net *net = sock_net(sk);
428 unsigned short snum;
429 int chk_addr_ret;
430 u32 tb_id = RT_TABLE_LOCAL;
431 int err;
432
433 /* If the socket has its own bind function then use it. (RAW) */
434 if (sk->sk_prot->bind) {
435 err = sk->sk_prot->bind(sk, uaddr, addr_len);
436 goto out;
437 }
...
495 /* Make sure we are allowed to bind here. */
496 if ((snum || !inet->bind_address_no_port) &&
497 sk->sk_prot->get_port(sk, snum))
http://lxr.free-electrons.com/source/net/ipv4/af_inet.c#L422
static int do_ip_setsockopt(struct sock *sk, int level,
int optname, char __user *optval, unsigned int optlen)
{
...
case IP_BIND_ADDRESS_NO_PORT:
inet->bind_address_no_port = val ? 1 : 0;
break;
http://lxr.free-electrons.com/source/net/ipv4/ip_sockglue.c
Donc oui tu peux appeler bind avec un port 0 avec la bonne option, mais non, ça ne sert à rien, comme j'ai montré avec listen.
-
J'ai oublié ça :
139 /* This will initiate an outgoing connection. */
140 int tcp_v4_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len)
141 {
...
220 err = inet_hash_connect(&tcp_death_row, sk);
http://lxr.free-electrons.com/source/net/ipv4/tcp_ipv4.c#L139
611 /*
612 * Bind a port for a connect operation and hash it.
613 */
614 int inet_hash_connect(struct inet_timewait_death_row *death_row,
615 struct sock *sk)
616 {
617 u32 port_offset = 0;
618
619 if (!inet_sk(sk)->inet_num)
620 port_offset = inet_sk_port_offset(sk);
621 return __inet_hash_connect(death_row, sk, port_offset,
622 __inet_check_established);
623 }
http://lxr.free-electrons.com/source/net/ipv4/inet_hashtables.c#L611
503 int __inet_hash_connect(struct inet_timewait_death_row *death_row,
504 struct sock *sk, u32 port_offset,
505 int (*check_established)(struct inet_timewait_death_row *,
506 struct sock *, __u16, struct inet_timewait_sock **))
507 {
...
515 if (!snum) {
http://lxr.free-electrons.com/source/net/ipv4/inet_hashtables.c#L503