Исправление одного подключения (асинхронный сокет) - C#
Формулировка задачи:
Пишу асинхронный сокет. У меня существует 2 ошибки:
1) Когда я подключился клиентом к серверу и отправил сообщение он принял в ответку, потом завершился. Но при повторном подключении к серверу, он не коннектиться.
2) Когда сервер ожидает минут 2-3 вылетает ошибка на этой строке "this.socket.BeginAccept(new AsyncCallback(AcceptCallBack), this.socket);";
Кто поможет буду очень благодарен. Это идёт для курсача, сроки уже поджимают. Буду очень благодарен кто поможет исправить эти ошибки.
Клиент:
Сервер:
pack.rar
namespace client
{
class Program
{
static void Main(string[] args)
{
client Client = new client("192.168.232.1", 2200);
Client.Connect();
Client.Send();
System.Threading.Thread.Sleep(2000);
Client.Disconnect(); //отключение от сервера
Console.Read();
}
}
}namespace client
{
class StateObject
{
public Socket workSocket = null; //сокет клиента
public const int bufferSize = 1024; //max размер буфера
public byte[] buffer = new byte[bufferSize];//буфер
public StringBuilder sb = new StringBuilder();//принятные данные в виде строки
}
class client
{
private Socket socket_client;
private IPEndPoint ip;
private ManualResetEvent acceptEvent = new ManualResetEvent(false);
//создание сокета
public client(string ip, int port)
{
this.ip = new IPEndPoint(IPAddress.Parse(ip), port);
this.socket_client = new Socket(this.ip.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
}
//подключение к серверу
public void Connect()
{
this.socket_client.BeginConnect(this.ip, new AsyncCallback(ConnectCallBack), this.socket_client);
}
//метод для завершения операции
private void ConnectCallBack(IAsyncResult ar)
{
Socket handle = (Socket)ar.AsyncState;
this.socket_client.EndConnect(ar);
}
//отключение от сервера
public void Disconnect()
{
this.socket_client.BeginDisconnect(false, new AsyncCallback(DisconnectCallBack), this.socket_client);
}
private void DisconnectCallBack(IAsyncResult ar)
{
Socket handle = ar.AsyncState as Socket;
handle.EndDisconnect(ar);
Console.WriteLine("Connect close.");
}
//отправка сообщения
public void Send()
{
string message = Console.ReadLine();
byte[] buffer = Encoding.UTF8.GetBytes(message);
this.socket_client.BeginSend(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(SendCallBack), this.socket_client);
}
private void SendCallBack(IAsyncResult ar)
{
Socket handle = ar.AsyncState as Socket;
handle.EndSend(ar);
Receive();
}
//принятие данных
public void Receive()
{
StateObject state = new StateObject();
state.workSocket = this.socket_client;
state.workSocket.BeginReceive(state.buffer, 0, StateObject.bufferSize, SocketFlags.None, new AsyncCallback(ReceiveCallBack), state);
}
private void ReceiveCallBack(IAsyncResult ar)
{
try
{
StateObject state = ar.AsyncState as StateObject;
Socket handl = state.workSocket;
if (handl.Connected)
{
int bytes = handl.EndReceive(ar);
if (bytes > 0)
{
string cmd = Encoding.UTF8.GetString(state.buffer, 0, bytes);
Console.WriteLine("Server: " + cmd);
}
}
}
catch (Exception) { Console.WriteLine("Error"); }
}
}
}namespace server
{
class Program
{
static void Main(string[] args)
{
server Server = new server("192.168.232.1", 2200);
Server.Init();
}
}
}namespace server
{
class server
{
private Socket socket;
private IPEndPoint ip;
private ManualResetEvent acceptEvent = new ManualResetEvent(false);
//создание сокета
public server(string ip, int port)
{
this.ip = new IPEndPoint(IPAddress.Parse(ip), port);
this.socket = new Socket(this.ip.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
}
//ставим сокет в режиме прослушивания
public void Init()
{
this.socket.Bind(this.ip);
this.socket.Listen((int)SocketOptionName.MaxConnections);
StartListening();
}
//ждём подключения клиентов
private void StartListening()
{
Console.WriteLine("Server start...");
while (true)
{
this.socket.BeginAccept(new AsyncCallback(AcceptCallBack), this.socket);
}
}
//обработка подключившигося клиента
private void AcceptCallBack(IAsyncResult ar)
{
Socket socket = (Socket)ar.AsyncState;
Socket accept_socket = socket.EndAccept(ar);
ServerHandle handle = new ServerHandle(accept_socket);
handle.Start();
acceptEvent.Set();
Console.WriteLine("New connection.");
}
}
}namespace server
{
class StateObject
{
public Socket workSocket = null; //сокет клиента
public const int bufferSize = 1024; //max размер буфера
public byte[] buffer = new byte[bufferSize];//буфер
public StringBuilder sb = new StringBuilder();//принятные данные в виде строки
}
class ServerHandle
{
private Socket client_socket;
public ServerHandle(Socket client_socket)
{
this.client_socket = client_socket;
}
public void Start()
{
Receive();
}
//инициализируем класс и вызываем принятие данных
public void Receive()
{
StateObject state = new StateObject();
state.workSocket = this.client_socket;
state.workSocket.BeginReceive(state.buffer, 0, StateObject.bufferSize, SocketFlags.None, new AsyncCallback(ReceiveCallBack), state);
}
private void ReceiveCallBack(IAsyncResult ar)
{
try
{
StateObject state = ar.AsyncState as StateObject;
Socket handler = state.workSocket;
if(handler.Connected)
{
int bytes = handler.EndReceive(ar);
if (bytes > 0)
{
state.sb.Append(Encoding.UTF8.GetString(state.buffer, 0, bytes));
Console.WriteLine("Receive: " + state.sb);
Send();
}
}
}
catch (Exception) { Console.WriteLine("Error Receive"); }
}
private void Send()
{
Socket socket = this.client_socket;
//string message = Console.ReadLine();
byte[] buffer = Encoding.UTF8.GetBytes("Hello");
socket.BeginSend(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(SendCallBack), socket);
}
private void SendCallBack(IAsyncResult ar)
{
Socket handle = ar.AsyncState as Socket;
handle.EndSend(ar);
Receive();
}
}
}Решение задачи: «Исправление одного подключения (асинхронный сокет)»
textual
Листинг программы
//ждём подключения клиентов
private void StartListening()
{
Console.WriteLine("Server start...");
while (true)
{
acceptEvent.Reset();
this.socket.BeginAccept(new AsyncCallback(AcceptCallBack), this.socket);
acceptEvent.WaitOne();
}
}
//обработка подключившигося клиента
private void AcceptCallBack(IAsyncResult ar)
{
Socket socket = (Socket)ar.AsyncState;
Socket accept_socket = socket.EndAccept(ar);
acceptEvent.Set();
ServerHandle handle = new ServerHandle(accept_socket);
handle.Start();
Console.WriteLine("New connection.");
socket.BeginAccept(new AsyncCallback(AcceptCallBack), this.socket);
}