Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
Avant de pouvoir utiliser un socket pour communiquer avec des appareils distants, le socket doit être initialisé avec les informations de protocole et d’adresse réseau. Le constructeur de la Socket classe a des paramètres qui spécifient la famille d’adresses, le type de socket et le type de protocole utilisé par le socket pour établir des connexions. Lors de la connexion d’un socket client à un socket de serveur, le client utilise un IPEndPoint objet pour spécifier l’adresse réseau du serveur.
Créer un point de terminaison IP
Lorsque vous travaillez avec System.Net.Sockets, vous représentez un point de terminaison réseau en tant qu’objet IPEndPoint . L’IPEndPoint est construit avec une IPAddress et son numéro de port correspondant. Avant de pouvoir lancer une conversation via un Socketcanal de données, vous créez un canal de données entre votre application et la destination distante.
TCP/IP utilise une adresse réseau et un numéro de port de service pour identifier un service de manière unique. L’adresse réseau identifie une destination réseau spécifique ; le numéro de port identifie le service spécifique sur cet appareil auquel se connecter. La combinaison d’adresses réseau et de port de service est appelée point de terminaison, qui est représenté dans le .NET par la EndPoint classe. Un descendant de est défini pour chaque famille d’adresses EndPoint prise en charge ; pour la famille d’adresses IP, la classe est IPEndPoint.
La Dns classe fournit des services de nom de domaine aux applications qui utilisent des services Internet TCP/IP. La GetHostEntryAsync méthode interroge un serveur DNS pour mapper un nom de domaine convivial (tel que « host.contoso.com ») à une adresse Internet numérique (par exemple 192.168.1.1).
GetHostEntryAsync renvoie un Task<IPHostEntry> qui, lorsqu'il est utilisé normalement, contient une liste d'adresses et d'alias pour le nom demandé. Dans la plupart des cas, vous pouvez utiliser la première adresse retournée dans le AddressList tableau. Le code suivant obtient une IPAddress contenant l'adresse IP du serveur host.contoso.com.
IPHostEntry ipHostInfo = await Dns.GetHostEntryAsync("host.contoso.com");
IPAddress ipAddress = ipHostInfo.AddressList[0];
Conseil / Astuce
À des fins de test et de débogage manuels, vous pouvez généralement utiliser la méthode GetHostEntryAsync avec le nom d’hôte résultant de la valeur Dns.GetHostName() pour résoudre le nom localhost en adresse IP. Prenez l'exemple de l'extrait de code suivant :
var hostName = Dns.GetHostName();
IPHostEntry localhost = await Dns.GetHostEntryAsync(hostName);
// This is the IP address of the local machine
IPAddress localIpAddress = localhost.AddressList[0];
Internet Assigned Numbers Authority (IANA) définit les numéros de port pour les services communs. Pour plus d’informations, consultez IANA : Nom du service et Registre des numéros de port du protocole de transport). D’autres services peuvent avoir des numéros de port inscrits dans la plage de 1 024 à 65 535. Le code suivant combine l'adresse IP de host.contoso.com avec un numéro de port pour créer un point de terminaison distant pour une connexion.
IPEndPoint ipEndPoint = new(ipAddress, 11_000);
Après avoir déterminé l’adresse de l’appareil distant et le choix d’un port à utiliser pour la connexion, l’application peut établir une connexion avec l’appareil distant.
Créer un Socket client
Avec l’objet endPoint créé, créez un socket client pour vous connecter au serveur. Une fois le socket connecté, il peut envoyer et recevoir des données à partir de la connexion de socket de serveur.
using Socket client = new(
ipEndPoint.AddressFamily,
SocketType.Stream,
ProtocolType.Tcp);
await client.ConnectAsync(ipEndPoint);
while (true)
{
// Send message.
var message = "Hi friends 👋!<|EOM|>";
var messageBytes = Encoding.UTF8.GetBytes(message);
_ = await client.SendAsync(messageBytes, SocketFlags.None);
Console.WriteLine($"Socket client sent message: \"{message}\"");
// Receive ack.
var buffer = new byte[1_024];
var received = await client.ReceiveAsync(buffer, SocketFlags.None);
var response = Encoding.UTF8.GetString(buffer, 0, received);
if (response == "<|ACK|>")
{
Console.WriteLine(
$"Socket client received acknowledgment: \"{response}\"");
break;
}
// Sample output:
// Socket client sent message: "Hi friends 👋!<|EOM|>"
// Socket client received acknowledgment: "<|ACK|>"
}
client.Shutdown(SocketShutdown.Both);
Le code C# précédent :
Instancie un nouvel objet
Socketavec une famille d’adresses d’instancesendPointdonnée, SocketType.Stream et ProtocolType.Tcp.Appelle la méthode avec l’instance Socket.ConnectAsync
endPointen tant qu’argument.Dans une boucle
while:- Encode et envoie un message au serveur à l'aide de Socket.SendAsync.
- Écrit le message envoyé dans la console.
- Initialise une mémoire tampon pour recevoir des données du serveur à l’aide de Socket.ReceiveAsync.
-
responseLorsqu’il s’agit d’un accusé de réception, il est écrit dans la console et la boucle est terminée.
Enfin, le socket
clientappelle Socket.Shutdown selon SocketShutdown.Both, qui arrête les opérations d’envoi et de réception.
Créer un Socket serveur
Pour créer le socket de serveur, l’objet endPoint peut écouter les connexions entrantes sur n’importe quelle adresse IP, mais le numéro de port doit être spécifié. Une fois le socket créé, le serveur peut accepter les connexions entrantes et communiquer avec les clients.
using Socket listener = new(
ipEndPoint.AddressFamily,
SocketType.Stream,
ProtocolType.Tcp);
listener.Bind(ipEndPoint);
listener.Listen(100);
var handler = await listener.AcceptAsync();
while (true)
{
// Receive message.
var buffer = new byte[1_024];
var received = await handler.ReceiveAsync(buffer, SocketFlags.None);
var response = Encoding.UTF8.GetString(buffer, 0, received);
var eom = "<|EOM|>";
if (response.IndexOf(eom) > -1 /* is end of message */)
{
Console.WriteLine(
$"Socket server received message: \"{response.Replace(eom, "")}\"");
var ackMessage = "<|ACK|>";
var echoBytes = Encoding.UTF8.GetBytes(ackMessage);
await handler.SendAsync(echoBytes, 0);
Console.WriteLine(
$"Socket server sent acknowledgment: \"{ackMessage}\"");
break;
}
// Sample output:
// Socket server received message: "Hi friends 👋!"
// Socket server sent acknowledgment: "<|ACK|>"
}
Le code C# précédent :
Instancie un nouvel objet
Socketavec une famille d’adresses d’instancesendPointdonnée, SocketType.Stream et ProtocolType.Tcp.listenerappelle la méthode Socket.Bind avec l’instanceendPointen tant qu’argument pour associer le socket à l’adresse réseau.La Socket.Listen() méthode est appelée pour écouter les connexions entrantes.
Le
listenerappelle la méthode Socket.AcceptAsync pour accepter une connexion entrante sur le sockethandler.Dans une boucle
while:- Appelle Socket.ReceiveAsync pour recevoir des données du client.
- Lorsque les données sont reçues, elles sont décodées et écrites dans la console.
- Si le
responsemessage se termine par<|EOM|>, un accusé de réception est envoyé au client à l’aide du Socket.SendAsync.
Exécuter l’exemple de client et de serveur
Démarrez d’abord l’application serveur, puis démarrez l’application cliente.
dotnet run --project socket-server
Socket server starting...
Found: 172.23.64.1 available on port 9000.
Socket server received message: "Hi friends 👋!"
Socket server sent acknowledgment: "<|ACK|>"
Press ENTER to continue...
L’application cliente envoie un message au serveur et le serveur répond avec un accusé de réception.
dotnet run --project socket-client
Socket client starting...
Found: 172.23.64.1 available on port 9000.
Socket client sent message: "Hi friends 👋!<|EOM|>"
Socket client received acknowledgment: "<|ACK|>"
Press ENTER to continue...