2012-06-29 21 views
2

我正在嘗試編寫一個程序,使用C++通過Internet(或LAN)將基本文本文件從一臺計算機發送到另一臺計算機。我正在研究Winsock,但是我讀的所有內容似乎只是用於服務器和客戶端之間的通信。我不知道這是我正在嘗試做什麼,或者如果我正在看另一個問題。使用C++在計算機之間發送文件

編輯:感謝偉大的答案夥計。我有點不好意思選擇最好的一個。

+0

可能的[C++的P2P庫]重複(http://stackoverflow.com/questions/10982062/p2p-library-for-c) – HostileFork

+0

我認爲你的概念問題來自於套接字是一個接口,你需要一個協議在接口之上。 – starbolin

+0

該程序已經存在。看看'ftp'或'scp'。 –

回答

1

總之:是的,套接字是要走的路。

套接字意義上的「服務器」和「客戶端」是通用術語 - 系統在任何給定時間都運行着各種各樣的服務。例如,您的Web瀏覽器作爲HTTP客戶端運行(其中,HTTP是一個通過TCP/IP運行的基於文本的大多數同步協議); Windows文件共享和遠程桌面是其他系統連接到的「服務器」。

服務器和客戶端在套接字意義上的區別(真正在TCP/IP意義上)是「服務器」套接字偵聽來自遠程系統的傳入連接(請參閱MSDN或bind()上的手冊頁, (),accept()),而「客戶端」套接字創建到遠程系統(connect())的傳出連接。

請注意,套接字編程可能有點棘手。你描述的是一個很好的學習練習,但是如果你想盡快完成某些工作,你可以看看現有的工具,比如netcat。

0

它看起來就像是隻爲服務器和客戶端

那麼什麼之間的溝通?使一臺計算機(即即將接收文件)服務器。在該計算機上創建一個套接字並使其監聽端口上的連接。一旦連接到達,根據如此定義的結構得到數據(見下文)

發送者計算機(客戶端,類型)將連接到另一臺計算機,它知道IP地址和端口號。 (客戶端必須知道這兩者之間的連接)。一旦建立連接,它會將數據作爲字節序列發送到服務器。

結構

被連通這裏必須具有由已知和公認的良好限定的結構的兩個計算機。最簡單的結構將是:

|Length-Of-Data | Data ...... | 
<-- 4 bytes---> <-- n bytes--> 

從前4個字節中讀取n。這裏的4字節(n)表示數據的長度,可能與您的定義不同。

你可以爲文件名,文件類型等更多的「域」(取決於功能)..

0

如果你想通過互聯網發送文件,你必須使用的插座,或更好,但其他用套接字實現的高級庫。

在TCP套接字術語中,客戶端和服務器之間沒有太大的區別:通信是雙向的。唯一的區別是誰在監聽傳入連接(綁定,監聽,接受)以及誰在啓動連接(打開)。

您提到了Winsock,這意味着您正在使用Windows。看看Windows API,可能會發現一些處理文件傳輸的高級庫(如FTP或HTTP庫)。

也許不符合您的要求,但您也可以使用LAN的共享文件夾和Dropbox爲Internet同步的文件夾...然後使用標準IO。

0

一般來說,任何文件傳輸都需要某種服務器/客戶端連接。一臺計算機需要啓動連接,另一臺計算機需要監聽另一端的連接,然後採取第一臺計算機指示的操作。

雖然您當然可以使用套接字推出自己的客戶端和服務器軟件,但要根據您希望在哪種計算機之間傳輸文件,最好利用某些現有的客戶端/服務器協議。一些更受歡迎的可能性包括ssh,http或ftp。我認爲C/C++庫應該適用於所有這些協議。

沒有更多的信息我會傾向於使用SSH。安裝一個ssh服務器不應該太難,所以你只需要編寫客戶端軟件,我認爲有一些相當好的開源庫存在。編輯:libssh看起來很不錯!

1

客戶端 - 服務器架構應該可以很好地發送文件。 「服務器」就是最先啓動的程序,並等待其他客戶端連接到它。在那裏,兩者之間沒有太大的區別。在很多情況下,編寫代碼是最容易的,所以它會自動嘗試聯繫服務器,如果找不到服務器,它會將自己設置爲服務器。

另外請注意,通過互聯網(特別是)NAT路由器在互聯網上工作可以使代碼有點棘手。如果您預先配置防火牆以允許連接,那麼並不難,但除此之外,您通常最終會使用UPnP建立通過防火牆的連接。與沒有涉及NAT的本地工作相比,這可以輕鬆實現雙倍的工作。

相關問題