为什么需要在套接字上定义两次端点才能开始接收数据?

金刚

我正在做一个项目,我想从设备接收SNMP陷阱(只要您想知道)。我使用了本示例中的代码http://www.snmpsharpnet.com/?page_id=117,并且我正尝试从中设置准系统功能。但是我不明白的是在这里:

public bool InitializeReceiver()
{
        _socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
        EndPoint localEP = new IPEndPoint(IPAddress.Parse(ip), port);
        _socket.Bind(localEP);

    if (!RegisterReceiveOperation())
        return false;

    return true;
}

在这一行,我设置了设备的IpAddress和我想监听的端口?

EndPoint localEP = new IPEndPoint(IPAddress.Parse(ip), port);

然后在这里

public bool RegisterReceiveOperation()
{
    _peerIP = new IPEndPoint(IPAddress.Any, 0);
    EndPoint ep = (EndPoint)_peerIP;
    _inbuffer = new byte[64 * 1024];
    _socket.BeginReceiveFrom(_inbuffer, 0, 64 * 1024,
        SocketFlags.None, ref ep, new AsyncCallback(ReceiveCallback), _socket);
    return true;
}

什么是_peerIP?我是否将其设置为与以前相同的IPAddress和端口?还是我就这样离开?

另外请注意,该站点的原始代码可以正常工作,并且我可以正确接收陷阱,但是在我的应用程序中,我希望对连接进行更多的管理,并且我无法一直对其进行真正的测试。因此,如果有人能弄清那些不同的IPEndPoint是什么,那就太好了。

注意2:我从此处发布的修改后的代码中删除了很多try and catch块,并删除了与该问题无关的其他内容。

伦德罗

套接字通信始终涉及两个终结点:本地终结点(您监听的终结点)和远程终结点(您从中接收或连接的终结点)。使用面向无连接的协议(如UDP),无需绑定到本地端点。但是,如果您未明确绑定到特定的本地终结点,则提供程序将自动选择可用的任何终结点。嗯,当您使用本地端点连接到远程主机而不是侦听传入的连接时,面向连接的协议实际上也是如此。

在端点ReceiveFrom家庭的方法是你所期望的数据来自于端点。如果您愿意接受来自任何端点的数据,则应指定IPAddress.Any和端口号零。如果提供更特定的端点,则来自其他来源的任何数据都将被静默丢弃,并且仅接收来自指定端点的数据。请注意,该参数是通过引用传递的。返回方法后,该变量将包含从其接收数据的实际端点。

因此,总结一下:您需要定义一个端点两次,因为您同时指定了本地和远程端点。另外,BeginReceiveFrom如果您事先知道此信息并且希望它永远不会改变(不太可能),则可以很好地在方法中指定远程设备的IP地址和端口号

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用原始套接字时,为什么需要两次给出MAC地址?

来自分类Dev

为什么需要两次安装Browserify才能捆绑

来自分类Dev

为什么需要单击两次按钮才能工作

来自分类Dev

为什么需要两次安装Browserify才能捆绑

来自分类Dev

为什么我需要在按钮上单击两次以使事件发生?

来自分类Dev

为什么我需要在 UITableView 中的单元格上点击两次才能显示警报

来自分类Dev

套接字两次发送数据

来自分类Dev

为什么需要在Matlab中两次调用rng()

来自分类Dev

为什么binutils和gcc需要在LFS中安装两次?

来自分类Dev

为什么“保存”按钮需要单击两次才能点击相关功能?

来自分类Dev

为什么需要两次应用flexbox才能使其正常工作?

来自分类Dev

Yii2。为什么我需要上传文件两次才能生效?

来自分类Dev

为什么 UIButton 需要单击两次才能更改其图像

来自分类Dev

OrientDB-为什么ETL需要一些时间才能开始加载

来自分类Dev

为什么Kafka docker需要在Unix套接字上侦听

来自分类Dev

为什么要在“ a href”属性上单击两次以重新加载页面?

来自分类Dev

为什么要从matplotlib轴上删除补丁两次才能全部删除?

来自分类Dev

为什么我需要两次单击两次才能使用angular8和jquery触发onclick事件

来自分类Dev

为什么在两个模块上定义的拦截器会运行两次?

来自分类Dev

为什么我需要在Matlab中使用串行端口查询两次以获取正确的答复?

来自分类Dev

为什么我需要在Matlab中使用串行端口查询两次以获取正确的答复?

来自分类Dev

当我达到大小限制时,为什么需要在大小限制的MemoryCache上调用两次Set?

来自分类Dev

需要两次训练才能加载检查点(它起作用了,但是为什么?)

来自分类Dev

为什么我的终端需要两次按向上键才能向后移动历史记录?

来自分类Dev

C# 为什么 Console.ReadKey 需要两次击键才能在此代码中工作?

来自分类Dev

为什么我需要两次输入这个命令才能在 Typescript, Ionic 2 中工作?

来自分类Dev

为什么我需要点击 tabBarViewController 项目两次才能导航到不同的视图控制器 - iOS

来自分类Dev

为什么需要两次声明数据源/委托

来自分类Dev

Joomla后端需要两次登录?为什么?

Related 相关文章

  1. 1

    使用原始套接字时,为什么需要两次给出MAC地址?

  2. 2

    为什么需要两次安装Browserify才能捆绑

  3. 3

    为什么需要单击两次按钮才能工作

  4. 4

    为什么需要两次安装Browserify才能捆绑

  5. 5

    为什么我需要在按钮上单击两次以使事件发生?

  6. 6

    为什么我需要在 UITableView 中的单元格上点击两次才能显示警报

  7. 7

    套接字两次发送数据

  8. 8

    为什么需要在Matlab中两次调用rng()

  9. 9

    为什么binutils和gcc需要在LFS中安装两次?

  10. 10

    为什么“保存”按钮需要单击两次才能点击相关功能?

  11. 11

    为什么需要两次应用flexbox才能使其正常工作?

  12. 12

    Yii2。为什么我需要上传文件两次才能生效?

  13. 13

    为什么 UIButton 需要单击两次才能更改其图像

  14. 14

    OrientDB-为什么ETL需要一些时间才能开始加载

  15. 15

    为什么Kafka docker需要在Unix套接字上侦听

  16. 16

    为什么要在“ a href”属性上单击两次以重新加载页面?

  17. 17

    为什么要从matplotlib轴上删除补丁两次才能全部删除?

  18. 18

    为什么我需要两次单击两次才能使用angular8和jquery触发onclick事件

  19. 19

    为什么在两个模块上定义的拦截器会运行两次?

  20. 20

    为什么我需要在Matlab中使用串行端口查询两次以获取正确的答复?

  21. 21

    为什么我需要在Matlab中使用串行端口查询两次以获取正确的答复?

  22. 22

    当我达到大小限制时,为什么需要在大小限制的MemoryCache上调用两次Set?

  23. 23

    需要两次训练才能加载检查点(它起作用了,但是为什么?)

  24. 24

    为什么我的终端需要两次按向上键才能向后移动历史记录?

  25. 25

    C# 为什么 Console.ReadKey 需要两次击键才能在此代码中工作?

  26. 26

    为什么我需要两次输入这个命令才能在 Typescript, Ionic 2 中工作?

  27. 27

    为什么我需要点击 tabBarViewController 项目两次才能导航到不同的视图控制器 - iOS

  28. 28

    为什么需要两次声明数据源/委托

  29. 29

    Joomla后端需要两次登录?为什么?

热门标签

归档