gpt4 book ai didi

c# - 无限循环从服务器响应

转载 作者:可可西里 更新时间:2023-11-01 02:40:15 25 4
gpt4 key购买 nike

我有以下代码来监听一个端口 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();
}
}
}

一旦我打开启动服务器,我在命令提示符下远程登录并发送消息,但在我的客户端上不断收到循环响应,但在我的服务器上没有响应。有人发现我有问题吗?我不能。我在我的 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;
}

最佳答案

罪魁祸首是:

 while (bytesRcvd > 0)

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

这可能会被简单的 if 代替,除非出于某种原因(在您的代码中不明显)您需要它循环:

if (bytesRcvd > 0)

再看一眼,您似乎在尝试使用以下代码验证所有字节是否已传输:

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

第三个参数不是 byref 参数,所以它不会更新为实际发送的值(如果小于传入的值)。 WriteRead 略有不同,如果它无法传输请求的字节数(而不是通知你有多少人成功了)。我可能会将其更改为:

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

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

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

关于c# - 无限循环从服务器响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9528022/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com