问题标签 [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 回答
776 浏览

c# - SocketAsyncEventArgs 发送/接收顺序

我最近一直在将 SocketAsyncEventArgs 用于一个项目,并且遇到了一些问题,即 ReceiveAsync 偶尔会以与通过 SendAsync 发送的顺序不同的顺序获取数据。在 SendAsync 方法中发送的每个数据块都会被维护,但这些块的顺序不一定正确。也许我对 SendAsync 方法的理解不正确,但我认为特别是使用 SocketType.Stream 和 ProtocolType.Tcp 可以确保保持顺序。我知道底层进程将不可避免地破坏消息,并且 ReceiveAsync 通常会读取少于缓冲区分配的内容。但我假设发送和接收流会保持秩序。

我开发了一个显示问题的测试控制台程序。它每次尝试使用一组不同的套接字和端口运行大约 20 次。在我的笔记本电脑上,它通常会通过一次然后第二次失败;通常在期待第二个块时会收到一个稍后的块。从其他测试中,我知道预期的块最终确实会出现,只是不按顺序出现。

需要注意的是,我能够在 Windows 2008 远程服务器上对其进行测试并且没有任何问题。但是,它从未接近在我的笔记本电脑上完成。事实上,如果我让调试执行在异常中断中挂起一段时间,我已经让它不止一次地完全冻结了我的笔记本电脑,并且不得不进行硬重启。这是我在 Windows 7 上使用 VS2017 运行的工作笔记本电脑。我不确定这是否是一个因素,但它正在运行 Symantec Endpoint Protection,尽管我在日志中没有发现任何内容。

所以我的问题是,我对 SocketAsyncEventArgs 的运作方式有错误的看法吗?还是我的代码是一场灾难(也许两者兼而有之)?它是我的笔记本电脑独有的吗?(最后一个让我觉得我正在为编程新手做准备,并且您认为编译器一定有问题。)

0 投票
1 回答
245 浏览

c# - Unity 5.6.3p2 是否支持 SocketAsyncEventArgs

我创建了一个在我的应用程序中使用的网络 api。在编译统一项目并在独立 Windows 播放器中运行时,我收到以下异常,这些异常会阻止我的应用程序发送/接收 udp 数据包。

我认为这与独立播放器有关,但我无法弄清楚它到底是什么。我知道这一点是因为我可以在 Unity Editor 中成功运行该应用程序而不会出错。

如果最终证明 Unity 不支持 SAEA 类,那么首选的替代方案是什么?

0 投票
1 回答
407 浏览

c# - 为什么 SocketAsyncEventArgs.RemoteEndpoint 返回 null?C#

我正在尝试创建一个从许多客户端接收数据的 udp 服务器。当我从 SocketAsyncEventArgs.RemoteEndpoint 属性在服务器中接收数据后尝试获取客户端的远程端点时......它会返回 null。但是所有消息都正确传输。我正在本地电脑上对此进行测试。

这是我的服务器端代码:

这是一个错误还是有其他方法可以做同样的事情?谢谢!

0 投票
1 回答
84 浏览

.net - .Net,TCP vs UDP,异步多个消息/客户端

我正在使用.Net 我正在寻找创建服务并在 TCP 或 UDP 之间寻找。服务应该支持多个客户端,因此我将其与 .Net SocketAsyncEventArgs 异步,因为我已经看到它具有更好的性能和更少的内存消耗。我知道 TCP 比 UPD 慢,但我想知道您对在这两种情况下更快的方法的看法

1)使用TCP和SocketAsyncEventArgs,每个客户端都会连接,一旦服务接受连接,基本上每个客户端都有一个端点开始发送和接收,因此可以在连接打开(接受)时发送多条消息。基本上每个客户端都有自己的连接,并且可以有两种方式的通信

2) 每个客户端都会向同一个 UDP 服务器端点发送一个 UDP 数据报,所以基本上我有一个端点供所有客户端发送所有消息,然后处理它们并将数据报分别发送回每个客户端。

也许我对 TCP/UPD 有一个错误的概念,但基本上问题是,一旦我每个客户端都有一个开放的 TCP 连接,当所有客户端共享相同的初始 UDP 端点时,来回发送 UDP 消息是否会更慢。

0 投票
0 回答
49 浏览

sockets - 在单个调用中读取客户端/服务器 TCP 应用程序中的字节 []

List<Person> data客户端应用程序从a 创建 a ObservableCollection<Person>,然后将 a 转换data为 a并将 abyte[] array发送Lengtharray服务器,然后再发送实际数据array,如下所示:

服务器首先读取e.Buffer最初设置为 4 的长度,然后重置e.Buffer并接收客户端在单个Receive调用中发送的任何内容,如下所示:

客户端发送多少字节无关紧要,服务器总是在一次Receive调用中接收全部内容并read显示它已收到所有内容!在这种特殊情况下,我发送了一个包含 5Person个名称和年龄的列表

我从 Lorem ipsum 生成器中复制了 9999 个单词并将其粘贴为Name5 个Person和 10 个Age。所以客户端发送的长度是 341706 字节,服务器在单个调用中接收到所有这些,并将其转换为 json 字符串!无论 TCP 通信中的字节数如何,我总是会在一次调用中获得所有客户端发送的数据吗?

0 投票
1 回答
57 浏览

sockets - TCP wrappers 的 GetStream().Read/Write 和 Socket 的 Receive/Send 之间有什么区别吗

如果客户端Socket是这样定义的:

并且服务器让它以这种方式连接:

byte[]用于服务器和客户端之间传输的 inSend/SendAsync和for是否Receive/ReceiveAsync完全等同于NetworkStream我们通过调用tcpClient.GetStream()读/写得到的TcpListenerTcpClient

我不确定但我认为它们是因为SocketType客户端和服务器都设置为并且这些协议之间Stream不应该有任何数据丢失!send/receiveStreaming

0 投票
1 回答
70 浏览

.net - .Net SocketAsyncEventArgs 可重用性

我只是想确保我了解SocketAsyncEventArgs的可重用性功能。据我了解, SocketAsyncEventArgs 可以重复用于一个连接和不同的操作。所以我可以将相同的 SocketAsyncEventArgs 用于连接/发送/接收(客户端)或接受/发送/接收(服务器)?还是我仍然需要为不同的操作使用新的 SocketAsyncEventArgs?

而且我也知道 SocketAsyncEventArgs 主要是为服务器端的高性能而设计的。因此,正确的用途是在服务器上拥有一个 SocketAsyncEventArgs 池,为每个连接保存一个 SocketAsyncEventArgs。并将 SocketAsyncEventArgs 重用于连接上的不同操作。在客户端,您可以只使用一个 SocketAsyncEventArgs。

我理解对吗?不幸的是,我在文档中没有找到明确的说明。

0 投票
1 回答
60 浏览

c# - C# SocketAsyncEventHandler 在 Complete 上评估操作

您如何使用SocketAsyncEventArgs评估 Socket 操作是否成功?您是否评估作为参数传递的 SocketAsyncEventArgs?

或者您是否评估Completed事件中的 SocketAsyncEventArgs?

或两者?如果一个显示成功而另一个没有,这意味着什么?

0 投票
1 回答
233 浏览

c# - 如何取消自定义等待

我已阅读Stephen Toub 的博客,关于为 SocketAsyncEventArgs 制作自定义等待。这一切正常。但我需要的是一个可取消的等待对象,并且该博客不涉及这个主题。不幸的是,Stephen Cleary 也没有在他的书中介绍如何取消不支持取消的异步方法。我试图自己实现它,但我在 TaskCompletionSource 和 Task.WhenAny 上失败了,因为使用 awaitable 我实际上并没有在等待任务。这就是我想要的:能够使用带有 TAP 格式的 Socket 的 ConnectAsync 并能够取消它,同时仍然具有 SocketAsyncEventArgs 的可重用性。

到目前为止,这就是我从 Stephen Toub 的博客中获得的内容(以及 SocketAwaitable 实现):

我只是不知道如何将其转换为 TAP 格式并使其可取消。任何帮助表示赞赏。

编辑1: 这是我如何正常取消的示例:

0 投票
1 回答
143 浏览

c# - C#:如何通过 SocketAsyncEventArgs 发送非托管内存?

我有视频数据,并定期为许多客户生成新帧。我从库中获取帧作为 IntPtr 和表示字节数组大小的 int 。目前我正在把它变成一个“内存”并通过 NetworkStream 发送它,一旦我拥有它就实现了相当大的缓冲区的零复制。

我想尝试使用 SocketAsyncEventArgs 做同样的事情,看看它是否表现更好,并为多个客户端尝试这些 UserTokens。但是,我不知道如何告诉 SocketAsyncEventArgs 发送由 IntPtr 指向的内存块,其中 int 表示已知大小,同时保持零拷贝。似乎一些聪明的编组或“MemoryMarshal”应该可以解决问题,但我没有看到。

你有没有办法做到这一点?