2012-02-05 150 views
0

我想使用UDP套接字來簡單地發送一個音頻流。我的問題是,我無法得到它的工作,我認爲它會更簡單,然後使用TCP IP。Udp套接字處理

我做什麼我DROP掉一個UDPSocket組件的窗體上,爲服務器的一部分,我用這個代碼

with udpServer do 
    begin 
    LocalHost := '127.0.0.1'; 
    LocalPort := '5002'; 
    Open(); 
    Active := True; 
    end; 

對於客戶端應用程序的:

with udpClient do 
     begin 
     RemoteHost := '192.0.168.100'; //my local address 
     RemotePort := '5002'; 
     Open(); 
     Active := True; 
     end; 

的問題是我不接收任何東西。我做錯了什麼我沒有任何第三方軟件可以阻止連接。

我沒有找到任何合適的例子來使用這個組件任何靈感來源將不勝感激。

+0

btw我使用Delphi 7進行這項任務 – opc0de 2012-02-05 13:05:18

+0

是否有你選擇UDP的原因,除了它感覺更簡單?對於廣播來說,TCP絕對是一個比UDP更好的解決方案,除非你有非常明確的需求。就套接字而言,Indy組件非常易於使用,並且有很多很好的示例。 – 2012-02-05 17:22:19

+0

@DanielChapman UDP速度更快,建議用於語音流,因爲它不要求丟失重新發送的數據包...... – opc0de 2012-02-05 17:28:09

回答

2

您有服務器和客戶端連接在相同的IP上。

通常,如果您將服務器應用程序IP地址設置爲0.0.0.0,它將綁定到給定端口上的任何可用IP地址,包括127.0.0.1。

然後客戶端必須連接到一個綁定的IP。相反,您的服務器正在偵聽127.0.0.1,客戶端連接到192.0.168.100。

不要被「LocalHost」屬性名稱所迷惑。這裏的「本地」意味着你必須設置一個「本地」IP,一個分配給本地機器的IP,而不是另一臺機器的「遠程」,而客戶端當然會連接到「遠程」IP,服務器的。

當且僅當您希望服務器僅適用於本地應用程序時,127.0.0.1是一個不錯的選擇,因爲該IP範圍僅限於同一臺計算機。如果您想讓它在機器外部可用,則必須將其綁定到有效的IP。

無論您遇到什麼問題,像WiresharkMicrosoft Network Monitor這樣的工具對於瞭解正在發生的事情都非常有用。

+0

我做了修改,以適應你已經回答不幸,它不起作用,我試着甚至在2臺機器上測試.... +1的努力謝謝。 – opc0de 2012-02-05 15:22:33

+2

「不工作」是一個非常普遍的問題:)你必須更好地解釋發生了什麼。例如,我建議的工具將向您顯示網絡級別實際發生的情況,但問題也可能出現在您的應用程序級別。連接是否正確發生?數據包是否被髮送?數據包是否收到?等等...... – 2012-02-05 17:34:39

1

您正在將服務器綁定到127.0.0.1,因此它只會接受連接到127.0.0.1的客戶端。您的客戶連接到192.0.168.100(也許你的意思是192.168.0.100?)。

您需要將服務器綁定到客戶端實際連接到的IP上,或者將其綁定到0.0.0.0以接受任何本地IP上的連接。

儘管UDP是無連接的,但同樣的規則同時適用於UDP和TCP,因爲它適用於它們共享的較低級IP路由層。

+0

感謝您的回覆,ldsandon也提出了同樣的問題,但不幸的是它不起作用。我仍然沒有收到任何東西... – opc0de 2012-02-05 22:24:50

+0

你沒有顯示任何你的閱讀或寫作代碼,所以每個人都必須猜測問題..請顯示其餘的UDP代碼。 – 2012-02-06 00:35:05