【发布时间】:2021-08-28 09:52:53
【问题描述】:
我正在尝试将连接的套接字保存在字典中,这样我的 API 就不必每次都创建新连接。我的问题是套接字被处理掉了。 因此,当我第二次调用 GetConnection() 时,socket.connected 为 false 并且 socket.Available.Message 为“无法访问已处置的对象。对象名称:'System.Net.Sockets.Socket'。”。
public static class ModbusSocket
{
private static Dictionary<IPAddress, Socket> socketList;
public static Socket GetConnection(string server, int port)
{
if (socketList is null)
{
socketList = new Dictionary<IPAddress, Socket>();
}
IPAddress iPAddress = IPAddress.Parse(server);
if (socketList.ContainsKey(iPAddress))
{
var socket = socketList[iPAddress];
if (socket.Connected)
{
return socket;
}
else
{
socketList.Remove(iPAddress);
socket = new Socket(iPAddress.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
IPEndPoint ipe = new IPEndPoint(iPAddress, port);
socket.Connect(ipe);
socketList.Add(iPAddress, socket);
return socket;
}
}
else
{
Socket socket = new Socket(iPAddress.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
IPEndPoint ipe = new IPEndPoint(iPAddress, port);
socket.Connect(ipe);
socketList.Add(iPAddress, socket);
return socket;
}
}
}
【问题讨论】:
-
问题出在其他地方。连接正在从客户端或服务器关闭。您的代码也有错误。字典中不能有两个具有相同 IP 的项目。更改以下内容:来自:socketList.Add(iPAddress, socket);到:socketList[IPAddress] = socket.
-
是的,我已经看到了,我现在从字典中删除了该值,然后再次添加。
标签: c# asp.net sockets asp.net-core tcp