2011-08-18 66 views
5

我意識到這個問題是類似的tosomeothers,但我想我的情況是足夠不同的,以保證自己的問題(希望)。在C#中建立P2P連接

什麼我打算上部署另一個人的計算機上的程序將打開我的電腦連接之後,我假設,計算機應該能夠相互通信。一旦程序啓動後,它應該能夠將地址信息和端口(如果它們未被阻止)創建連接,對吧?

更重要的是,我住在宿舍的上網本配置,每間客房都分配一個唯一的端口,並通過DHCP服務器分配一個靜態IP地址。我如何將這個因素考慮進我的程序的設計中?

我在想,這個設置並不需要一臺服務器作爲中間接入點,因爲我的詳細地址將始終保持不變,主機可以直接連接到我的電腦沒有進一步的信息。它是否正確?

最後,我正在閱讀一些關於創建連接的頁面,但是它與TcpConnection,WCF,CORBA等的所有可能性混淆在一起。對於我來說,哪一個實際上是最簡單的假設我只想要發送消息到其他機器?

更新:

的地址是在這個意義上,它不會改變靜態的。我的IP地址的形式130.83.20.xxx的,我可以等待DHCP服務器分配我這個地址,或者我可以使用靜態IP配置手動輸入自己。

至於消息本身,簡單的文本消息就足以開始。前面提到的端口是交換機端口,我相信在網絡編程期間不會起作用。

+0

爲了指導您,我們需要更多地瞭解您的目標。根據你需要發送的數據的性質,TcpConnection可能是不錯的,但是也許一個簡單的WCF服務會更好。我不明白當你說每個房間都分配了一個端口和靜態IP時,你的意思是......你的意思是物理端口,如果是這樣,在網絡編程期間不起作用。然而,TCP/UDP端口非常重要。你需要什麼端口可供你使用。 – Nate

+0

@Nate:謝謝你的擡頭。就目前而言,我只想在朋友的電腦上測試這個程序,並且我認爲簡單的文本消息,比如「你好,你好嗎?」應該沒事。那麼,例如我的IP地址是130.83.20.103或類似的東西。它不會改變。 DHCP服務器分配給我這個地址,或者我可以手動輸入它。每個房間都有一個可以被中央IT管理部門阻止的端口。這些是我相信的交換機端口。 – IAE

+0

如果DHCP服務器可以爲您分配一個IP地址「130.83.20.103」,那麼您不需要手動配置自己擁有該IP地址。如果你這樣做了,並且DHCP服務器將該地址分配給其他人,那麼你將最終產生IP地址衝突,並且實際上對於由DHCP服務器給出該IP地址的惡意吸食者實施拒絕服務攻擊。 – Justin

回答

5

我會去與TcpClientTcpListener。查看MSDN上的示例代碼,將其複製並粘貼到兩個C#控制檯項目中並構建它們。

我會使用127.0.0.1(localhost)在端口5001(一個常用的測試端口)上進行測試。

TcpListener server = new TcpListener(IPAddress.Parse("127.0.0.1"), 5001); 

然後,你應該能夠測試一個簡單的客戶端/服務器只在你的電腦上運行。一旦你得到了這個工作,你可以把客戶帶到你宿舍的另一臺電腦上,並確保它仍然有效。一旦有效,你可以去當地的一家咖啡店,並帶着你的客戶。讓服務器在宿舍中的已知IP地址上運行。在這種情況下,請將服務器綁定到您的實際外部IP(不是本地主機)。您可以通過只指定端口到的TcpListener構造做到這一點:`

TcpListener server = new TcpListener(5001); 

一旦你自己或與朋友所有的工作,然後把它的外部。最好在將演示文稿發送給您的客戶並讓他與您排除故障之前,先將這些內容用於演示。 :)我的答案背後

推理:

簡單TCP客戶機/服務器是非常簡單的,並且允許在兩臺計算機之間一個簡單的聊天程序。然後你可以加強它發送你想要的任何數據流。您可以像這樣添加代碼以訪問StreamWriter:

NetworkStream stream = client.GetStream(); 
StreamWriter writer = new StreamWriter(stream); 
+1

是否有限制傳輸大文件? – whihathac

+0

不是。您只需在您的服務器和客戶端類中實現上傳/下載方法,並在這些方法中將數據塊傳輸到文件。所以你不要一次發送所有的數據。一次發送1K左右。如果您想要實現確認,數據完整性驗證等,您可以將自己納入協議設計。但在基本級別,您只需從網絡流中讀取數據並寫入文件流,反之亦然。沒有限制(除了可能是文件流的限制,例如FAT32文件系統的4GB文件大小限制)。 – mattypiper