Бесконечный цикл отвечает от сервера - PullRequest
2 голосов
/ 02 марта 2012

У меня есть следующий фрагмент кода для прослушивания порта, который является 55000.

static void TcpEchoServer(string _servPort)
{
    int servPort = Convert.ToInt32(_servPort);

    TcpListener listener = null;

    try
    {
        listener = new TcpListener(IPAddress.Any, servPort);
        listener.Start();
    }
    catch (SocketException sec)
    {
        Console.WriteLine(sec.ErrorCode + ": " + sec.Message);
        Environment.Exit(sec.ErrorCode);
    }

    byte[] rcvBuffer = new byte[BUFSIZE];
    int bytesRcvd;

    for (; ; )
    {
        TcpClient client = null;
        NetworkStream netStream = null;

        try
        {
            // Get client connection and stream
            client = listener.AcceptTcpClient();
            netStream = client.GetStream();
            Console.Write("Handling client - ");

            // Receive until client closes connection, indicated by 0 return value
            int totalBytesEchoed = 0;
            bytesRcvd = netStream.Read(rcvBuffer, 0, rcvBuffer.Length);

            while (bytesRcvd > 0)
            {
                netStream.Write(rcvBuffer, 0, bytesRcvd);
                totalBytesEchoed += bytesRcvd;
            }

            Console.WriteLine("echoed {0} bytes.", totalBytesEchoed);

            // Close stream and socket
            netStream.Close();
            client.Close();
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
            netStream.Close();
        }
    }
}

После того, как я открыл запущенный сервер, я в своей командной строке отправляю сообщение telnet и отправляю сообщение, но на моем клиенте получал цикл, а на моем сервере - нет. У кого-нибудь есть проблемы? Я не могу Я разрабатываю на Windows 7 VS2010 C # на VMWare на моем компьютере Mac, где я отключаюсь от моего терминала Mac.

screenshot1

[РЕДАКТИРОВАТЬ - код ответа]

Я просто назначаю переменную, полученную в байтах, в цикле while, чтобы он не зацикливался после завершения. Спасибо за указание на проблему. Ниже приведен код моего решения:

while ((bytesRcvd = netStream.Read(rcvBuffer, 0, rcvBuffer.Length)) > 0)
{
    netStream.Write(rcvBuffer, 0, bytesRcvd);
    totalBytesEchoed += bytesRcvd;
}

1 Ответ

3 голосов
/ 02 марта 2012

Преступник:

 while (bytesRcvd > 0)

Пока любое сообщение получено, оно будет зацикливаться бесконечно (у вас нет условий, чтобы предотвратить это).

Возможно, этозаменяется простым if, если только по какой-то причине (неочевидно в вашем коде) вам не нужно его зациклить:

if (bytesRcvd > 0)

При втором взгляде это выглядит так, будто вы пытаетесь проверить, что всебайты передаются с использованием этого кода:

while (bytesRcvd > 0)
{
    netStream.Write(rcvBuffer, 0, bytesRcvd);
    totalBytesEchoed += bytesRcvd;
}

Третий параметр не является аргументом byref, поэтому он не будет обновляться с использованием фактически отправленного значения (если оно меньше значения, переданного в).Write немного отличается от Read тем, что он на самом деле выдает SocketException, если не смог передать количество запрошенных байтов (в отличие от информирования вас о том, сколько было успешно).Я бы, вероятно, изменил бы его на:

if (bytesRcvd == 0)
    throw new SocketException(String.Format("Unable to receive message");

netStream.Write(rcvBuffer, 0, bytesRcvd);
totalBytesEchoed += bytesRcvd;

Или, что еще лучше, реализовал бы фундаментальное кадрирование сообщений, чтобы ваше приложение могло знать, сколько байтов оно должно ожидать.

...