【问题标题】:ObjectDisposeException when trying to send through a reopened socket尝试通过重新打开的套接字发送时出现 ObjectDisposeException
【发布时间】:2011-01-16 08:36:33
【问题描述】:
  1. 我正在使用Socket (Socket A = new Socket...) 发送/接收。
  2. 当发生某些事情(断开连接)时,我正在尝试关闭/处理旧对象,然后实例化一个新套接字 (A = new Socket...)(相同的主机/端口)
  3. connect() 阶段检查正常,远程主机看到连接。
  4. 在尝试发送第一个字节时,我立即得到:

System.ObjectDisposedException:无法访问已处置的对象。 对象名称:'System.Net.Sockets.Socket'。 在 System.Net.Sockets.Socket.Send(字节 [] 缓冲区,Int32 偏移量,Int32 大小,SocketFlags socketFlags,SocketError&errorCode) 在 System.Net.Sockets.Socket.Send(Byte[] 缓冲区,Int32 偏移量,Int32 大小,SocketFlags socketFlags) 在 System.Net.Sockets.Socket.Send(Byte[] 缓冲区)

有什么想法吗?

try
{
   CCMSocket.SetSocketOption(SocketOptionLevel.Tcp, SocketOptionName.NoDelay, true);
   CCMSocket.Connect(CCMServer, CCMPort);
}

现在,当使用套接字时,catch 子句捕获SocketException,并调用reconnect 方法:

try
{
    //Verify the the socket is actually disconnected
    byte[] Empty = new byte[0];
    CCMSocket.Send(Empty);
}
catch (Exception ex)
{
    bool connected = false;
    int reconnectCounter = 0;
    do
    {
        reconnectCounter++;
        Disconnect(); //<-- Just CCMSocket.Disconnect(true) in a try/catch
        if (Connect(CCMServer, CCMPort)) // <-- method given above
        {
            connected = true;
            CCMSocket.Send(LoginData); // this fails
        }
    } while (!connected);    
}

【问题讨论】:

  • 我们可以看看你的代码,看看你是如何处理你的对象的。
  • 你能发布一些代码提取,听起来你使用的是相同的参考
  • 你是否在任何地方使用using 阻止Socket 对象?

标签: c# sockets objectdisposedexception


【解决方案1】:

让您的 Connect 方法创建一个 new 套接字并返回该套接字以发送数据。 更像是:

try
{
   CCMSocket = new Socket();
   CCMSocket.SetSocketOption(SocketOptionLevel.Tcp, SocketOptionName.NoDelay, true);
   CCMSocket.Connect(CCMServer, CCMPort);
   return CCMSocket
}

do
{
    reconnectCounter++;
    Disconnect(); //<-- Just CCMSocket.Disconnect(true) in a try/catch
    var newSocket = Connect(CCMServer, CCMPort); // <-- method given above
    if (newSocket != null) 
    {
        connected = true;
        newSocket.Send(LoginData); // should work
        CCMSocket = newSocket; // To make sure existing references work
    }
} while (!connected);

在构建服务器应用程序时,您还应该认真考虑asynchronous socket pattern

【讨论】:

    猜你喜欢
    • 2022-07-05
    • 1970-01-01
    • 2013-03-25
    • 1970-01-01
    • 1970-01-01
    • 2016-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多