【发布时间】:2016-09-11 11:16:57
【问题描述】:
我正在制作一个客户端-服务器应用程序,但是当我尝试登录时它会引发 OutOfMemoryException,这是我的服务器端代码:
byte[] buffer = new byte[4];
requestCount = requestCount + 1;
NetworkStream networkStream = clientSocket.GetStream();
buffer = new byte[4];
int readBytes = networkStream.Read(buffer, 0, 4);
readBytes = networkStream.Read(buffer, 0, 4);
if (readBytes == 0)
break;
int MessageSize = BitConverter.ToInt32(buffer, 0);
byte[] bufferreader = new byte[MessageSize]; <- here the exception is thrown
readBytes = networkStream.Read(bufferreader, 0, MessageSize);
if (readBytes == 0)
break;
dataFromClient = Encoding.ASCII.GetString(bufferreader);
rCount = Convert.ToString(requestCount);
serverResponse = R.Respond(dataFromClient);
sendBytes = Encoding.ASCII.GetBytes(serverResponse);
networkStream.Write(sendBytes, 0, sendBytes.Length);
networkStream.Flush();
这是我的客户端代码:
clientSocket.Connect("192.168.1.100", 666);
SHA512Managed S = new SHA512Managed();
byte[] result = S.ComputeHash(Encoding.UTF8.GetBytes(password));
string epassword = Convert.ToBase64String(result);
try
{
byte[] buffer = new byte[4];
NetworkStream serverStream = clientSocket.GetStream();
byte[] outStream = Encoding.ASCII.GetBytes("authenticate|" + user + "$");
buffer = new byte[4];
buffer = BitConverter.GetBytes(outStream.Length);
serverStream.Write(buffer, 0, 4);
serverStream.Flush();
serverStream.Write(outStream, 0, outStream.Length);
serverStream.Flush();
byte[] inStream = new byte[10025];
serverStream.Read(inStream, 0, (int)clientSocket.ReceiveBufferSize);
string returndata = Encoding.ASCII.GetString(inStream);
}
catch(Exception ex)
{
Toast.MakeText(l, ex.Message, ToastLength.Long).Show();
}
Toast.MakeText(l, "Logged In: " + epassword, ToastLength.Long).Show();
所以基本上客户端首先将实际消息的长度发送到服务器,以便它知道它需要多少字节,但是当我创建一个新的缓冲区来保存消息时,它会抛出 OutOfMemoryException,
提前致谢
【问题讨论】:
-
MessageSize 的评估结果是什么?您确定您的标头嗅探得出了正确的值吗?看起来您正在读取前 4 个字节两次,这可能意味着您实际上是在将缓冲区大小基于第 5-8 个字节。
-
此外,您正在使用 BitConverter 来读取数字。您确定您正确读取了这些位吗?有线格式是否可能使用与您预期不同的字节序?
-
MessageSize 保存正在接收的消息的实际大小
-
既然你提出来了,嗯,等一下,看看它在运行时读取的字节数
-
是的,在运行时。检查实际读取了什么,而不是假定会发生什么。
标签: c#