C# 来自服务器的无限循环响应
我有下面的一段代码来监听55000端口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();
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循环的条件中分配变量。到目前为止,它是有效的。