【问题标题】:Clarification on code代码说明
【发布时间】:2012-06-25 01:18:14
【问题描述】:

我正在查看代码,但我不确定它的功能。我查看了函数的文档,但是它们并没有做太多的正义。代码如下:

    private void m_InitUdpSock()
    {
        m_sockBroadcast = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
        m_sockBroadcast.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.Broadcast,1);

        m_localhost     = new IPEndPoint(IPAddress.Parse(m_localHostIP),BIND_PORT);
        m_remotehost    = new IPEndPoint(IPAddress.Broadcast,SCAN_PORT);

        m_sockBroadcast.Bind(m_localhost);
        m_sockBroadcast.BeginReceiveFrom(m_rxBuffer,0,m_rxBuffer.Length,SocketFlags.None,ref m_HostEp,new AsyncCallback(ReceiveBroadcastData),m_sockBroadcast);
    }

据我了解:此功能是设置一个套接字来广播 UDP 消息。它使用m_localhost 发送广播。 m_localhost 曾经是:

m_localhost     = new IPEndPoint(IPAddress.Any,BIND_PORT);

然后,我想select the Network Adapter我选择与之通信,所以我检索了我想使用的网络适配器的IP地址并将m_localhost更改为第一个示例。然后使用Bind函数,它应该使用特定的网络适配器,并使用端口BIND_PORT来监听响应消息。

我希望有人能确认我确实在使用我通过 localhost 的 IP 的网络适配器。

m_remotehost 只是一个IPEndPoint,它将保存响应数据包的 IP 地址,端口SCAN_PORT 是传出广播端口。

SCAN_PORT 和 BIND_PORT 有来自以前开发者的 cmets;但是我不知道它们是否准确。 m_remotehost 是否指定了它应该用来与我通信的端口? (对我来说这听起来像是不好的做法)

SCAN_PORT  // Outgoing broadcast port.
BIND_PORT  // Incoming response listen port.

接下来,在BeginReceiveFrom 中,大部分文档都很清楚,但是之前的开发人员使用的参数“ref HostEp”让我失望,因为它被声明为:

m_HostEp = new IPEndPoint(IPAddress.Any,0);

所以当我拨打BeginReceiveFrom 时,它仍然使用任何本地IP 地址来广播消息,这不是我想要的吗? m_HostEp 也用于调用EndReceiveFrom(iar,ref m_HostEp)。

我正在寻求澄清:
1.BIND_PORT和SCAN_PORT
2.m_HostEp是什么用法,对我的交流有什么影响?

如果您需要任何澄清,请询问!

提前致谢。

【问题讨论】:

    标签: c# network-programming ip-address network-protocols


    【解决方案1】:

    查看代码 sn-p,m_remotehost 未使用,因此您无法从中确定SCAN_PORT 的含义,但显然广播消息可以在与接收传入消息的端口不同的端口上发送.

    • BIND_PORT 是您将接收消息的端口。
    • m_HostEp 将包含您收到的消息的发件人的EndPoint。

    在学习套接字时,我阅读了http://tangentsoft.net/wskfaq/,如果您想了解更多关于“幕后”的信息,因为广播网络可能会很棘手,所以它是一个很好的参考。不过,它并不是专门针对 c# 的。

    【讨论】:

    • m_remotehost 在这里使用:m_sockBroadcast.SendTo(yCmdScan, m_remotehost); 有帮助吗?
    • SCAN_PORT 应该是广播消息发送到的端口。
    • 你是对的!我试过了,起初我遇到了一个错误,但我增加了缓冲区大小,我收到了完美的东西。只是好奇,有没有办法将数据包发送到端口,并确定我尝试广播的端口是否无法打开。如果它是打开的,我将能够告诉我的用户它正在使用中。
    • 只有当你尝试绑定(监听)一个已经在使用的端口时,你才会得到一个异常(所以如果 BIND_PORT 已经在使用,m_sockBroadcast.Bind(m_localhost); 将会失败)。
    猜你喜欢
    • 2013-09-12
    • 2017-01-23
    • 2014-09-21
    • 2016-06-01
    • 2015-01-13
    • 2015-08-16
    • 2010-11-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多