2010-09-01 83 views
1

我想在C#中創建應用客戶端服務器,但不僅在局域網中。在這裏很容易:TcpListener,TcpClient等通過廣域網進行通信

我想在這個例如 在我的計算機上是等待連接的服務器。 另一個網絡中的某個人有客戶端。他開始連接,但是......在哪裏......什麼是服務器的IP? 他只看到路由器的ip。

任何想法? :)

編輯

大問題,也是雙NAT

回答

1

你仍然使用相同的TcpListener和TcpClient的(如果你想它是低電平)。

通過WAN進行通信的技術與通過LAN進行通信的技術相同。困難的部分是讓客戶端和服務器之間的網絡允許您使用必要的端口和協議。

+0

是的,這是真的,但這是怎麼回事? :) – Saint 2010-09-01 19:06:29

+0

@Saint_pl - 您必須與網絡管理員交談,或者如果您位於家庭網絡中,請了解如何配置網絡硬件以不阻止流量並轉發您要使用的端口的流量。 – 2010-09-01 19:31:30

+0

不,我知道如何在我的路由器上轉發端口,但問題不在這裏。請看下面我和'Mark H'的兩個答案,以瞭解我的意思。 – Saint 2010-09-01 20:46:04

1

你的問題並不能解釋整個情況..但是,隨着我對問題的理解,我可以提出以下答案: 根據目標客戶羣的位置(支持企業網絡或NOT),可以使用各種路由選項,如UPnP,STUNTIPv6或其他一些NAT遍歷選項,以便您可以通知客戶端監聽程序在哪裏。應始終有一箇中央註冊服務器,Listener會通知它的位置以及在其環境中允許的通信模式。 XMPP服務器的使用對於這些目的來說是一個簡單的選擇,它可以解決大多數此類問題。一旦客戶端從發現服務器查詢偵聽器的位置,它就可以直接連接到偵聽器。

+0

非常感謝您的回答。我之前沒有聽說過這件事。 NAT穿越是個好主意,但現在我遇到了問題,因爲我支持兩臺路由器 - 「雙重NAT」。我嘗試使用這個UPnP庫,但它不工作:)我仍然在嘗試。 但它讓我想到:爲什麼你說這應該是一箇中央註冊表服務器......如果服務器不動,那當然沒有必要,對吧?客戶可以直接發送數據到服務器? – Saint 2010-09-02 11:03:07

+0

如果有外部DMZ'd註冊服務器的選項,並且您計劃使用TCP(雙工),請嘗試通過服務器進行隧道傳輸(如果UPnP失敗)。這種方法在服務器端可能會佔用很少的帶寬,但這是一個有保證的選項。 – Bhuvan 2010-09-05 00:59:08

+0

是的,我在考慮調諧,但在服務器上有外部IP是有點不可能的。雙NAT不依賴於我。是否可以通過雙重NAT對我的應用程序服務器進行調優? – Saint 2010-09-09 14:30:19

0

聽起來就像你只是想在你的路由器上設置端口轉發。在客戶端連接的特定端口上建立傳入連接時,路由器應將連接重定向到您在LAN上指定的計算機。 (通常是一個像192.168.x.x的IP)。這也應該是您的TcpListener正在偵聽連接的IP地址。

如果您需要幫助爲特定路由器設置它,您可以嘗試portforward.com

+0

是的,端口轉發它的解決方案,但我不確定在這種情況下。我可能會解釋更多。 在我的comp是等待連接的服務器,但他不時想要發送一些信息給客戶端。客戶失控,例如在其他城市。我怎樣才能在不改變路由器的情況下向他發送這個數據包? – Saint 2010-09-01 19:07:03

+0

只有先連接到客戶端,才能向客戶端發送任何內容。建立連接並接受它後(使用'tcpListener.AcceptTcpClient'或'.AcceptSocket'),使用接受的套接字發送數據。 – 2010-09-01 19:54:28

+0

嗯,但他的路由器呢? 我會有他的IP(btw外部或內部?)和端口,但例如它將是端口號7001.而他的路由器不接受連接在這個端口 - 對嗎?(因爲什麼?默認這個端口它可能關閉) 該怎麼辦? – Saint 2010-09-01 20:42:09