Starten Sie hören wieder mit dem Sockel nach einem disconnect
Ich Schreibe ein kleines C# - Sockets-Anwendung. Eigentlich habe ich zwei, einen server und einen client.
Den Benutzer läuft der client betritt die IP und den port für den server, drückt Sie auf 'verbinden', und dann einmal angeschlossen, können Sie geben Sie text in ein Textfeld und senden Sie es an den server.
Den server einfach erscheint entweder "Keine Verbindung" oder "Connection from [ip-Adresse]:[port]", und die zuletzt empfangene Nachricht unter.
Den server erfolgreich empfängt die Nachrichten, und sogar die Griffe der client trennen, in Ordnung.
Jetzt bin ich versucht zu machen, hören Sie wieder, nachdem der client hat die Verbindung getrennt, aber aus irgendeinem Grund nichts ich versuche es zulassen, starten Sie hören wieder.
Hier ist ein Teil von meinem code:
Socket socket;
private void listen()
{
socket = new Socket(AddressFamily.InterNetwork,
SocketType.Stream, ProtocolType.Tcp);
socket.Bind(new IPEndPoint(IPAddress.Any, 12345));
socket.Listen(10);
socket.BeginAccept(new AsyncCallback(acceptAsync), socket);
}
und
private void receiveAsync(IAsyncResult res)
{
Socket socket = (Socket)res.AsyncState;
try
{
int nBytes = socket.EndReceive(res);
if (nBytes > 0)
{
Invoke(new MethodInvoker(delegate()
{
lMessage.Text = encoder.GetString(buffer);
}));
setupReceiveAsync(socket);
}
else
{
Invoke(new MethodInvoker(delegate()
{
lConnections.Text = "No Connections.";
lMessage.Text = "No Messages.";
socket.Shutdown(SocketShutdown.Both);
socket.Close();
listen();
}));
}
}
catch { }
}
Die Letzte Zeile: listen(); ist, was den Fehler auslöst.
Ich habe versucht ganz einfach den Aufruf von socket.BeginAccept() wieder, aber das ist auch eine Ausnahme auslöst.
Die Botschaft, die ich bekommen hab ist:
Nur eine Verwendung von jede Socketadresse (Protokoll-Netzwerk-Adresse/Anschluss) normalerweise darf
Wenn ich nicht rufe meine Funktion listen() und anstatt nur call-Buchse.BeginAccept(), dann bekomme ich "müssen Sie Sie zuerst in Buchse.listen()"
Wenn ich call den socket.listen () - Funktion, dann es sagt mir, es ist bereits angeschlossen und die Karre starten Sie hören.
Einmal habe ich eine asynchrone Verbindung, und erhielt mehrere asynchrone Nachrichten, wie dann ich beginnen Erhalt wieder?
- Poste bitte mehr von deinem code. Es klingt wie Sie sind wegwerfen der socket ohne ordnungsgemäß entsorgt, und es wurde noch nicht Müll gesammelt, der port ist immer noch offen gehalten, indem es.
- Wo ruft Ihr
EndAccept
an?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ihre
socket
variable bereits ein socket zugeordnet, die zweite Zeit, die Sie rufenlisten()
, die ist, warum es sagt, dass Sie nur eine Verwendung zulässig ist. Alles, was Sie brauchen, um zu wiederholen, ist diesocket.BeginAccept(new AsyncCallback(acceptAsync), socket)
nennen. So ersetzen Sie den Aufruf vonlisten()
in IhremreceiveAsync(...)
Methode mitsocket.BeginAccept(new AsyncCallback(acceptAsync), socket)
.In async
Begin*
ist immer gefolgt vonEnd*
. Finden Sie Mit einem Asynchrone Server-Socket. Ihre accept-Methode sollte so etwas wie:Server, bedeutet, dass eine app, die zuhört, die auf angegebenen port/ip. Ist in der Regel, immer in einer listening-Modus - das ist, warum es heißt ein server. Es kann verbinden und trennen einem client, aber immer in hören - Modus.
Dies bedeutet, wenn ein server trennt die Verbindung eines client - auch dann - es ist im listening-Modus; bedeutet, dass es kann akzeptieren eingehende verbindungen.
Obwohl die Trennung verlangen kann kommen vom client oder gewaltsam angewendet, die von server.
Den Prozess für einen server ist:
Den Prozess für den Kunden ist:
Gibt es mehrere Möglichkeiten für den server für die Verarbeitung der eingehenden Kunden -, paar -, wie folgt:
List<TcpClient>
._