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

C# 来自服务器的无限循环响应,c#,networking,tcp,telnet,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();

我有下面的一段代码来监听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上开发Windows7VS2010C#,从我的Mac终端进行远程通信

[编辑-代码应答]

我只是在while循环中分配bytes received变量,这样它一完成就不会循环。谢谢你指出这个问题。以下是我的解决方案代码:

while ((bytesRcvd = netStream.Read(rcvBuffer, 0, rcvBuffer.Length)) > 0)
{
    netStream.Write(rcvBuffer, 0, bytesRcvd);
    totalBytesEchoed += bytesRcvd;
}
罪魁祸首是:

 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;

或者更好的方法是实现一些基本的消息框架,让应用程序知道需要多少字节。

+1您指出了问题所在。请参阅已编辑的问题和我的解决方案。我在while循环的条件中分配变量。到目前为止,它是有效的。