【问题标题】:receiving udp message is missing接收 udp 消息丢失
【发布时间】:2016-03-09 11:12:23
【问题描述】:

我可以向特定的 url 和端口发送 udp 消息(成功),但我无法收到在 Wireshark 上可以看到的响应消息!

这是我用于 udp 连接的代码:

Byte[] sendBytes = Encoding.ASCII.GetBytes(sipMessage);
String responseData = String.Empty;
IPEndPoint RemoteIpEndPoint = new IPEndPoint(IPAddress.Any, 0);

try
{
    using (UdpClient udpClient = new UdpClient(ipaddr, 5060))
    {
        udpClient.Client.ReceiveTimeout = 1000;
        udpClient.Send(sendBytes, sendBytes.Length);
        Byte[] receiveBytes = udpClient.Receive(ref RemoteIpEndPoint);
        responseData = Encoding.ASCII.GetString(receiveBytes);
    }
}
catch (Exception ex)
{
    responseData = ex.Message;
}

如果我不设置超时,线程会继续工作。

响应消息是:

连接尝试失败,因为连接方没有 一段时间后正确响应,或建立连接 失败,因为连接的主机没有响应

wireshark 的结果如下:

+-----+-----------+--------------+--------------+----------+--------+--------------------------------------------------------+
| No. |   Time    |    Source    | Destination  | Protocol | Length |                          Info                          |
+-----+-----------+--------------+--------------+----------+--------+--------------------------------------------------------+
| 465 | 33.378167 | 192.168.1.61 | 192.168.1.63 | SIP      |    289 | Request: MESSAGE sip:1001@192.168.1.61 |  (text/plain) |
| 469 | 33.817460 | 192.168.1.63 | 192.168.1.61 | SIP      |    254 | Status: 200 OK |                                       |
+-----+-----------+--------------+--------------+----------+--------+--------------------------------------------------------+

附录: 192.168.1.61 是托管网页的计算机,192.168.1.63 是 wifi 检测电话

我需要向 wifi 设备发送 sip 消息(我已经实现了)

电话向 192.168.1.61:5060 发回一条 sip 消息。 SIP流程是这样的:

[随机端口] -- 消息 --> [5060]

[5060]

所以,pc 作为 udp 客户端连接到 dect 并发送消息,dect 将 200 OK sip 消息发送回 pc 的 5060 端口。我在接收 200 OK 消息时遇到问题!

新闻: 当我停止 pbx 服务器的服务时,我可以得到结果(200 OK);否则,我将无法收到任何 sip 消息...

【问题讨论】:

    标签: c# sockets udp sip


    【解决方案1】:

    UDP 协议不是这样工作的。这只是一种方式。它不会验证侦听方是否已准备好接收,也不会对数据的成功传递做出任何响应。

    如果您需要反馈,请尝试使用 TCP。

    【讨论】:

    • 什么是“udpClient.Receive”?
    • 用于从发送方接收数据。如果您同时控制服务器和客户端,则可以/必须自己编写响应。
    • 正如您在wireshark日志中看到的,有一条来自udp的响应消息。
    • 我建议您设置第二个客户端,这样您就有一个用于发送和一个用于收听。
    • 已经尝试过同样的结果UdpClient udpSender = new UdpClient(); UdpClient udpReceiver = new UdpClient(); udpReceiver.Client.ReceiveTimeout = 1000; udpSender.Connect(ipaddr, 5060); udpReceiver.Client.Bind(RemoteIpEndPoint); udpSender.Send(sendBytes, sendBytes.Length); Byte[] receiveBytes = udpReceiver.Receive(ref RemoteIpEndPoint); responseData = Encoding.ASCII.GetString(receiveBytes); udpSender.Close(); udpReceiver.Close();
    【解决方案2】:

    当您像 new UdpClient(ipaddr, 5060) 这样创建您的 UDP 套接字时,您将其绑定到任何可用的本地端口,并将其连接到 IP 为 ipaddr 和端口 5060 的远程服务器。因此,当您通过此套接字发送内容时,它会到达服务器。

    但是,此套接字不会看到来自服务器的 SIP 回复。服务器将发送 SIP 回复消息到 5060(或 5061 用于加密 SIP)。但是你没有在这部分听(事实上,没有人在听,所以内核只是丢弃了这个数据报)。要正确接收这些消息,您还需要将本地 udp 套接字绑定到 SIP 端口。

    【讨论】:

    • 如何将 udpClient 绑定到 sip 端口?我试过这个udpClient.Client.Bind(RemoteIpEndPoint); 但这给了我一个错误An invalid argument was supplied
    • 无法绑定远程ip。需要绑定本地ip。
    • 现在我得到Only one usage of each socket address (protocol/network address/port) is normally permitted 你能发一个示例代码或链接吗?
    • 这意味着您正在尝试将其中两个绑定到同一个地址。您需要真正阅读书籍并研究 UdpClient 的用法。
    猜你喜欢
    • 2015-03-08
    • 1970-01-01
    • 2018-04-02
    • 1970-01-01
    • 2020-03-24
    • 2016-05-09
    • 1970-01-01
    • 1970-01-01
    • 2020-12-18
    相关资源
    最近更新 更多