C# 套接字接收不释放缓冲区(字节数组)
我现在正在开发一个服务,它监听TCP协议中的消息,并将它们发送到不同的目的地 所以我定义了一个套接字,它一直保持打开状态并获取消息。协议的大小是静态的,消息一次到达几个 只要接收到值,循环就会运行,并减少消息的匹配大小 该服务运行良好-所有消息都会根据需要接收,但内存会不断增加。 实施:C# 套接字接收不释放缓冲区(字节数组),c#,sockets,memory-leaks,tcplistener,C#,Sockets,Memory Leaks,Tcplistener,我现在正在开发一个服务,它监听TCP协议中的消息,并将它们发送到不同的目的地 所以我定义了一个套接字,它一直保持打开状态并获取消息。协议的大小是静态的,消息一次到达几个 只要接收到值,循环就会运行,并减少消息的匹配大小 该服务运行良好-所有消息都会根据需要接收,但内存会不断增加。 实施: public void WaitingForClient() { while (true) { // Accept will block until someone connec
public void WaitingForClient()
{
while (true)
{
// Accept will block until someone connects
m_Socket = m_TcpLsn.AcceptSocket();
ThreadPool.QueueUserWorkItem(new WaitCallback(ReadSocket));
}
}
//Read the data from the socket
public void ReadSocket(object obj)
{
Socket s = m_Socket;
if (s.Connected)
{
Byte[] receive = new Byte[MESSAGE_LENGTH];
try
{
// Receive will block until data coming
// ret is 0 or Exception happen when Socket connection is broken
int ret = s.Receive(receive, receive.Length, 0);
while (ret > 0)
{
OnMessageRecieved(new RecievedMessage(receive));
**receive = new Byte[MESSAGE_LENGTH];**
ret = s.Receive(receive, receive.Length, SocketFlags.None);
}
}
我在NetMemoryProfiler中看到,缓冲区(循环中定义的字节数组)永远不会被释放,因此存在内存泄漏问题。在每次发送消息时,都会创建另一个字节数组实例&不会释放任何内容
我尝试编写一个循环,以这种方式初始化空数组:
try
{
// Receive will block until data coming
// ret is 0 or Exception happen when Socket connection is broken
int ret = s.Receive(receive, receive.Length, 0);
while (ret > 0)
{
OnMessageRecieved(new RecievedMessage(receive));
for (int i = 0; i < MESSAGE_LENGTH; i++)
{
receive[i] = 00;
}
ret = s.Receive(receive, receive.Length, SocketFlags.None);
}
试试看
{
//接收将被阻止,直到数据到来
//ret为0或套接字连接断开时发生异常
int-ret=s.Receive(Receive,Receive.Length,0);
而(ret>0)
{
OnMessageReceived(新收到的消息(接收));
对于(int i=0;i
但随后,发送的部分消息使用空值而不是正确的值(连接在一起的消息)
如何解决它?OnMessageRecieved做了什么?@JonSkeet非常好的一点,它可以保存新的
ReceivedMessage
以及所有缓冲区(假设类保持接收)。您应该使用“ret”中的值从“receive”提取/复制数据缓冲区,并将其传递给OnMessageReceived()。然后您只需保持“receive”不变,而不是每次都创建一个新的缓冲区。此类用于某些项目,因此我抛出事件并将当前消息发送到主项目。