相当于 C# 异步套接字中的 Peek?

2024-02-28

我习惯使用同步套接字。为了处理尚未完全到达的消息,我将前 4 个字节设置为消息的预期长度。然后我会用Socket.Receive(tcpRecv, 1024, SocketFlags.Peek);查看消息而不将其从缓冲区中拉出。如果所有这些都在那里,我就会提取数据。如果不是,我会把它留在那里。我设计的协议确保消息不会超过 1024 字节。

在异步套接字中,我看不到查看数据的方法。有没有办法做到这一点?有没有比查看数据更好的方法?

Thanks.

-Nick


您无需查看:.NET 异步套接字允许您无需查看即可实现相同类型的功能。我想你可能正在寻找这样的东西:

private void BeginReceive()
{
    if ( _clientState == EClientState.Receiving)
    {
        if (_asyncTask.BytesReceived != 0 && _asyncTask.TotalBytesReceived <= _maxPageSize)
        {
            SocketAsyncEventArgs e = new SocketAsyncEventArgs();
            e.SetBuffer(_asyncTask.ReceiveBuffer, 0, _asyncTask.ReceiveBuffer.Length);
            e.Completed += new EventHandler<SocketAsyncEventArgs>(ReceiveCallback);
            e.UserToken = _asyncTask.Host;

            bool comletedAsync = false;
            try
            {
                comletedAsync = _socket.ReceiveAsync(e);
            }
            catch (SocketException se)
            {
                Console.WriteLine("Error receiving data from: " + _asyncTask.Host);
                Console.WriteLine("SocketException: {0} Error Code: {1}", se.Message, se.NativeErrorCode);

                ChangeState(EClientState.Failed);
            }

            if (!comletedAsync)
            {
                // The call completed synchronously so invoke the callback ourselves
                ReceiveCallback(this, e);
            }
        }
        else
        {
            //Console.WriteLine("Num bytes received: " + _asyncTask.TotalBytesReceived);
            ChangeState(EClientState.ReceiveDone);
        }
    }
}

当您收到回电时,您可以安排另一次接收:

private void ReceiveCallback(object sender, SocketAsyncEventArgs args)
{
    lock (_sync) // re-entrant lock
    {
        // Fast fail: should not be receiving data if the client
        // is not in a receiving state.
        if (_clientState == EClientState.Receiving)
        {
            String host = (String)args.UserToken;

            if (_asyncTask.Host == host && args.SocketError == SocketError.Success)
            {
                try
                {
                    Encoding encoding = Encoding.ASCII;
                    _asyncTask.BytesReceived = args.BytesTransferred;
                    _asyncTask.TotalBytesReceived += _asyncTask.BytesReceived;
                    _asyncTask.DocSource += encoding.GetString(_asyncTask.ReceiveBuffer, 0, _asyncTask.BytesReceived);

                    BeginReceive();
                }
                catch (SocketException e)
                {
                    Console.WriteLine("Error receiving data from: " + host);
                    Console.WriteLine("SocketException: {0} Error Code: {1}", e.Message, e.NativeErrorCode);

                    ChangeState(EClientState.Failed);
                }
            }
            else if (_asyncTask.Host != host)
            {
                Console.WriteLine("Warning: received a callback for {0}, but the client is currently working on {1}.",
                    host, _asyncTask.Host);
            }
            else
            {
                Console.WriteLine("Socket Error: {0} when receiving from {1}",
                   args.SocketError,
                   _asyncTask.Host);
                ChangeState(EClientState.Failed);
            }
        }
    }
}

你可以在我的博客上看到整个异步客户端:http://codesprout.blogspot.com/2011/04/asynchronous-http-client.html http://codesprout.blogspot.com/2011/04/asynchronous-http-client.html

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

相当于 C# 异步套接字中的 Peek? 的相关文章

  • 在 Vulkan 中,图形队列系列与当前队列系列分离是否有益?

    据我所知 队列系列可能支持呈现到屏幕但不支持图形 假设我有一个同时支持图形和呈现的队列系列 以及另一个仅支持呈现的队列系列 我应该为两个进程使用第一个队列系列 还是应该将第一个队列系列委托给图形 将后者委托给呈现 或者这两种方法之间没有明显
  • C# SmtpClient编程中如何设置带有中文的附件文件名?

    我的代码如下 ContentType ct new ContentType ct MediaType MediaTypeNames Application Octet ct Name 这是一个很长的中文文件名希望能用它在附件名中 Doc A
  • 静态构造函数和 BeforeFieldInit?

    如果类型没有静态构造函数 则将执行字段初始值设定项 就在使用该类型之前 或者在某个时间点突发奇想 运行时 为什么这段代码 void Main start Dump Test EchoAndReturn Hello end Dump clas
  • 在 Mono 中反序列化 JSON 数据

    使用 Monodroid 时 是否有一种简单的方法可以将简单的 JSON 字符串反序列化为 NET 对象 System Json 只提供序列化 不提供反序列化 我尝试过的各种第三方库都会导致 Mono Monodroid 出现问题 谢谢 f
  • Android NDK 代码中的 SIGILL

    我在市场上有一个 NDK 应用程序 并获得了有关以下内容的本机崩溃报告 SIGILL信号 我使用 Google Breakpad 生成本机崩溃报告 以下是详细信息 我的应用程序是为armeabi v7a with霓虹灯支持 它在 NVIDI
  • C# 根据当前日期传递日期时间值

    我正在尝试根据 sql server 中的两个日期获取记录 Select from table where CreatedDate between StartDate and EndDate我通过了5 12 2010 and 5 12 20
  • Libev,如何将参数传递给相关回调

    我陷入了 libev 中争论的境地 通常 libev 在类似的函数中接收包 接收回调 没关系 但是实际操作中 我们需要派遣一个亲戚 写回调 根据收到的包裹处理具体工作 例如 S RECV MSG pstRecvMsg S RECV MSG
  • 在 azure blob 存储中就地创建 zip 文件

    我将文件存储在 Blob 存储帐户内的一个容器中 我需要在第二个容器中创建一个 zip 文件 其中包含第一个容器中的文件 我有一个使用辅助角色和 DotNetZip 工作的解决方案 但由于 zip 文件的大小最终可能达到 1GB 我担心在进
  • 让网络摄像头在 OpenCV 中工作

    我正在尝试让我的网络摄像头在 Windows 7 64 位中的 OpenCV 版本 2 2 中捕获视频 但是 我遇到了一些困难 OpenCV 附带的示例二进制文件都无法检测到我的网络摄像头 最近我发现这篇文章表明答案在于重新编译一个文件 o
  • 我们可以通过指针来改变const定义的对象的值吗?

    include
  • 如何在多线程应用程序中安全地填充数据并 Refresh() DataGridView?

    我的应用程序有一个 DataGridView 对象和一个 MousePos 类型的列表 MousePos 是一个自定义类 它保存鼠标 X Y 坐标 类型为 Point 和该位置的运行计数 我有一个线程 System Timers Timer
  • ASP.NET Core 中间件与过滤器

    在阅读了 ASP NET Core 中间件之后 我对何时应该使用过滤器以及何时应该使用中间件感到困惑 因为它们似乎实现了相同的目标 什么时候应该使用中间件而不是过滤器 9频道有一个关于此的视频 ASP NET 怪物 91 中间件与过滤器 h
  • 使用 gcc 时在头文件中查找定义的好方法是什么?

    在使用 gcc 时 有人有推荐的方法在头文件中查找定义吗 使用 MSVC 时 我只需右键单击并选择 转到定义 这非常好 我使用过 netbeans gcc 它确实有代码帮助 包括到定义的超链接 所以这是一种选择 但是 我想知道是否有任何其他
  • Xamarin Forms Binding - 访问父属性

    我无法访问页面的 ViewModel 属性以便将其绑定到 IsVisible 属性 如果我不设置 BindingContext 我只能绑定它 有没有办法可以在设置 BindingContext 的同时访问页面的 viewmodel root
  • 如何编写一个接受 int 或 float 的 C 函数?

    我想用 C 语言创建一个扩展 Python 的函数 该函数可以接受 float 或 int 类型的输入 所以基本上 我想要f 5 and f 5 5 成为可接受的输入 我认为我不能使用if PyArg ParseTuple args i v
  • 如何从 Windows Phone 7 模拟器获取数据

    我有一个 WP7 的单元测试框架 它在手机上运行 结果相当难以阅读 因此我将它们写入 XDocument 我的问题是 如何才能将这个 XML 文件从手机上移到我的桌面上 以便我可以实际分析结果 到目前为止 我所做的是将 Debugger B
  • 如何组合两个 lambda [重复]

    这个问题在这里已经有答案了 可能的重复 在 C 中组合两个 lambda 表达式 https stackoverflow com questions 1717444 combining two lamba expressions in c
  • .Net Reactive Extensions Framework (Rx) 是否考虑拓扑顺序?

    Net 反应式扩展框架是否按拓扑顺序传播通知以最大限度地减少更新量 就像 Scala Rx 所做的那样 Net 反应式扩展 Rx 是否可以 https github com lihaoyi scala rx wiki How it Work
  • 如果找不到指定的图像文件,显示默认图像的最佳方式?

    我有一个普通的电子商务应用程序 我将 ITEM IMAGE NAME 存储在数据库中 有时经理会拼错图像名称 为了避免 丢失图像 IE 中的红色 X 每次显示产品列表时 我都会检查服务器中是否有与该产品相关的图像 如果该文件不存在 我会将其
  • 如何在 C# 中获取 CMD/控制台编码

    我需要指定正确的代码页来使用 zip 库打包文件 正如我所见 我需要指定控制台编码 在我的例子中为 866 C Users User gt mode Status for device CON Lines 300 Columns 130 K

随机推荐

  • 使用 IAM 帐户时 AppSync 查询返回未经授权

    我正在使用 AWS Amplify 我的 GraphQL 架构中有两个如下所示的模型 type Class model auth rules allow owner identityClaim sub allow owner identit
  • Apache Sling 中的 resourceResolver.adaptTo(Session.class) 的用途是什么?

    我是 Apache Sling CQ5 等的新手 在我们的代码库中 我们有一个与此类似的代码片段 void perform SlingHttpServletRequest request SlingHttpServletResponse r
  • Primefaces textEditor:使用 JavaScript 将文本转换为 HTML 不起作用

    首先我要声明这是我的第一个问题 我是这个社区的新人 请善待我 不要犹豫地纠正我 引导我到哪里可以找到答案或学习等 我发布这个问题是为了找到解决方案的最后希望 因为我自己 也没有在同事的帮助下 没有找到或提出任何解决方案 基本上PrimeFa
  • 引入条件时无法使用 fillna

    我对 python 很陌生 尝试对我的数据进行一些插补 然而 我无法做到 这是简单的代码 df a df loc df c gt 0 df c lt 43 a 1 df loc df c gt 44 df c lt 96 a 2 df lo
  • 如何在 macOS 上安装 dbus-python?

    在第一步 配置时 出现以下错误 checking for DBUS no configure error Package requirements dbus 1 gt 1 6 were not met No package dbus 1 f
  • 将访问过的链接颜色设置为未访问过的链接的颜色(P.S.不是常见问题)

    我需要将 a visited CSS 设置为whatever正常 a 设置的颜色 我希望能够告诉浏览器的是 对于已访问的链接 使用与未访问的链接相同的颜色 无论它是什么颜色 我需要这样做不指定特定颜色 例如 如果出现一些奇怪的浏览器 使用
  • 如何在hadoop中运行jar文件?

    我使用 java 文件创建了一个 jar 文件这个博客 http java dzone com articles hadoop basics creating使用以下语句 javac classpath usr local hadoop h
  • 具有动态变化内容的 QScrollArea

    I have a QScrollArea with some buttons in it like shown on the picture 布局的思路是 1 左右按钮太宽时应使用滚动按钮 2 滚动区域按钮数量可动态改变 3 应利用任何可用
  • 捕获 ASP.NET WebService 上的 WebMethod 引发的自定义异常

    我有一个经典的 asp net Web 服务 asmx 和其中的一个 Web 方法 我需要在 Web 方法中针对某些情况抛出自定义异常 并且需要在调用 Web 服务方法时捕获特定的自定义异常 WebService Namespace htt
  • 从 Google API 获取点击次数

    我试图找到一种方法来做到这一点 但没有成功 我正在寻找一种方法来找出搜索获得的点击次数 并且我不想手动执行此操作 或者通过 html 代码使用正则表达式搜索 当然 Google API 必须有一个简单的方法来做到这一点 有人知道其中一个吗
  • 无法启动 OpenDebug,因为需要 Mono(或 Mono 版本 >= 3.10.0)

    我已在 ubuntu 14 0 lts 中下载并安装 vscode 并包含现有的 node js 项目 首先我认为我与 vscode 相关的是调试我的应用程序 因为我必须去调试 ctrl shift D 惩罚 使用 name 和 progr
  • 如何在 asp.net 中获取服务器/网站 IP 地址?

    当用户请求进来时 我可以使用 Context Request UserHostAddress 来获取用户的 IP 地址 如何在运行时获取网站 服务器的IP地址 我有一些报告代码可供同一服务器上的多个网站使用 并且每个网站使用不同的 IP 地
  • 将 XML JUnit 报告转换为 HTML [重复]

    这个问题在这里已经有答案了 到目前为止 我一直在为 Protractor 测试生成 junit xml 报告 但随着测试的增加 我需要获取测试的 HTML 报告 我们可以使用 XSLT 将 junit xml 报告更改为 HTML 吗 如果
  • Django 设置存储引擎和默认字符集

    从我的创建我的表models py 我不知道该怎么做两件事 我想指定MySQL创建我的一些表InnoDB 一些作为MyISAM 我该怎么做 我还想指定我的桌子DEFAULT CHARSET as utf8 我该怎么做 这是我跑步时看到的sy
  • 使用 Selenium Webdriver 处理 Windows 身份验证

    C 中基于 Selenium Webdriver 的测试必须使用 Windows 身份验证登录 我尝试了几种方法 Driver SwitchTo Alert Driver FindElement By Id UserName SendKey
  • 使用python连接ftp服务器

    我尝试使用 python 代码连接到手机中的 ftp 服务器 但出现错误 Code import ftplib server ftplib FTP server connect 192 168 135 101 5556 server log
  • Flask.url_for() 错误:尝试在未推送应用程序上下文的情况下生成 URL

    我有一个简单的应用程序 我试图按照以下方式重定向图标 http flask pocoo org docs 0 10 patterns favicon http flask pocoo org docs 0 10 patterns favic
  • 如何防止 VS WPF 设计器为工具箱中的每个对象添加边距

    当我将控件从工具箱拖到 Visual Studio 2008 WPF 设计图面上时 它会根据我放置控件的位置和默认大小设置边距 有什么办法可以阻止 VS 设置这些吗 当我将控件放在堆栈面板上时 我希望它流入面板中的现有控件 Thanks 我
  • 只有视频,没有音频

    这很奇怪 但这是我的项目要求 在我的项目中 我想播放带有音频抑制的视频 对于音频我们有另一个计划 所以我可以使用VideoView来播放视频 但这也播放该文件的音频 这对我来说不是必需的 那么我怎样才能实现这个奇怪的要求 即播放没有音频的视
  • 相当于 C# 异步套接字中的 Peek?

    我习惯使用同步套接字 为了处理尚未完全到达的消息 我将前 4 个字节设置为消息的预期长度 然后我会用Socket Receive tcpRecv 1024 SocketFlags Peek 查看消息而不将其从缓冲区中拉出 如果所有这些都在那