我有以下代码来监听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终端上远程办公。
[编辑 - 代码回答]
我只是在while循环中分配接收的字节变量,所以它一完成就不会循环。感谢您指出问题所在。以下是我的解决方案代码:
while ((bytesRcvd = netStream.Read(rcvBuffer, 0, rcvBuffer.Length)) > 0)
{
netStream.Write(rcvBuffer, 0, bytesRcvd);
totalBytesEchoed += bytesRcvd;
}
答案 0 :(得分:3)
罪魁祸首是:
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;
或者更好地实现一些基本的消息框架,以使您的应用程序知道应该期望多少字节。