Задать вопрос

Переподключение к серверу на асинхронных сокетах C#?

Имеется сервер, реализованный через асинхронные сокеты.

Работаю только с 1 клиентом. Подключение, прием и передача работают успешно.

Немного облегчена задача, перед отключением клиент присылает строку «DISCONNECT».

Вопрос: как осуществить переподключение? Например, клиент отключается и вновь подключается через некоторое время.



<br>
class Ethernet<br>
    {<br>
        public static byte[] buffer = new byte[1024];<br>
        public static ManualResetEvent socketEvent = new ManualResetEvent(true);<br>
        public static Socket handlerA;<br>
        public static IPAddress ipAddr;<br>
        public static IPEndPoint localEnd;<br>
<br>
        public static void Start()<br>
        {<br>
            ipAddr = IPAddress.Parse("192.168.0.222");<br>
            localEnd = new IPEndPoint(ipAddr, 1100);<br>
            Socket sListener = new Socket(AddressFamily.InterNetwork,<br>
                SocketType.Stream, ProtocolType.Tcp);<br>
            sListener.Bind(localEnd);<br>
            sListener.Listen(10);<br>
            AsyncCallback aCallback = new AsyncCallback(AcceptCallback);<br>
            sListener.BeginAccept(aCallback, sListener);<br>
            socketEvent.WaitOne();<br>
        }<br>
        <br>
        public static void AcceptCallback(IAsyncResult ar)<br>
        {<br>
            Socket listner = (Socket)ar.AsyncState;<br>
            Socket handler = listner.EndAccept(ar);<br>
            handlerA = handler;<br>
            handler.BeginReceive(buffer, 0, buffer.Length, 0,<br>
                new AsyncCallback(ReceiveCallback), handler);<br>
        }<br>
<br>
        public static void ReceiveCallback(IAsyncResult ar)<br>
        {<br>
            string content = String.Empty;<br>
            Socket handler = (Socket)ar.AsyncState;<br>
            <br>
            int bytesRead = handler.EndReceive(ar);<br>
<br>
            if (bytesRead > 0)<br>
            {<br>
                content = Encoding.ASCII.GetString(buffer, 0, bytesRead);<br>
            }<br>
<br>
            if (content.ToUpper() != "DISCONNECT")<br>
            {<br>
                  // Работа с пришедшей строкой<br>
                handler.BeginReceive(buffer, 0, buffer.Length, 0,<br>
                        new AsyncCallback(ReceiveCallback), handler);<br>
            }<br>
            else<br>
            {<br>
                // Отключение<br>
            }<br>
        }<br>
<br>
        public static void Send(string str)<br>
        {<br>
            byte[] byteData = Encoding.ASCII.GetBytes(str);<br>
            handlerA.BeginSend(byteData, 0, byteData.Length, 0,<br>
                new AsyncCallback(SendCallback), handlerA);<br>
        }<br>
<br>
        public static void SendCallback(IAsyncResult ar)<br>
        {<br>
            Socket handler = (Socket)ar.AsyncState;<br>
            int bytesSend = handler.EndSend(ar);<br>
        }<br>
}<br>
  • Вопрос задан
  • 5993 просмотра
Подписаться 3 Оценить 3 комментария
Пригласить эксперта
Ответы на вопрос 2
@xdenser
Очевидно вызвать опять BeginAccept
Ответ написан
Комментировать
@Goldywhite
Если клиент гарантировано 1 то нет смысла использовать асинхронные сокеты.
В общем случае надо просто добавить:
sListener.BeginAccept(AcceptCallback, listener);
в конец функции:
public static void AcceptCallback(IAsyncResult ar)
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы