Асинхронный клиент-сервер - C#
Формулировка задачи:
Здравствуйте. Вот уже 3 дня бьюсь над проблемой, решение которой не могу найти. Вообщем, коротко говоря, имеется серверное приложение, которое асинхронно принимает клиентов. Первое, второе подключения проходят нормально, а потом вновь подключенный клиент просто перестает запускаться. Путем точек останова, я вроде как понял что сервер в какой то момент перестает принимать клиентов. Вот вырезки с кода, очень жду помощи, т.к. на этом работа остановилась .
А вот соединение на клиентской части
После этого, запускается метод, который отправляет запрос, и ждет ответа от сервера. Ответ не приходит.
Подскажите, в чем ошибка
// Каждую секунду проверяем подключенных клиентов
private static void TimerConnectClient_Tick(object sender)
{
if (listener.Pending())
{
listener.BeginAcceptSocket(new AsyncCallback(OnAccept), listener);
}
} // подключился клиент
private static void OnAccept(IAsyncResult ar)
{
Socket client = ((TcpListener)ar.AsyncState).EndAcceptSocket(ar);
var EventArgRecive = new SocketAsyncEventArgs();
EventArgRecive.SetBuffer(new byte[SizeBufReciveClient], 0, SizeBufReciveClient);
EventArgRecive.AcceptSocket = client;
EventArgRecive.Completed += ReciveAsync;
if (!client.ReceiveAsync(EventArgRecive))
{
ReciveAsync(null, EventArgRecive);
}
} // пришло сообщение от клиента
private static void ReciveAsync(object sender, SocketAsyncEventArgs e)
{
string result = System.Text.Encoding.Default.GetString(e.Buffer.Where(x => x != 0).ToArray());
if (result.Trim().Length > 1)
{
e.SetBuffer(new byte[SizeBufReciveClient], 0, SizeBufReciveClient);
case "#1":
List<string> listTurbines = new List<string>(turbines.Count);
foreach (Turbine t in turbines)
if (t.Group.Trim() == Params1)
listTurbines.Add(t.GetNameTurbine);
SendClient(e.AcceptSocket, listTurbines);
break;
case "#2":
.............................................
}
else
{
SendClient(e.AcceptSocket, "0");
}
try
{
if (!e.AcceptSocket.ReceiveAsync(e))
ReciveAsync(null, e);
}
catch { }
} /// <summary>
/// Проверка соединения с сервером
/// </summary>
public static System.Net.Sockets.Socket Connect(System.Net.IPAddress ipClient, System.Net.IPAddress ipServer, int port)
{
var EndPointClient = new System.Net.IPEndPoint(ipClient, port);
var EndPointServer = new System.Net.IPEndPoint(ipServer, port);
var client = new System.Net.Sockets.Socket(System.Net.Sockets.AddressFamily.InterNetwork, System.Net.Sockets.SocketType.Stream, System.Net.Sockets.ProtocolType.Tcp);
client.Bind(EndPointClient);
client.Connect(EndPointServer);
return client;
}Решение задачи: «Асинхронный клиент-сервер»
textual
Листинг программы
while (true)
{
AllDone.Reset();
Logger.Act("Ожидается соединение");
listener.BeginAccept(new AsyncCallback(AcceptCallBack), listener);
AllDone.WaitOne();
}