2016-03-09 240 views
1

我可以發送一個udp消息到特定的網址和端口(成功),但我無法收到我可以在Wireshark上看到的響應消息!接收udp消息丟失

這是我使用的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:[email protected] | (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 DECT電話

我需要發送SIP消息到WiFi DECT(我已經實現)

電話發回一個SIP消息到192.168.1.61:5060。 SIP流量是這樣的:

[隨機端口] - 消息 - > [5060]

[5060] < - 200 OK - [5060]

所以,PC作爲udp客戶端連接到dect併發送消息,dect向PC的5060端口發回200 OK sip消息。我在收到200 OK消息時遇到問題!

NEWS:當我停止pbx服務器的服務時,我可以得到結果(200 OK);否則,我無法收到任何SIP消息...

回答

0

UDP協議不能像那樣工作。這只是單向的。它沒有驗證聆聽方是否準備好接收,它沒有給出關於成功傳送數據的任何響應。

如果您需要反饋,請嘗試使用TCP。

+0

什麼是「udpClient.Receive」? –

+0

用於接收發件人的數據。如果你的服務器和客戶端都在控制之下,你可以/必須自己寫回應。 – Johan

+0

正如您可以在wireshark日誌中看到的那樣,udp有一條響應消息。 –

0

當您創建您的UDP套接字時,您可以將其綁定到任何可用的本地端口,並將其連接到IP ipaddr和端口5060的遠程服務器。所以當你通過這個套接字發送一些東西時,它會到達服務器。

但是,此套接字將不會看到服務器的SIP回覆。服務器將發送SIP回覆消息到5060(或加密的SIP 5061)。但是你不在聽這部分(事實上,沒有人是這樣的,所以內核只會丟棄這個數據報)。爲了正確接收這些消息,您還需要將本地udp套接字綁定到SIP端口。

+0

如何將udpClient綁定到sip端口? 我試過 'udpClient.Client.Bind(RemoteIpEndPoint);' 但這給了我一個錯誤 '提供的參數無效' –

+0

您無法綁定到遠程ip。您需要綁定到本地IP。 – SergeyA

+0

現在我得到'通常只允許使用每個套接字地址(協議/網絡地址/端口)'您能發送一個示例代碼或鏈接嗎? –