J'ai fait beaucoup de recherches sur Google mais je n'ai pas eu beaucoup de chance avec mes problèmes. Je suis nouveau dans la programmation réseau et j'essaie d'apprendre. J'ai essayé de configurer un serveur et un client simples qui communiquent (en suivant un tutoriel en ligne situé ici -> http://tech.pro/tutorial/704/ csharp-tutorial-simple-threaded-tcp-server )
Le problème que j'ai est que je continue à recevoir l'exception "Une seule utilisation de chaque adresse de socket (protocole/adresse réseau/port) est normalement autorisée" lors de la tentative de démarrage de TcpListener sur le serveur.
J'ai essayé de désactiver mon pare-feu, de changer le port à utiliser, de déplacer des variables mais en vain (le client fonctionne bien, mais il ne peut évidemment pas trouver le serveur car je ne peux pas le lancer).
J'ai vu des solutions décrivant l'utilisation de Socket.Poll (), mais comme je n'utilise que l'objet TcpListener, je ne sais pas comment utiliser la fonction Poll.
Mon code:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Sockets;
using System.Net;
using System.Threading;
using System.Text;
namespace ServerTutorial {
class Server {
private readonly Thread m_listenThread;
public Server() {
m_listenThread = new Thread(new ThreadStart(ListenForClients));
m_listenThread.Start();
}
public void ListenForClients() {
var listener = new TcpListener(IPAddress.Any, 3000);
listener.Start();
while (true) {
//Blocks until a client has connected to the server
TcpClient client = listener.AcceptTcpClient();
//Send a message to the client
var encoder = new ASCIIEncoding();
NetworkStream clientStream = client.GetStream();
byte[] buffer = encoder.GetBytes("Hello Client!");
clientStream.Write(buffer, 0, buffer.Length);
clientStream.Flush();
//Create a thread to handle communication with the connected client
var clientThread = new Thread(new ParameterizedThreadStart(HandleClient));
clientThread.Start(client);
}
}
private void HandleClient(object clientObj) { //Param thread start can only accept object types, hence the cast
var client = (TcpClient) clientObj;
NetworkStream clientStream = client.GetStream();
var message = new byte[4096];
while (true) {
int bytesRead = 0;
try {
//Block until a client sends a message
bytesRead = clientStream.Read(message, 0, 4096);
} catch {
//A socket error has occurred
System.Diagnostics.Debug.WriteLine("A socket error has occured");
break;
}
if (bytesRead == 0) {
//The client has disconnected from the server
System.Diagnostics.Debug.WriteLine("A client has disconnected from the server");
client.Close();
break;
}
//Message has been received
var encoder = new ASCIIEncoding();
System.Diagnostics.Debug.WriteLine(encoder.GetString(message, 0, bytesRead));
}
}
}
}
Dans ma méthode principale:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ServerTutorial {
class Program {
static void Main(string[] args) {
var server = new Server();
server.ListenForClients();
}
}
}
Toute aide est extrêmement appréciée!
ListenForClients
est appelé deux fois (sur deux threads différents) - une fois depuis le constructeur, une fois depuis l'appel de la méthode explicite dans Main
. Lorsque deux instances de TcpListener
essaient d'écouter sur le même port, vous obtenez cette erreur.
Vous déboguez deux fois ou plus. de sorte que l'application peut s'exécuter plus à la fois. Alors seulement ce problème se produira. Vous devez fermer toutes les applications de débogage à l'aide de task-manager, puis déboguer à nouveau.
J'ai rencontré un problème similaire sur Windows Server 2012 STD 64 bits, mon problème est résolu après la mise à jour de Windows avec toutes les mises à jour disponibles pour Windows.