2014-07-21 77 views
1

我有一個用C語言編寫的簡單應用程序和一個使用node/expressjs構建的網站。 C程序位於一臺單獨的計算機上並在不同的網絡上運行。從網站發送文件到C應用程序

目前沒有網絡功能,但我想C程序要做的是不斷從網站接收文件。它將打開一個阻塞的TCP套接字,並且每當接收到一個文件時,它就會適當地作出響應並處理該文件。 C程序不主動請求任何東西;它只是等待。網站(網站 - 用戶)負責通過表單提交的方式啓動文件傳輸。雙方通過IP地址和端口連接。

我該如何去建立這種溝通?我研究了libcurl以及FTP和SFTP協議,但我認爲它們對於這項任務來說是過度/不合適的。原始TCP套接字可以工作嗎?順便說一下,涉及的文件是圖像文件。

回答

0

原始的TCP套接字可以工作,但我不知道這是你想使用的。它涉及到很多低級別的設置。您的客戶端應用程序的行爲更像一臺服務器。首先,它將不得不使用監聽套接字。這將要求運行該應用程序的客戶端成爲DMZ主機或爲偵聽端口設置端口轉發。如果你想學習如何打開一個監聽套接字,here is a good example,這是我從製作服務器時獲悉的。除了我不確定它爲什麼使用char緩衝區......我認爲uint8_t更具可移植性,所以我使用它。其次,你需要建立自己的系統來包裝你發送的數據。正如您所知,TCP數據在您撥打read時會以連續流的形式呈現,因此您需要確保您的網站在每個文件之前發送大小標題,以便您的應用程序知道何時停止閱讀。在前4個字節中發送標題將允許您發送最大4GiB文件(調整所需的最大文件大小),但是如果您需要發送任意大小的文件並且不擔心惡意連接,請使用variable-length quantity頭。第三,它需要跟蹤你在read函數中使用的緩衝區中有多少數據可用,並且你需要保留一個單獨的指針(我們稱之爲r_ptr)爲讀緩衝區的索引read應該寫入。在處理讀緩衝區中的數據後,需要將緩衝區中的其餘數據向下移至零索引,然後將r_ptr設置爲該數據的最後一個字節後的字節。下一次您的程序想要讀取數據時,如果緩衝區中的剩餘數據不足,應該只調用read,並且應該將傳入數據寫入剩餘數據後的空間。否則,它可能會丟失傳入的數據。考慮這種情況:您的程序等待32個字節到達,但在上次調用read時接收到額外的16個字節,並且這些字節現在位於緩衝區中的某個位置,並且不會再以read接收。最後,如果您希望您的程序一次接受多個連接,則可能需要在各自的線程中處理每個客戶端。這是最簡單的方法,但我不知道它是否最有效。

+0

手動TCP套接字似乎是最直接的方法。我不知道我的任務的性質是常規的還是非正統的,所以很高興知道它在原始套接字編程中是可行的。非常有幫助和精心製作的帖子,謝謝! – Matt

+0

是的,讓圖書館爲你做所有的原始套接字編程會容易得多;) – sudo

相關問題