- 我在用着
Socket
(Socket A = new Socket...
) 发送/接收。
- 当发生某些事情(断开连接)时,我尝试关闭/处置旧对象,然后实例化一个新套接字(
A = new Socket...
)(同一主机/端口)
- The
connect()
阶段检查正常,远程主机看到连接。
- 在尝试发送第一个字节时,我立即得到:
System.ObjectDisposeException:无法访问已处置的对象。
对象名称:“System.Net.Sockets.Socket”。
在 System.Net.Sockets.Socket.Send(Byte[] 缓冲区、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
,并调用重新连接方法:
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);
}
让您的 Connect 方法创建一个new套接字并返回该套接字以发送数据。
更像是:
try
{
CCMSocket = new Socket();
CCMSocket.SetSocketOption(SocketOptionLevel.Tcp, SocketOptionName.NoDelay, true);
CCMSocket.Connect(CCMServer, CCMPort);
return CCMSocket
}
and
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);
您还应该认真考虑异步套接字模式 http://msdn.microsoft.com/en-us/library/5w7b7x5f.aspx构建服务器应用程序时。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)