来自服务器的无限循环响应

时间:2012-03-02 04:33:02

标签: c# networking tcp telnet

我有以下代码来监听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并发送消息,但在我的客户端上继续响应,但在我的服务器上没有响应。有人发现我有问题吗?我不能。我在我的Mac机器上的VMWare上使用Window 7 VS2010 C#进行开发,我从我的Mac终端上远程办公。

screenshot1

[编辑 - 代码回答]

我只是在while循环中分配接收的字节变量,所以它一完成就不会循环。感谢您指出问题所在。以下是我的解决方案代码:

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

1 个答案:

答案 0 :(得分:3)

罪魁祸首是:

 while (bytesRcvd > 0)

只要收到任何消息,它就会无限循环(你没有条件阻止这种情况发生)。

除非由于某些原因(在您的代码中不明显)需要循环,否则可能会用简单的if替换它:

if (bytesRcvd > 0)

第二眼看,几乎看起来你正试图通过使用这段代码来验证所有字节的传输:

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

第三个参数不是byref参数,因此不会使用实际发送的值更新(如果小于传入的值)。 WriteRead略有不同,因为如果无法传输请求的字节数,它实际上会抛出SocketException,而不是通知您有多少成功。我可能会把它改成:

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

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

或者更好地实现一些基本的消息框架,以使您的应用程序知道应该期望多少字节。