问题标签 [socketasynceventargs]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
275 浏览

socketasynceventargs - 为什么 e.AcceptSocket.ReceiveAsync 总是正确的

我使用 SocketAsyncEventArgs 构建了一个小型 Socket 服务器端。但是遇到一些问题,当我接受客户端套接字时,我尝试使用 e.AcceptSocket.ReceiveAsync 接收客户端信息,但我不知道为什么它总是对我显示 True。这是服务器端:

我的客户端仅使用 Connect 方法连接服务器端并向其发送信息“Hello Server”。但为什么我在这里总是得到“真”?

谢谢。

0 投票
1 回答
520 浏览

tcp - 为什么我的 TCP 连接似乎在服务器端丢失数据包?

我现在正在写一个基于 SocketAsyncEventArgs 的小框架,这个类是基于 IOCP 创建的,比 APM 模式效率高得多。但是在这里,我在运行测试时遇到了一些问题。这是服务器代码:

这是我的客户代码:

但是当我启动几个客户端时,我发现有时服务器可以正确接收消息;但有时,服务器只能收到第一条消息,剩下的消息似乎都“丢失”了,任何人都可以建议吗?谢谢。

听人说,我应该实现自己的数据传输协议,但是谁能告诉我怎么定义?谢谢

下面是服务器端的截图: 在此处输入图像描述

0 投票
1 回答
1020 浏览

c# - 套接字队列问题

大家好,我有这个问题,我被困住了,所以任何帮助都将不胜感激

我必须构建一个套接字聊天(客户端服务器)模块,我已经完成了几乎 80% 的工作,但现在我被卡住了,场景是我有一个服务器应用程序,如果说 4 个客户端连接到服务器,客户端现在连接到它他们每个人都可以相互通信,一个客户端将发送消息,服务器将接收该消息并将其传递,这工作得很好,但是当 2 个或更多客户端同时向第三个客户端发送消息时,我可以没有收到一条消息并且客户端断开连接我知道我必须建立一个队列结构但我没有成功这里是我的代码结构

首先我调用这个方法开始监听传入的消息

当我收到一条消息时,我会检查它是完成同步还是异步

在此之后,有一个 io 完成的侦听器,每次完成一个接收操作时都会调用它,并且在该 io 完成的方法中,我确实调用了用于处理接收到的块的 processReceive 方法,所以最后我的代码结构是这样的

我已经设计了结构,以便每个客户端在服务器端都有一个接收 SOCKETASYNCEVENTAGRS 对象和一个发送 SOCKETASYNCEVENTAGRS,我确实为此维护了一个池

所以每个客户端都通过自己的 SOCKETASYNCEVENTAGRS 对象接收和发送数据

我想要一个场景,如果两个或多个客户端向第三个客户端发送消息,而不是第三个客户端不应该同时接收所有消息,而是它应该有一个队列结构,它应该一次接收一条消息,并且发送操作相同

这是我的一些代码

这是 IO 完成

这是我的 StartReceive 与队列实现但它不工作

寻找体面的帮助或一些好的方向

0 投票
1 回答
2449 浏览

c# - 如何正确进行异步 udp 网络?

与这里的许多其他人一样,我正在尝试创建一个网络库。要求基本上是这样的:

  • 异步工作并为实时应用程序做好准备(我想到了 FPS 游戏)
  • 使用 UDP 并根据需要在顶部设置一个瘦协议层
  • 原生使用 IPv6
  • 支持多个平台(阅读:我想要 Mono 支持!)

现在,在阅读了一些关于如何做到这一点(最鼓舞人心的是Gaffer on Games)之后,我设置了我的开发环境,考虑了如何做到这一点,并提出了这个基本的工作流程:

  1. 初始化一个套接字并告诉它使用“UDPv6”
  2. 将该套接字绑定到一个端口并使异常不会打扰用户。有一个“绑定”属性告诉他套接字设置正确。
  3. 了解本地计算机支持的 ​​NIC 的最大 MTU。
  4. 初始化多个 SocketAsyncEventArgs,告诉其 Completed 事件调用私有调度方法,并将其缓冲区设置为步骤 3 中最大 MTU 的大小。
  5. 使用第一个 SAEA 对象调用 Sockets ReceiveFromAsync 方法。

当数据进入时,我执行以下操作:

  1. 使用下一个空闲 SAEA 对象调用 ReceiveFromAsync 方法
  2. 从当前 SAEA 对象中获取缓冲区和 Sender 信息并使其再次可用
  3. 使用收到的消息触发一个新事件。

我对这种方法做了一些测试,效果很好。我每 10 毫秒向它发送一条消息,其中包含 200 字节的数据,持续 10000 个周期,CPU 或内存负载几乎没有增加。只有网卡负载在增加。但是我想出了一些问题| 问题:

  • 当我处置我的 PeerSocket 类(即持有套接字)时,我处置每个 SAEA 对象。但由于其中至少有一个仍在侦听新消息,因此会引发 ObjectDisposedException。有没有办法让它停止听?
  • MTU 可能会在与其他对等方的方式上有所不同,也许每个 SAEA 对象的缓冲区应该使用不同的指标来确定缓冲区大小?
  • 我还不确定如何处理碎片化的数据报。我将继续将“可靠性标头”写入要发送的数据报中,但是如果数据报被拆分,我不知道此标头信息,对吗?

该库希望有一天对其他人有用,并且它的存储库是公开的。截至this question,当前提交可以在这里找到

0 投票
1 回答
304 浏览

c# - C# SocketAsyncEventArgs Issue on Windows Server 2003

I haven't been able to find much on this topic, but recently I've been implementing a socket server using the SocketAsyncEventArgs objects. I followed the example from: Code Project Example

I modified the data handling classes to fit my needs, and didn't touch much if any of the socket handling portion.

When I test my service locally on my machine (win7), it appears to run fine, all is well. Same story when running it on windows server 2008. When running on windows server 2008, the mem usage hovers in the 50k's (viewing from task manager).

When I run the service on windows server 2003, that has all the .net updates/patches through .net 4, I get an error:

the lines of code this relates to are: line 326

line 289

This server is contantly being connected to from remote clients to send data (small telemetry payloads), in which we parse the data and send a response back, and continue this while the socket is connected.

I'm open to suggestions or things to try. Another note is when I run this service on win2k3, the mem usage sky rockets to 600+Kb vs. the 50-60Kb range on server 2008 and the error above is thrown.

0 投票
0 回答
159 浏览

c# - 关于基于 TCP/IP 的服务器 (C#) 的建议

我正在寻找有关基于 TCP/IP 的服务器的最佳方法的一些建议。我在这里和其他网站上做了很多查看,并且不禁认为我所看到的对于我需要它的目的来说是矫枉过正的。

我之前已经在每个连接的线程基础上编写了一个,我现在知道它不会很好地扩展,但我的想法是为每个连接创建一个新线程,我可以使用 ThreadPool 并将传入连接排队等待处理时间不是一个大问题(前提是它们将在不到一两分钟的时间内得到处理)。

服务器本身将主要用于从设备获取数据,并且仅偶尔需要向发送设备发送响应以更新设置(同样不是真正的时间关键,因为设备设置为尽可能长时间保持连接,如果由于某种原因,如果它断开连接,响应将能够等到下一次发送消息)。

我想知道的是这种扩展是否比每个连接场景中的线程更好(我假设它会由于线程重用)以及这种设置支持的设备数量大致是多少。

此外,如果认为这不合适,有人可能会提供 SocketAsyncEventArgs 方法的链接或解释。我已经对该主题进行了大量阅读并查看了示例,但无法完全理解事件的顺序等以及为什么当时调用某些方法。

感谢您的任何帮助。

我已经阅读了评论,但有人可以详细说明这些吗?虽然老实说,我更喜欢自己滚动的初始方法。

0 投票
1 回答
1550 浏览

c#-4.0 - ReceiveFromAsync 泄漏 SocketAsyncEventArgs?

我有一个客户端应用程序通过 UDP 或 TCP 套接字从服务器接收视频流。

最初,当它使用 .NET 2.0 编写时,代码使用 BeginReceive/EndReceive 和 IAsyncResult。客户端在它自己的窗口中显示每个视频,并使用它自己的线程与服务器通信。但是,由于客户端应该长时间处于运行状态,并且可能同时有 64 个视频流,因此每次调用数据接收回调时分配的 IAsyncResult 对象存在“内存泄漏”。

这会导致应用程序最终耗尽内存,因为 GC 无法及时处理块的释放。我使用 VS 2010 性能分析器验证了这一点。

所以我修改了代码以使用 SocketAsyncEventArgs 和 ReceiveFromAsync(UDP 案例)。但是,我仍然在以下位置看到内存块的增长:

我已经阅读了所有关于实现代码的示例和帖子,但仍然没有解决方案。

这是我的代码的样子:

初始化

开始读取过程:

读取完成处理程序:

基本上代码工作正常,我可以完美地看到视频流,但这种泄漏真的很痛苦。

我错过了什么吗???

非常感谢!!!

0 投票
0 回答
279 浏览

c# - SocketAsyncEventArgs 与 TcpListener/TcpClient

考虑这个示例场景:

客户端 1. 一条数据作为消息 2. 向服务器发送 10000 次相同的一条数据消息 3. 一次只连接到一台服务器

服务器 1. 并发接收来自 1000 个客户端的消息(如果可能。如果没有,尽可能多) 2. 将接收到的消息丢弃在内存中(无需写入文件)

这个场景很容易用 TcpListener/TcpClient 实现。但是,我需要强调机器。

我应该使用哪一个;SocketAsyncEventArgs 还是 TcpListener/TcpClient?为什么?这种情况是否有利于 SocketAsyncEventArgs 可重用对象?

0 投票
1 回答
2762 浏览

c# - 使用 SocketAsyncEventArgs 编写可扩展的套接字服务器

好的,我阅读了许多涉及编写高可扩展服务器的问题,但我从未真正找到一个好的答案。无论如何,我想创建一个高度可扩展的客户端,它可以处理大量数据和连接。我创建的是一个使用 SocketAsyncEventArgs 和 C#5 async/await 的简单客户端,如下所示:

而对于 ConnectAsync、ReceiveAsync 和 AcceptAcync。这对客户端部分非常有用,但是在我的服务器上我不知道如何正确处理它。(我最终会为每个客户端创建一个线程来接收。)我可以使用 APM(开始/结束)或使用 EventHandler 但这会破坏使用 async/await 的目的,最终在为每个调用创建新的 SocketAsyncEventArgs 时内存效率不高。我尝试创建一个池(使用 ConcurrentBag),但我仍然不得不一遍又一遍地创建一个 TaskCompletionSource(因为你只能使用它一次。)

所以我不认为创建这个是一个好主意,尽管我真的很喜欢它。创建一个高扩展性和高性能服务器的好设计是什么?

0 投票
2 回答
1551 浏览

c# - C# SocketAsyncEventArgsPool 堆栈为空

嗨,我正在使用MSDN上描述的 SocketAsyncEventArgsPool 。

对于每个 TCP 客户端,我有一个自己的 50 个 SocketAsyncEventArgs 池(堆栈),可以从服务器写入客户端。所以,这工作正常,但是在重新启动客户端或服务器时,我有一个函数向客户端发送许多消息,并且对于每条消息,从我的池中获取一个 SocketAsyncEventArgs。当消息太多时,我的池为空并且没有可用的 SocketAsyncEventArgs 对象用于发送,并且此消息不会发送到客户端。

有没有可能在不增加我的池子的情况下避免这种情况???谢谢!!!