Существует очень простое решение для этого, когда вы используете асинхронные обратные вызовы (хотя я настоятельно рекомендую перейти на более новый подход, или, что еще лучше, на существующую библиотеку - сырой TCP трудно сделать правильно).
Делегат обратного вызова может указывать на метод экземпляра.Это означает, что у вас может быть что-то вроде этого:
class Client
{
private readonly Socket socket;
public readonly byte[] ReceiveBuffer = new byte[BUFFFER_SIZE];
public Client(Socket socket)
{
this.socket = socket;
}
public void ReceiveCallback(IAsyncResult AR)
{
// Handle the received data as usual
}
}
А затем в вашем методе AcceptCallback
просто используйте список Client
вместо Socket
, и последний вызов BeginReceive
как таковой:
var client = new Client(socket);
socket.BeginReceive(client.ReceiveBuffer, 0, BUFFER_SIZE, SocketFlags.None, client.ReceiveCallback,
socket);
clients.Add(newClient);
Но, опять же, написание пользовательских сетей затруднено.Если возможно, используйте существующее решение - есть из чего выбирать.
Кроме того, ObjectDisposedException
, которые вы получаете, это то, что вы делаете Shutdown
, сразу за которыми следует Close
.Это не верно.Выключение TCP является кооперативным - вам нужно дождаться закрытия клиентского сокета, прежде чем вы вызовете Close
на вашем сокете.То, что вы делаете, - это грубое прерывание соединения, прежде чем оно сможет разрешить само себя.Опять же - TCP трудно сделать правильно, вам нужно , чтобы узнать, как он работает очень тщательно.