есть классы 1) Объект состояния сокет-клиента StateObject
и 2) сам сервер SocketAsync
если запустить клиент и отправить сообщение один раз все ок, но на второй раз прога зависает и вылетает (без ошибок). В чем может быть такое поведение? Такое чувство что кто-то обрывает соединение.
если клиент отправляет сообщение, сокет считывает его, записывает все в консоль и отправляет ответ клиенту, после чего, как я понял, он разрывает соединение с клиентом (но не нахожу где именно это происходит)
public class StateObject
{
// сокет-клиент
public Socket workSocket = null;
// размер буфера.
public const int BufferSize = 1024;
// буфер для получателя
public byte[] buffer = new byte[BufferSize];
// полученная информация
public StringBuilder sb = new StringBuilder();
}
public class SocketAsync
{
public static ManualResetEvent allDone = new ManualResetEvent(false);
public SocketAsync() { }
public static void StartListening()
{
IPAddress ipAddress = IPAddress.Parse("127.0.0.1");
IPEndPoint localEndPoint = new IPEndPoint(ipAddress, 8005);
// Создаю сокет
Socket listener = new Socket(ipAddress.AddressFamily,SocketType.Stream, ProtocolType.Tcp);
// привязываю socket к локальному endpoint и слушаю
try
{
listener.Bind(localEndPoint);
listener.Listen(100);
while (true)
{
// Устанавливаю в выключенное состояние
allDone.Reset();
// НАчинаю ассинхронное прослоушивание
Console.WriteLine("Waiting for a connection...");
listener.BeginAccept(
new AsyncCallback(AcceptCallback),
listener);
// ожидаю подключение
allDone.WaitOne();
}
}
catch (Exception e)
{
Console.WriteLine(e.ToString());
}
Console.WriteLine("\nPress ENTER to continue...");
Console.Read();
}
public static void AcceptCallback(IAsyncResult ar)
{
// даю сигнал главному потоку для продолжения работы
allDone.Set();
// получаю сокет, который обрабатывает запрос клиента
Socket listener = (Socket)ar.AsyncState;
Socket handler = listener.EndAccept(ar);
// создаю объект состояния
StateObject state = new StateObject();
state.workSocket = handler;
handler.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0,
new AsyncCallback(ReadCallback), state);
}
public static void ReadCallback(IAsyncResult ar)
{
String content = String.Empty;
//Получаю состояние и сокет-обработчик
StateObject state = (StateObject)ar.AsyncState;
Socket handler = state.workSocket;
// Считываю данные из сокета-клиента
int bytesRead = handler.EndReceive(ar);
if (bytesRead > 0)
{
// сохраняю полученные данные.
state.sb.Append(Encoding.ASCII.GetString(state.buffer, 0, bytesRead));
// проверяю всю ли инфу я считал
content = state.sb.ToString();
//if (content.IndexOf("<EOF>") > -1)
if (content.Length > 0)
{
// записую на сервере
Console.WriteLine("Read {0} bytes from socket. \n Data : {1}",
content.Length, content);
// шлю клиенту
Send(handler, content);
}
else
{
// если считано не все
handler.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0,
new AsyncCallback(ReadCallback), state);
}
}
}
private static void Send(Socket handler, String data)
{
byte[] byteData = Encoding.ASCII.GetBytes(data);
// передаю
handler.BeginSend(byteData, 0, byteData.Length, 0,
new AsyncCallback(SendCallback), handler);
}
private static void SendCallback(IAsyncResult ar)
{
try
{
// получаю сокет из объекта состояния.
Socket handler = (Socket)ar.AsyncState;
// завершаю передачу данных на удаленное устройство
int bytesSent = handler.EndSend(ar);
Console.WriteLine("Sent {0} bytes to client.", bytesSent);
//handler.Shutdown(SocketShutdown.Both);
//handler.Close();
}
catch (Exception e)
{
Console.WriteLine(e.ToString());
}
}
}
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Хотите улучшить этот вопрос? Добавьте больше подробностей и уточните проблему, отредактировав это сообщение
Есть несколько radioButton пример, (заполнены для примера, нужно случайными через цикл)
В C# предусмотрен механизм захвата внешних переменных в анонимных методахПриведу пример кода: