Как я могу изменить свою связь через сокет, чтобы получить хороший ответ? - PullRequest
0 голосов
/ 22 января 2020

Я создаю службу windows и клиент, и они общаются, думает, сокет.

Я добавляю receiveTimeout в мой сокет 10000ms, для моего первого запроса у меня нет проблем, у меня есть мой ошибка тайм-аута, но для моего второго запроса я получаю сообщение первого запроса.

Кто-то знает, как мне изменить свой код, чтобы он работал.

Клиент :

static void Main(string[] args)
{    
    while (true)
    {
        Console.WriteLine("Enter a request: ");
        string req = Console.ReadLine();

        byte[] buffer = Encoding.ASCII.GetBytes(req);
        _clientSocket.Send(buffer,0,buffer.Length,SocketFlags.None);
        _clientSocket.ReceiveTimeout = 10000;

        Console.WriteLine("RECEIVE TIMEOUT" + _clientSocket.ReceiveTimeout);

        if (req != string.Empty)
        {
            try
            {
                var receivedBuffer = new byte[2048];
                int rec = _clientSocket.Receive(receivedBuffer, SocketFlags.None);

                byte[] data = new byte[rec];
                Array.Copy(receivedBuffer, data, rec);
                string result = Encoding.ASCII.GetString(data);

                Console.WriteLine("Received : " + result);
            }
            catch (SocketException se)
            {
                if (se.SocketErrorCode == SocketError.TimedOut)
                    Console.WriteLine("TIMEOUT");
            }
        }
    }
}

Сервер :

protected override void OnStart(string[] args)
{

    try
    {
        Log.writeEventLog("Setting up server...");
        _serverSocket.Bind(new IPEndPoint(IPAddress.Any, 100));
        _serverSocket.Listen(1);
        _serverSocket.BeginAccept(new AsyncCallback(AcceptCallback), null);
    }catch(Exception ex)
    {
        Log.writeEventLog("SetupServer :" + ex.Message);
    }

}

private static void AcceptCallback(IAsyncResult AR)
{
    try
    {
        Socket socket = _serverSocket.EndAccept(AR);
        _clientSockets.Add(socket);
        Log.writeEventLog("Client connected");
        socket.BeginReceive(_buffer,0,_buffer.Length,SocketFlags.None,new AsyncCallback(ReceiveCallback),socket);
        _serverSocket.BeginAccept(new AsyncCallback(AcceptCallback), null);
    }
    catch (Exception ex)
    {
        Log.writeEventLog("AcceptCallback :" + ex.Message);
    }
}

private static void ReceiveCallback(IAsyncResult AR)
{
    Socket socket = (Socket)AR.AsyncState;
    try
    {
        int received = socket.EndReceive(AR);
        byte[] dataBuf = new byte[received];
        Array.Copy(_buffer,dataBuf,received);

        string text = Encoding.ASCII.GetString(dataBuf);
        Log.writeEventLog("TEXT RECEIVED: " + text);

        string response = string.Empty;

        if(text.ToLower().Contains("0_"))
        {
            System.Threading.Thread.Sleep(10500);
            response = "Check";
        }
        else if (text.ToLower().Contains("1_"))
        {
            System.Threading.Thread.Sleep(10500);
            response = "Refresh" ;
        }
        else
        {
            System.Threading.Thread.Sleep(10500);
            response = "Invalid Request";
        }

        byte[] data = Encoding.ASCII.GetBytes(response);
        socket.BeginSend(data, 0, data.Length, SocketFlags.None, new AsyncCallback(SendCallBack), socket);
        socket.BeginReceive(_buffer, 0, _buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveCallback), socket);
    }
    catch(Exception ex)
    {
        Log.writeEventLog("client disconnected");
        socket.Close();
        socket.Dispose();
    }
}

private static void SendCallBack(IAsyncResult AR)
{
    try
    {
        Socket socket = (Socket)AR.AsyncState;
        socket.EndSend(AR);
    }
    catch (Exception ex)
    {
        Log.writeEventLog("sendcallback :" + ex.Message);
    }
}

Например, мой запрос:

запрос 1: 0_test -> после 10000мс I есть ответ TIMEOUT

запрос 2: t -> через 10000 мс У меня есть ответ Check

Для проверки receiveTimeout Я использую Thread.Sleep(10500)

...