Lorsque vous établissez une connexion TCP, le quadruplet (source-ip, source-port, dest-ip, dest-port) doit être unique, afin de garantir la livraison des paquets au bon endroit.
Il existe une autre restriction sur le serveur Il est à noter qu'un seul programme serveur peut se lier à un numéro de port entrant (en supposant une adresse IP ; les serveurs multi-NIC ont d'autres pouvoirs mais nous n'avons pas besoin d'en discuter ici).
Donc, du côté du serveur, vous :
- créer un socket.
- lier cette socket à un port.
- écouter sur ce port.
- accepter des connexions sur ce port. et il peut y avoir plusieurs connexions entrantes (une par client).
Du côté du client, c'est généralement un peu plus simple :
- créer un socket.
- ouvrir la connexion. Lorsqu'un client ouvre la connexion, il spécifie l'adresse IP et le port de l'ordinateur. serveur . Il s'agit de puede spécifier son port source mais utilise généralement zéro, ce qui fait que le système lui attribue automatiquement un port libre.
Il y a pas de l'exigence que l'IP/le port de destination soit unique, car cela aurait pour conséquence qu'une seule personne à la fois pourrait utiliser Google, ce qui détruirait pratiquement leur modèle économique.
Cela signifie que vous pouvez même faire des choses merveilleuses comme le FTP multi-session, puisque vous configurez plusieurs sessions où la seule différence est votre port source, ce qui vous permet de télécharger des morceaux en parallèle. Les torrents sont un peu différents dans la mesure où la destination de chaque session est généralement différente.
Après toutes ces explications, la réponse à votre question spécifique est que vous n'avez pas besoin de spécifier un port libre. Si vous vous connectez à un serveur avec un appel qui ne spécifie pas votre port source, il est presque certain qu'il utilisera un port zéro et le système vous donnera un port inutilisé.
4 votes
Qu'entendez-vous par "gratuit" ici ? Si vous essayez de vous y connecter et que vous échouez, cela signifie probablement que rien n'a été écouté.
2 votes
Je veux dire qu'il n'est pas utilisé par une autre application. Si une application utilise un port, les autres ne peuvent pas l'utiliser jusqu'à ce qu'il devienne libre.
0 votes
Quel est le serveur auquel vous essayez de vous connecter ? L'avez-vous écrit ou s'agit-il d'un serveur existant ?
3 votes
Comme cela a été dit dans de nombreuses réponses, vous avez tout à l'envers. Les ports locaux et les ports distants sont deux choses totalement différentes. Cette réponse en particulier l'explique bien : stackoverflow.com/questions/570098/
0 votes
Pourquoi ne pas simplement attraper l'exception éventuellement levée par le constructeur de TcpClient ? c'est-à-dire : try { c = new TcpClient(ip, port) ; } catch(Exception){ //le port est pris... }