【问题标题】:Save connected Socket in Dictionary将连接的套接字保存在字典中
【发布时间】: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


【解决方案1】:

天哪,我发现了问题... 我使用以下方法调用它:

        using (Socket s = ModbusSocket.GetConnection(hostIp, port))
        {
            var telegram = new Telegram();
            telegram.Set(0, AddressConst.PositionWindow, 4);
            var response = telegram.SendAndReceive(s);
            var result = BitConverter.ToInt32(new byte[] { response.Byte19, response.Byte20, response.Byte21, response.Byte22 }, 0);
            return result;
        }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-20
    • 2013-03-03
    • 1970-01-01
    • 2015-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多