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 问题更相关。请关闭网络服务器和客户端的防火墙,然后重试。
如果问题仍然存在,请随时告诉我。
我有一个 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 问题更相关。请关闭网络服务器和客户端的防火墙,然后重试。
如果问题仍然存在,请随时告诉我。