C# 套接字编程 [关闭]

2024-06-24

嘿,我对 C# 异步套接字编程做了噩梦。您能给我指点一本深入解释异步编程的指南、教程或书籍吗?如果可能包含如何使用state开始发送/接收函数中的参数来处理多个客户端。


服务器可以通过这样的场景来组织:用于客户端连接的单独线程监听端口。

 
 /// Async server
 public class AsyncServer
 {
     /// Server socket
     private Socket _serverSocket;

     /// Element for sync wait 
     private static ManualResetEvent _connectionMutex =
              new ManualResetEvent(false);

     /// Client handler
     private ClientManager _clientManager;

     public AsyncServer(string ipAddrees, int port)
     {
         try
         {             
             this._serverSocket = new Socket(AddressFamily.InterNetwork,
                 SocketType.Stream, ProtocolType.Tcp);

             this._serverSocket.Bind(
               new IPEndPoint(IPAddress.Parse(ipAddrees), port));

         }
         catch (Exception ex)
         {
             throw new Exception("Server Init Error.", ex);
         }
     }

     private BackgroundWorker _listenThread = new BackgroundWorker();

     public void Start()
     {
         this._clientManager = new ClientManager(this._clientConnections);

         this._listenThread.WorkerReportsProgress = true;
         this._listenThread.WorkerSupportsCancellation = true;
         this._listenThread.DoWork +=
              new DoWorkEventHandler(ListenThread_DoWork);

         this._listenThread.RunWorkerAsync(this._serverSocket);
     }

     /// Thread for listening port
     private void ListenThread_DoWork(object sender, DoWorkEventArgs e)
     {
         Socket serverSocket = (Socket)e.Argument;

         serverSocket.Listen(100);

         while (true)
         {
             // reset mutex
             _connectionMutex.Reset();

             serverSocket.BeginAccept(
             new AsyncCallback(this.AcceptCallback), this._serverSocket);

             // waiting for the next connection
             _connectionMutex.WaitOne();
         }
     }

     /// List of client connections
     private List _clientConnections = new List();  

     public int ConnectionsCount
     {
         get { return this._clientConnections.Count; }
     }

     /// Callback method for handling connections
     private void AcceptCallback(IAsyncResult asyncResult)
     {
         _connectionMutex.Set();

         Socket serverSocket = (Socket)asyncResult.AsyncState;
         Socket clientSocket = (Socket)serverSocket.EndAccept(asyncResult);
         this._clientConnections.Add(clientSocket);

         this._clientManager.HandleClient(clientSocket);
     }

 }
 

Method AcceptCallback(IAsyncResult asyncResult)处理所有新的客户端连接和传输致客户经理,它为每个客户端创建单独的线程。

 

   public class ClientManager
   {       

       private List _clientProcessors = new List();


       private List _connections;       

       public ClientManager(List connections)
       {
           this._connections = connections;
       }

       /// Handling of client connection      
       public void HandleClient(Socket clientSocket)
       {
           BackgroundWorker clientProcessor = new BackgroundWorker();
           clientProcessor.DoWork += new DoWorkEventHandler(ClientProcessing);

           this._clientProcessors.Add(clientProcessor);

           List args = new List();
           // 
           // args.Add(...);           

           clientProcessor.RunWorkerAsync(args);
       }      

       private void ClientProcessing(object sender, DoWorkEventArgs e)
       {
           // reading args
           List args = (List)e.Argument;          

           ProtocolSerializer serializer = new ProtocolSerializer();

           try
           {
               while (socket.Connected)
               {               
                   // ...

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

C# 套接字编程 [关闭] 的相关文章

  • 是否可以使静态控件透明?

    我正在尝试实现一个静态控件 该控件刷新 更改文本 以响应每秒发生一次的某个事件 由于我不想每秒绘制整个客户区域 所以我决定使用静态控件 现在的问题是父窗口被蒙皮 这意味着它有自定义位图作为背景 而静态控件没有适应 所以我正在寻找使静态控件的
  • 如何使用 LINQ ForEach 更改 List

    我有一个List
  • HTML 文档

    有没有一个工具可以从 VS2010 生成的 XML 文档文件生成 HTML 页面 我在谷歌上搜索了这样的工具 但没有找到 我下载并安装了SandCastle 但我不明白如何使用它 尝试使用Sandcastle 帮助文件生成器 http sh
  • 在异步方法中使用时 HttpClient 标头被清空

    我正在使用 NET Framework 4 6 1 我的 Web api 中有一个控制器 其中有静态 HttpClient 来处理所有 http 请求 在 IIS 上托管我的应用程序后 大约每月一次 我的应用程序的所有传入请求都会出现以下异
  • 指向指针的指针和指向二维数组的指针之间的区别

    如果我有一个二维数组 B 定义为 int B 2 3 1 3 5 2 4 6 Is int p B与 一样int p 3 B int f B printf d f 1 gives 5作为输出 同时printf d f 给出 1 作为答案 为
  • Java写入ByteArrayOutputStream内存泄漏

    我正在将图像字节写入ByteArrayOutputStream然后通过套接字发送它 问题是 当我这样做时 ImageIO write image gif byteArray 内存增加很多 有点内存泄漏 我用这个发送 ImageIO writ
  • 用 C# 中的字典中的值替换字符串中的单词

    我有一个简单的dictionary像这样 var fruitDictionary new Dictionary
  • VS2010中VSHost.exe不断启动

    我正在 VS2010 中使用一个包含大量项目的解决方案 但它不断变得无响应 我注意到的一件事可能是一条线索 尽管我尚未开始任何调试 但 MyApplicationName vshost exe 不断出现在进程列表中 也许每当构建发生时它就会
  • MVVM 同步集合

    是否有一种标准化方法可以将 Model 对象集合与 C 和 WPF 中匹配的 ModelView 对象集合同步 我正在寻找某种类 可以使以下两个集合保持同步 假设我只有几个苹果 并且可以将它们全部保存在内存中 换句话说 我想确保如果我将 A
  • 使用私有构造函数的 C# 单元测试类?

    好吧 我刚刚收到一个作业 我必须对具有私有构造函数的类执行单元测试 现在 当所有方法也都是非静态时 我该如何在不初始化类的情况下进行单元测试 有什么方法可以对具有私有构造函数的类进行单元测试 无需反射 如果您无法将类公开 您仍然可以通过以下
  • 解析通过asp:FileUpload上传的XML文件

    我有一个场景 用户将上传 XML 文件 我想将该文件添加到数据库中的表中 不过 困难的部分是我需要解析文件 然后将一些信息添加到一些不同的表中 显示如何获取 XML 文件的每个示例都使用 URI 来获取文件 但是如何直接从数据库获取文件 或
  • UWP - 绑定枚举差异

    我遇到了一个非常有趣的问题 假设 UWP 应用中有以下 XAML 页面内容
  • 如何“全局”捕获对象实例中引发的异常

    我目前正在编写一个 winforms 应用程序 C 我正在使用企业库异常处理块 遵循我所看到的相当标准的方法 IE 在 Program cs 的 Main 方法中 我已将事件处理程序连接到 Application ThreadExcepti
  • 如何让 PCRE 与 C++ 一起使用?

    这是一个新手问题 但我希望我能尽可能清楚地表达我的问题 我正在尝试用 C 进行模式匹配 我已经从以下位置下载了 PCRE 的 Win32 版本here http gnuwin32 sourceforge net packages pcre
  • 如何在Windows Azure上调用ffmpeg.exe转换音频文件?

    我在 Windows Azure 上运行 Web 角色来接收 AAC 音频文件 通过 base64 字符串上传 并将它们存储到 blob 中 现在效果很好 接下来 我还必须将它们转换为 MP3 并将 MP3 存储到 blob 中 我决定使用
  • 剥离 OLE 标头信息 (MS Access / SQL Server)

    我有一个 C 应用程序需要支持二进制数据库内容 图像等 当使用 MS Access 或 MS SQL Server 时 此数据被包装在 OLE 对象内 如何去除此 OLE 标头信息 请注意 我不能只查找特定标签的开头 因为内容可以是 png
  • Subsonic 3 ActiveRecord 嵌套选择导致 NotIn 错误?

    我有以下 Subsonic 3 0 查询 其中包含嵌套的 NotIn 查询 public List
  • 将 R 值传递给采用 L 值的函数时出现过载歧义

    我有 2 个重载函数 一个采用 L 值 另一个采用 R 值 目的是让该函数可以像这样调用 Obj obj foo obj OR foo Obj 所以 我写了2个重载函数 template
  • PC 上 XNA 中的信箱和缩放

    有没有一种方法可以让我基本上以 1080p 或 720p 作为默认分辨率来开发 XNA 游戏 然后根据设置的分辨率将游戏中的所有内容缩放到适当的大小 而不必在每个 Sprite 中设置缩放因子Draw 方法 我的想法是 我可以基于 1080
  • Task.Delay 到底是如何工作的?

    他们说 Task Delay 是一个异步 Thread Sleep 为了测试这一点 我写了下面的代码 我希望立即打印 One 然后 3 秒后将打印结果变量 15 2 秒后 将打印 Two 但似乎并非如此 一 不会立即打印 3 秒后打印 On

随机推荐

  • 在django上无损压缩图像

    我正在做优化 Google 建议对图像进行无损压缩 正在寻找一种在 Django 中实现这一点的方法 这是他们指定的图像 我认为为了有效地完成它 需要在系统范围内实现 可能使用中间件类 想知道以前是否有人这样做过 这是谷歌页面速度分析的链接
  • 从外部函数访问 QLCDNumber 对象

    每次线程 t1 每秒调用函数 wait thread v1 时 我的 python 脚本都需要更改一个对象 lcd p1 但是如何做到这一点呢 我不知道如何在函数内访问这个对象 有人可以帮忙吗 vazao1 12 global pulses
  • 为什么我的 GradientDescentOptimizer 会产生 NaN?

    我目前正在修改 Andrew Ng 教授在 Coursera 上的 机器学习 课程作业 但我陷入了逻辑回归部分 filename data ex2data1 txt data np loadtxt filename delimiter un
  • OSX - 将 gcc 版本 4.2.1 替换为通过 Homebrew 安装的 4.9

    这已经困扰我一段时间了 我正在尝试编译一个巨大的 C 文件 我知道它可以工作 因为它在我工作的 Arch Linux 计算机上工作得很好 当我在 mac 上检查 GCC 版本时 它返回以下内容 Configured with prefix
  • 如何计算 ARM 处理器算法的 MIPS

    最近 我被要求为我们开发的算法生成 MIPS 每秒百万条指令 该算法由一组 C 风格函数公开 我们在 Dell Axim 上运行了代码 以对不同输入下的性能进行基准测试 这个问题来自我们的硬件供应商 但我主要是一名 HL 软件开发人员 所以
  • 如何将小数纪元时间戳(双精度)转换为 std::chrono::time_point?

    我有一个小数纪元时间戳 表示为double 我想转换为适当的std chrono time point 该纪元是自 1970 年 1 月 1 日以来常见的 UNIX 纪元 我知道存在std chrono system clock from
  • 如何判断约会是否是周末?

    给定一个日期作为输入 我如何确定这一天是否是周末 有一个 Weekday 函数 它接受 Date 作为参数并返回日期 1 2 3 等 返回值为 vbSunday 1 vbMonday 2 vbTuesday 3 vbWednesday 4
  • 下载 - 每个用户的最大连接数?

    我有一个 php 脚本 允许用户通过下载恢复下载大文件 这工作正常 但我将 php 代码的下载速度限制为每个连接 200kb s 因此 Mozillas Firefox 下载管理器仅建立一个连接 速度约为 200kb s 但 Free Do
  • Mongoose __v 什么时候改变

    根据http aaronheckmann tumblr com post 48943525537 mongoose v3 part 1 versioning http aaronheckmann tumblr com post 489435
  • 如何提交 git 标签?

    我已成功对中央 git 存储库进行 提交和推送更改 我现在意识到我想标记所有文件的当前版本 所以我这样做 git tag a 0 5 这样就成功了 但现在我尝试git push我被告知没有什么可承诺的 如何将新标签推送到中央存储库 注意gi
  • Javascript 错误的可能情况:“预期标识符、字符串或数字”

    一些用户报告我的网站上偶尔出现 JS 错误 错误消息显示 预期标识符 字符串或数字 行号为 423725915 这只是一个任意数字 并且在发生这种情况时每个报告都会发生变化 这主要发生在 IE7 Mozilla 4 0 浏览器中 我扫描了我
  • C 常用算术转换

    我正在阅读 C99 标准中有关常见算术转换的内容 如果两个操作数具有相同的类型 则无需进一步转换 需要 否则 如果两个操作数都有符号整数类型或者都有 无符号整数类型 较小整数类型的操作数 转换等级转换为大于操作数的类型 秩 否则 如果具有无
  • 为什么每当我使用 scandir() 时,我都会在数组的开头收到句点?

    为什么每当我使用 scandir 时 我都会在数组的开头收到句点 Array 0 gt 1 gt 2 gt bar php 3 gt foo txt 4 gt somedir Array 0 gt somedir 1 gt foo txt
  • 箭头函数参数周围应有括号。 (箭头括号)

    如何避免流量类型错误ES7箭头函数 handleSelectCategory e gt const form this state let newCategories if form categories findIndex c gt c
  • 什么是“具有指定instance_id的DacInstance不存在。(Microsoft SQL Server,36004)”?

    我正在尝试使用 dacpac 升级远程 SQL Server 2012 数据库 但收到以下消息 指定instance id 的DacInstance 不存在 微软 SQL Server 36004 我试图在互联网上搜索但找不到任何东西 有任
  • void* 与 char* 具有相同的表示和内存对齐方式是什么意思?

    我读过一些关于void 类型指针并从标准中找到了此要求 6 2 5 27 指向 void 的指针应具有与指向字符类型的指针相同的表示和对齐要求 39 类似地 指向兼容类型的限定或非限定版本的指针应具有相同的表示和对齐要求 我看到标准并不保证
  • 如何更改通用Windows平台应用程序中单击事件上按钮的背景颜色?

    我正在 Windows 10 中开发 UWP 应用程序 并且尝试更改单击事件中按钮的背景颜色 这是我的代码 private void button1 1 Click object sender RoutedEventArgs e if Si
  • Delphi TTask - PPL 中匿名函数中的变量捕获如何工作?

    我开始深入研究 Delphi D11 PPL 并编写了这个小例子 procedure TForm2 LaunchTasks const cmax 5 Var ltask ITask i j Integer begin for i 1 to
  • 位置:固定在 IE 6/7/8 和 mozilla 上工作

    我想将 div 的位置固定在页面的右下角 聊天框 我如何通过一个适用于所有 IE6 7 8 和 mozilla 的 css 文件来做到这一点 for我现在有 聊天框 位置 固定 底部 0 右 1 这在 IE 上不起作用 我的限制是我只能编辑
  • C# 套接字编程 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 嘿 我对 C 异步套接字编程做了噩梦 您能给我指点一本深入解释异步编程的指南 教程或书籍吗 如果可能包