簡體   English   中英

Java與C ++套接字通信/來自Java套接字通信,DataInputStream和eof,二進制,加密

[英]Java to/from C++ socket communication, DataInputStream and eof, binary, encryption

我正在嘗試讓Java服務器和C ++客戶端在以下條件下通過TCP進行通信:文本模式和二進制/加密模式。 我的問題是結束於DataInputStream的read(byte [])用於以-1返回的流結束的eof指示器。 如果我發送二進制數據,如何防止隨機字節序列發生代表eof並錯誤地指示read()流即將結束? 看來我僅限於文字模式。 我可以忍受,直到需要擴展為止,但是接下來的問題是我要加密文本並添加消息身份驗證。 即使我是從另一個Java程序(而不是C ++)發送的,使用AES + MAC加密字符串也會產生二進制輸出,而不是正常的字符串。 如何防止某些加密序列包含與eof相同的部分? 那么,這里有什么解決方案?

如果我發送二進制數據,如何防止隨機字節序列發生代表eof並錯誤地指示read()流即將結束?

在大多數情況下(包括TCP / IP和類似的網絡協議),EOF沒有特定的數據表示形式。 相反,EOF是一種邏輯抽象,表示您已到達數據流的末尾。 例如,使用套接字意味着套接字的輸入端已關閉,並且您已讀取所有未完成的字節。 (對於文件,這意味着您已讀取文件的最后字節。)

由於(邏輯)EOF沒有數據表示,因此您不必擔心會收到錯誤的EOF。 簡而言之,這里沒有要解決的問題。

TCP中的“流結束”通常通過關閉套接字來發出信號- 就是使流實際結束的原因。 如果您真的不希望流結束 ,而只是信號“包”的結束(很有可能在同一連接上的其他包后面),則可以使用未加密的長度指示符開始每個包(例如2或4個字節,具體取決於您的需要)。 根據其文檔, DataInputStream僅適用於接收由DataOutputStream發送的流,這似乎與您描述的用例無關。

通常,在使用tcp流時,您會具有數據頭格式,該格式至少具有一個字段,該字段保存期望的數據長度,以便接收器確切知道期望的字節數。 一個簡單的例子是TLV格式。

正如Thomas Pornin對Aelx Martelli的答復,DataInputStream甚至用於非DataOutputStream或Java發送的數據。 我的問題是,正如文檔所述,結果是DataInputStream的read()在流結束時返回的結果,也就是說,是否存在某些字節序列,read()將該字節解釋為流結束,因此,如果我正在發送的數據中是否有發生這種可能性,就像我發送通用二進制數據一樣?

我的問題是結束於DataInputStream的read(byte [])用於以-1返回的流結束的eof指示器。

不,不是。 這個問題是虛構的。 -1是InputStream.read()的返回碼,指示對等方已關閉連接。 它與通過連接發送的數據無關。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM