Windows 服务中的 TCP IP 侦听器

2023-12-06

我正在尝试创建一个需要在后台运行并侦听传入流量的 Windows 服务(正常且常规的 TCP 侦听器)

我的代码是:

private TcpListener server;

public void startServer()
    {
       // EventLog.WriteEntry(source, "connected on: " + ipAddress.ToString() + " port: " + Service1.Port.ToString());

        server = new TcpListener(IPAddress.Parse("127.0.0.1"), Service1.Port);

         server.Start();
        while (true)
        {
          var client = server.AcceptTcpClient();


            new Thread(work).Start(client);

        }

 public void work(object client)
    {
        string msg = null;
        var clientLocal = (TcpClient)client;


            using (NetworkStream ns = clientLocal.GetStream())
            using (StreamReader sr = new StreamReader(ns))
            {
            byte[] msgFullArray = new UTF8Encoding(true).GetBytes(msg);
            fs.Write(msgFullArray, 0, msg.Length);
            }

现在,如果您根本不查看工作方法,因为每当我启动服务时,每当我尝试在我的位置启动它时,它就会冻结:

 var client = server.AcceptTcpClient();

这意味着我的服务永远无法使用 Thread 或我的 Work 方法。 我可以从之前的日志记录中看到它进入我的 while 循环,然后使服务超时


In your OnStart你必须实例化一个服务器类的方法。

protected override void OnStart(string[] args)
{
  // Create the Server Object ans Start it.
  server = new TCPServer();
  server.StartServer();
}

负责通过创建新的连接来处理与服务器的连接Thread(这样它就是一个非阻塞进程)

public void StartServer()
{
  if (m_server!=null)
  {
    // Create a ArrayList for storing SocketListeners before
    // starting the server.
    m_socketListenersList = new ArrayList();

    // Start the Server and start the thread to listen client 
    // requests.
    m_server.Start();
    m_serverThread = new Thread(new ThreadStart(ServerThreadStart));
    m_serverThread.Start();

    // Create a low priority thread that checks and deletes client
    // SocktConnection objcts that are marked for deletion.
    m_purgingThread = new Thread(new ThreadStart(PurgingThreadStart));
    m_purgingThread.Priority=ThreadPriority.Lowest;
    m_purgingThread.Start();
  }
}

对于每个套接字,它将由一个监听TCPListener.

private void ServerThreadStart()
{
  // Client Socket variable;
  Socket clientSocket = null;
  TCPSocketListener socketListener = null;
  while(!m_stopServer)
  {
    try
    {
      // Wait for any client requests and if there is any 
      // request from any client accept it (Wait indefinitely).
      clientSocket = m_server.AcceptSocket();

      // Create a SocketListener object for the client.
      socketListener = new TCPSocketListener(clientSocket);

      // Add the socket listener to an array list in a thread 
      // safe fashon.
      //Monitor.Enter(m_socketListenersList);
      lock(m_socketListenersList)
      {
        m_socketListenersList.Add(socketListener);
      }
      //Monitor.Exit(m_socketListenersList);

      // Start a communicating with the client in a different
      // thread.
      socketListener.StartSocketListener();
    }
    catch (SocketException se)
    {
      m_stopServer = true;
    }
  }
}

这里是完整的项目文章.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Windows 服务中的 TCP IP 侦听器 的相关文章

随机推荐

  • 在 android 中我可以使用什么来代替上下文菜单? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 我想在单击按钮时显示一些选项 我现在使用上下文菜单 但 Android 3 下面显示的上下文菜单不适合当前的应用程序设计 我想更改上下文菜单的样式或
  • d3.js 如何简化复杂路径 - 使用自定义算法

    我这里有一个非常基本的例子 http jsfiddle net jEfsh 57 这会创建一条复杂的路径 有很多点 我已经阅读了一种算法 可以查看这些点并创建一组更简单的坐标 有谁有这方面的经验 有关如何循环路径数据并将其传递给算法的示例
  • 在 PHP 中从动态 Unicode 创建 UTF-8 代码

    我正在用 PHP 制作一个动态 Unicode 图标 我想要 Unicode 图标的 UTF 8 代码 到目前为止我已经做了 value 1F600 emoIcon u value emoIcon preg replace u 0 9A F
  • 谷歌 OAuth 错误 -1001

    在我的应用程序中 我尝试实现谷歌帐户访问 当我在登录会话中初始化其工作时 之后它在屏幕截图中抛出以下错误 这是我的代码初始化和方法实现 static NSString const kKeychainItemName nil NSString
  • 将对象数组从 servlet 发送到 JSP

    我想通过请求将我自己的对象数组发送到 JSP 页面 在 servlet 中的这部分代码中 我将获取数据 将其放入对象数组中 并将它们设置为请求 if request getParameter todo equals show article
  • 在 Python 中解析 Twitter JSON 对象

    我正在尝试从 Twitter 下载推文 我为此使用了 python 和 Tweepy 虽然我对 Python 和 Twitter API 都很陌生 我的Python脚本如下 usr bin python import modules imp
  • 根据 PWD 更新多项缓冲区名称

    如果我使用 konsole 或其他终端 终端标签名称可以根据 PWD 更改 但在多项中 缓冲区名称是 terminal
  • 如何在 WPF 中创建反斜杠键的键绑定?

    Trying to define a CTRL Backslash keybinding for our WPF command but we re running into two issues 反斜杠键没有任何预定义常量 只有 Oem
  • 如何向下滚动 UITable 视图,直到在 Calabash 中看到带有标签“Value”的单元格

    如何向下滚动 UITableView 直到看到带有标签 Value 的单元格葫芦 黄瓜 我一直在尝试使用以下方法来做到这一点 Then I swipe down until I see Value 并使用 Then I scroll dow
  • 有没有办法在属性网格之外使用 CollectionEditor?

    我正在用一些可以让我更好地自定义 UI 的东西替换我的属性网格 我在表单上放置了一个按钮 我希望单击该按钮时会弹出一个 CollectionEditor 并允许我修改我的代码 当我使用 PropertyGrid 时 我所需要做的就是向指向我
  • 使用 Flexbox 在具有共享标题的两列布局中拉伸列

    我正在使用 Flexbox 创建带有标题行的两列布局 box sizing border box position relative container border 2px solid gray display flex flex wra
  • VBA - 将 SAPI 语音保存到给定的文件类型?

    My Task 可以在 Office 应用程序中使用语音 我的目标是将 MS SAPI 语音保存为给定的文件类型 AFAIK 我的代码示例保存到 WAV 文件 Problem 我不知道是否可以仅定义所需的文件类型扩展名 或者是否有必要进行一
  • 来自 Qt C++ 应用程序的倍频程图

    我有一个 QT C 应用程序 它使用 QProcess 运行 Octave 程序 我可以通过读取标准输出 错误并使用 write 方法写入其标准输入 例如 octave gt write 5 5 n 来与它进行通信 正如我告诉你的 我得到了
  • 屏幕方向更改时旋转视图(但不是布局)

    我想旋转按钮 文本视图 等 屏幕方向发生变化 但我想保持布局不变 如何做呢 我正在使用线性布局 This is what I mean Create res gt layout gt layout land并将你的 xml 文件放入横向 模
  • 要避免的 jQuery 陷阱 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心以获得指导 我正在用 jQuery 启
  • dblookupcombobox 有空行

    我有一个关于 DBLookupComboBox 的问题 我有一个程序 其中有我编写的数据库 它拥有一切 除了当我打开 DBLookupComboBox 时 它必须有一行带有空值 因为当用户不想选择任何内容时 但没有一个 如何让空行显示出来
  • Kotlin 中是否有适用于可序列化类型的接口?

    我想创建一个大致如下所示的类 class MyWrapperClass
  • 如何控制推送通知中按钮的功能?

    我能够向 iOS 设备发送推送通知 通知上有一个 关闭 按钮和一个 查看 按钮 当用户点击 查看 按钮时 应用程序将打开根视图控制器 该应用程序内有一个新闻部分 假设该通知是为了提醒用户有新的新闻报道可供他们查看 如果他们点击 查看 将显示
  • 每当 Android 派中的应用程序被杀死时,服务也会被杀死

    我正在通过创建 Android 应用程序来学习 Android 编程 但是每当我杀死应用程序服务时也会被杀死 我在用着JobIntentService 使该应用程序在后台运行 工作意图服务类 public class BackGroundD
  • Windows 服务中的 TCP IP 侦听器

    我正在尝试创建一个需要在后台运行并侦听传入流量的 Windows 服务 正常且常规的 TCP 侦听器 我的代码是 private TcpListener server public void startServer EventLog Wri