TcpListener.acceptSocket 不接受 iis 连接

TcpListener.acceptSocket don't accept connection over iis

我有一个 TcpListener 的 Tcp 服务器。

在 Visual Studio (Asp.net MVC) 中一切正常,但是当我发布我的应用程序并 运行 使用 iis 时,TcpListener.acceptSocket 不接受连接。有什么问题?

更新:

我创建了一个使用 TcpListener 的 TCPServer。服务器启动时,一个线程 运行 接受挂起的连接。接受的套接字存储在列表中用于其他目的。每个接受的套接字接收相关数据包并使用它们。

我的代码如下:

public class TCPServer
{
    public static Dictionary<EndPoint, Socket> acceptedSockets = new Dictionary<EndPoint, Socket>();
    public TcpListener server { get; set; }
    public int port { get; set; }
    public TCPServer(int port)
    {
        this.port = port;
        try
        {
            server = new TcpListener(IPAddress.Any, port);
        }
        catch (Exception e)
        {
            server = null;
        }
    }

    static TCPSocketListener socketListener;
    private Thread serverThread { get; set; }
    private bool stopServer { get; set; }

    public void StartServer()
    {
        if (server != null)
        {
            acceptedSockets = new Dictionary<EndPoint, Socket>();
            server.Server.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
            server.Start();
            stopServer = false;
            serverThread = new Thread(new ThreadStart(ServerThreadStart));
            serverThread.Start();
        }
        else
        {
            NotificationHub.showMessage("Error in server connection.");
        }
    }

    private void ServerThreadStart()
    {
        Socket clientSocket = null;
        while (!stopServer)
        {
            try
            {
                if (!server.Pending())
                {
                    Thread.Sleep(500);
                    continue;
                }
                IPEndPoint localEndPoint = new IPEndPoint(IPAddress.Any, port);
                clientSocket = server.AcceptSocket();
                socketListener = new TCPSocketListener(clientSocket);
                if (!acceptedSockets.ContainsKey(clientSocket.RemoteEndPoint))
                    acceptedSockets.Add(clientSocket.RemoteEndPoint, clientSocket);
                socketListener.OnPacketReceive += GetReceivedData;
                socketListener.StartSocketListener();
            }
            catch (SocketException se)
            {
                stopServer = true;
            }
        }

    }

    public delegate void DataEventHandler(object sender, DataEventArgs e);

    public event DataEventHandler OnPacketReceive;
    private void GetReceivedData(object sender, DataEventArgs args)
    {
        PacketReceive(args);
    }
    protected virtual void PacketReceive(DataEventArgs e)
    {
        OnPacketReceive?.Invoke(this, e);
    }

    public void StopServer()
    {
        if (server != null)
        {
            stopServer = true;
            if (socketListener != null)
                socketListener.StopReceive();
            server.Stop();

            // Wait for one second for the the thread to stop.
            serverThread.Join(1000);

            if (serverThread.IsAlive)
            {
                serverThread.Abort();
            }
            serverThread = null;
            server = null;
            foreach (var item in acceptedSockets)
            {
                try
                {
                    item.Value.Shutdown(SocketShutdown.Both);
                    item.Value.Dispose();
                    item.Value.Close();
                }
                catch { }
            }
            acceptedSockets.Clear();


        }
    }


    public class TCPSocketListener
    {
        public Socket socket { get; set; }
        private Thread thread { get; set; }
        private bool stopReceive { get; set; }

        public TCPSocketListener(Socket socket)
        {
            this.socket = socket;
        }

        public void StartSocketListener()
        {
            stopReceive = false;
            thread = new Thread(new ThreadStart(ReceiveThread));
            thread.Start();

        }

        private void ReceiveThread()
        {
            byte[] bytes = null;
            while (!stopReceive)
            {
                try
                {
                    bytes = new byte[1024000];
                    int bytesRec = socket.Receive(bytes);
                    string data = Encoding.Default.GetString(bytes);
                    if (data.Length == 0)
                    {
                        break;
                    }
                    AddPacket(data, (socket.RemoteEndPoint as IPEndPoint).Address.ToString());
                    new string[] { data });
                }
                catch (Exception ex)
                {
                    break;
                }
            }
        }

        public void StopReceive()
        {
            acceptedSockets.Remove(socket.RemoteEndPoint);
            stopReceive = true;
            thread.Abort();
            socket.Shutdown(SocketShutdown.Receive);
            socket.Close();
        }

        public delegate void DataEventHandler(object sender, DataEventArgs e);
        public event DataEventHandler OnPacketReceive;
        public void AddPacket(string data, string sourceIp)
        {
            DataEventArgs args = new DataEventArgs();
            args.data = data;
            args.sourceIp = sourceIp;
            PacketReceive(args);
        }
        protected virtual void PacketReceive(DataEventArgs e)
        {
            OnPacketReceive?.Invoke(this, e);
        }

    }

}

导致该问题的最可能原因与 IIS 无关,与 firewall/network 问题更相关。请关闭网络服务器和客户端的防火墙,然后重试。
如果问题仍然存在,请随时告诉我。