问题标签 [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 投票
2 回答
2467 浏览

.net - .NET 异步套接字:在这种情况下,SocketAsyncEventArgs 比 Begin/End 有什么好处?

Socket从 .NET 3.5 开始就有这些新的异步方法,用于与 SocketAsyncEventArgs 一起使用(例如Socket.SendAsync()),好处在于它们使用 IO 完成端口并避免需要继续分配。

我们制作了一个名为UdpStream的类,它有一个简单的接口——只有StartSend和一个Completed事件。它分配了两个 SocketAsyncEventArgs,一个用于发送,一个用于接收。StartSend 只是使用 SendAsync 发送消息,每秒调用大约 10 次。我们在接收 SocketAsyncEventArgs 上使用 Completed 事件,并且在每个事件处理后我们都 ReceiveAsync 以便它形成一个接收循环。同样,我们每秒接收大约 10 次。

我们的系统需要支持多达500个这样的UdpStream对象。换句话说,我们的服务器将与 500 个不同的 IP 端点同时通信。

我注意到在 MSDN SocketAsyncEventArgs 示例中,它们分配了 N x SocketAsyncEventArgs,一个用于您想要一次处理的每个未完成的接收操作。我不清楚这与我们的场景有什么关系——在我看来,也许我们没有从 SocketAsyncEventArgs 中受益,因为我们只是为每个端点分配一个。如果我们最终收到 500 个接收 SocketAsyncEventArgs,我想我们不会得到任何好处。也许我们仍然可以从 IO 完成端口中获得一些好处?

  • 当缩放到 500 时,此设计是否正确使用了 SocketAsyncEventArgs?

  • 对于我们使用单个“UdpStream”的情况,使用 SocketAsyncEventArgs 与使用旧的 Begin/End API 相比有什么好处吗?

0 投票
1 回答
1065 浏览

c# - SocketAsyncEventArgs.UserToken 未更新?

我目前有一个涉及 Silverlight 客户端和 .NET 服务器的客户端-服务器应用程序。.NET 部分使用 System.Net.Sockets 命名空间中提供的 Tcp 类,而 Silverlight 客户端使用原始套接字。我从当前使用 HttpListener 类的代码移植到这个,因为它不适合我的需要。不过,Http 类在 SL 方面具有使用 Begin* 和 End* 样式的异步方法的能力,这些方法允许我在操作完成后指定处理程序。我无法让它与新系统一起使用。我目前的策略是将处理程序包含在 UserToken 中。但是,这个令牌似乎没有得到更新。

这是一些经过编辑的代码。我能够让双方相互交谈,但似乎没有发送正确的 UserToken。

正如上面的评论所暗示的,在 ProcessReceive 中,userToken.Test 始终为“foo”,而 userToken.Handler 始终为 null。

到目前为止,我还无法进入 ProcessSend,所以我看不到它实际发送了什么 SocketAsyncEventArgs。任何人都知道为什么这个事件没有触发(发送后完成)?我搞砸了我的 SendToServer 功能吗?

我意识到同步等可能存在其他问题,但我认为这不是问题所在。我尝试过的一件事是设置 ManualResetEvent 以确保在连接完成(ProcessConnect)之前没有人向服务器发送数据,但这也没有解决问题。

任何帮助将不胜感激!

编辑:所以发生这种情况的原因是因为当我在 ProcessConnect 函数中调用 ReceiveAsync 时,它在服务器发送回我的数据的响应时被使用。因此,处理程序中存在 UserToken “foo”。下次服务器发送数据时,ReceiveAsync 使用带有 UserToken “bar”的参数。所以它有点不同步,对于双工通信位。我无法确保从客户端发送的 SocketAsyncEventArgs 与响应中使用的相同。似乎唯一的解决方案是让 SL 客户端打开两个套接字——一个用于服务器启动的数据,另一个用于客户端启动的请求。但是,这意味着我没有利用双工性质。

0 投票
1 回答
9764 浏览

c# - C# SocketAsyncEventArgs 处理接收和发送数据

我试图理解 C# 中的 'SocketAsyncEventArgs' 类。http://msdn.microsoft.com/en-us/library/system.net.sockets.socketasynceventargs.aspx

我正在关注本教程: http: //www.codeproject.com/Articles/83102/C-SocketAsyncEventArgs-High-Performance-Socket-Cod

现在我陷入了我应该如何使用我的服务器处理数据的问题。我要做的是为连接的客户端使用 SocketAsyncEventArgs,在 BufferManager 中分配了 512 字节的缓冲区空间。然后我想要做的是将 byte[] 数据解码为我自己的自定义类(ClientPacket),该类保存 byte[] 用于解码和读取。

这一切都很好,但我的服务器并不总是用数据响应问题是:

我是否使用 1 个 SocketAsyncEventArgs 进行接收并循环处理接收数据,然后在需要发送时从池中分配一个 SocketAsyncEventArgs,然后在完成时返回它?

以及 SocketAsyncEventArgs 是如何知道读取完成的?(当它在用新数据覆盖之前完成 byte[] 缓冲区时)比如如果我不回复,它在完成后如何返回到池中?

0 投票
3 回答
21338 浏览

c# - How to use Socket.SendAsync to send large data

This code is modified from MSDN

Why in circulation, execute s.SendAsync(e) the second time, it will be error

Exception:An asynchronous socket operation is already in progress using this SocketAsyncEventArgs instance

How can I send large data ?

0 投票
1 回答
1900 浏览

c# - 使用 SocketAsyncEventArgs 的异步套接字通信超时

我正在使用 SocketAsyncEventArgs 与数百台设备(其中大部分通过 GPRS)进行通信。有时,它们中的一些停止响应并且似乎我无法使操作超时,因为文档指出超时选项(即SocketOptionName.SendTimeout)不适用于异步通信。

我正在寻找一种在进行发送/接收/连接异步时检查超时的方法。它不应该阻塞线程(因此,调用 someMonitor.WaitOne(SomeTimeoutValue) 不会这样做)并且我不想为每个操作创建一个计时器实例(因为设备的数量肯定会增加)。

对此有什么建议吗?

0 投票
1 回答
2309 浏览

c# - SocketAsyncEventArgs?- 简单的例子

随着我的 XNA TopDown Shooter 游戏的继续进行,是时候实现多人游戏功能了。因为客户端和服务器每秒必须处理大量数据(每秒 60 个数据包,包括位置、旋转和其他玩家数据),所以我必须建立一个稳定且快速的网络系统。

我的问题:在一台服务器和多个客户端之间创建一个非常快速、高性能的网络连接的最佳选择是什么?如果答案是 SocketAsyncEventArgs,您是否知道 Internet 上某个地方的一个简单、干净的示例,说明如何使用此高级类发送和接收数据?我似乎找不到一个我理解的好例子。

谢谢你的时间!

巴斯

0 投票
0 回答
638 浏览

windows-phone-7 - Windows Phone 7 客户端服务器实现

我正在尝试为 windows phone 7 创建一个应用程序,它充当客户端并将请求发送到用 Java 编写的服务器。客户端应该发送请求,并等待来自服务器的答复。我的问题是我似乎无法与服务器正常通信。当我尝试在一个简单的 .NET C# 程序中对其进行测试并使用诸如 socket.send() 和 socket.receive() 之类的阻塞调用时,它可以工作,但 Windows Phone 应用程序没有阻塞调用。这就是服务器 (Java) 在检测到连接后所做的事情:

这就是客户端(C#)的实现方式:

我的线路有问题:socket.SendToAsync(sendListener); 在 C# 端结束程序而不做任何事情(返回代码 0 退出)。Java服务器在检测到连接时立即启动它的工作,所以它也可能导致问题?我可以做些什么来使沟通工作?

0 投票
4 回答
1357 浏览

c# - 如何通过异步连接获取完整消息,而不仅仅是其中的一部分

我已经实现了这个 C# 客户端,它与我在 Java 中创建的另一台服务器的异步连接进行通信。这是客户端:

如何从服务器获取长消息?为了让客户端尝试读取更多数据以查看我是否真的阅读了整个消息,我需要更改什么?因为这条线可能有问题:string dataFromServer = Encoding.UTF8.GetString(e.Buffer, 0, e.BytesTransferred);它只接收消息的一部分而不是整个消息。

0 投票
1 回答
1202 浏览

c# - 使用 SocketAsyncEventArgs 按顺序发送数据

我最初在发送数据时遇到了竞争条件,问题是我允许使用多个 SocketAsyncEventArgs 来发送数据,但是第一个数据包在第二个数据包之前没有完全发送,这是因为我有它所以如果数据缓冲区不适合它循环,直到所有数据都发送完毕,并且第一个数据包比第二个数据包大,第二个数据包很小,所以第二个数据包在第一个数据包之前被发送并到达客户端。

我通过将 1 个 SocketAyncEventArgs 分配给一个用于发送数据的打开连接并使用信号量来限制对它的访问来解决这个问题,并在完成后使 SocketAsyncEventArgs 回调。

现在这工作正常,因为所有数据都已发送,当它完成下一次发送准备好时回调。问题是,当我想将数据随机发送到打开的连接时,它会导致阻塞,而当有大量数据发送时,它会阻塞我的线程。

我正在寻找解决此问题的方法,我想有一个队列,当请求发送数据时,它只是将数据包添加到队列中,然后 1 SocketAsyncEventArgs 只是循环以发送该数据。

但是我怎样才能在保持可扩展性的同时有效地做到这一点呢?在按照请求发送的顺序发送数据包时,我想尽可能避免阻塞。

感谢任何帮助!

0 投票
1 回答
2303 浏览

c# - 如何将 BufferList 与 SocketAsyncEventArgs 一起使用而不会得到 SocketError InvalidArgument?

我可以使用 SetBuffer 和 SocketAsyncEventArgs 就好了。

如果我尝试使用 BufferList(在执行 SetBuffer(null, 0, 0) 之后),当我在套接字上执行 SendAsync 时,我总是立即得到 SocketError InvalidArgument (10022)。

没有关于如何使用 BufferList 以及我正在做的事情的示例或文档(无论如何对我来说)。

有人可以指出一个示例程序或代码片段吗?

我正在为此撕扯头发,剩下的不多了...

这基本上是我正在做的事情(e 是 SocketAsyncEventArgs 和 lSocket 是我用于 SetBuffer 的同一个套接字)